一个小女生的LUA游戏开发日志(1)人物行走



掌叔
2009-01-19 10:35:31

摘自:[url]http://371397938.qzone.qq.com/[/url]
作者:×ㄨ┆花苼糖

哎~~~心情不太好,效率低了点!不过也得记录下来。
先来看看新写的函数:
[code=lua]
1.function my.loadimg(filename)
local file=io.open(filename,"r")
return file:read("*a")
end
EG.
img=my.loading("walk1.png")
[/code]
功能:读出指定文件所有行并返回。

啥,感觉没什么用。确实呵 没多大用处不过还是先看看下个函数吧!
[code=lua]
2.function my.print(x,y,imgdate)
local img=Image.loadFromMemory(imgdate)
screen:blit(x,y,img)
end
EG.
my.print(50,50,img)
[/code]
我来解释解释吧:上面的意思是 在x=50 y=50的地方显示img这存放图片数据的变量。
和screen:blit()函数功能雷同,不过区别就在于,screen:blit()显示的图片必须用Image.load加载,笔者对这个方法加载PNG图片发现其内存占用率比文件大5-8倍 -_-!
而使用Image.loadFromMemory()函数加载,只需要文件大小相当的内存就可以胜任啦!这样我们可以大量的显示图片咯,嘿嘿~笔者用这个方法成功的加载了资源图片221张 只用了3M内存^_^

当然它也是有缺点的,因为每次显示图片的时候需要从内存里加载。每次显示都需要,不过欣慰的是每次显示完以后就会自动移除掉。适合那些一次性显示的图片。
下面是screen:blit 与my.print 两个函数的CPU时间比较
[quote]
use (Image.load) load 480X272 dpi
cputime:0.38113299999986
use (screen:blit) show 480X272 dpi
cputime:0.0060589999998228

open image file
cputime:0.00064000000020314
Read all 480X272 Image date
cputime:0.21763600000031
use (Image.loadFromMemory) load 480X272 dpi
cputime::0.18518100000028
[/quote]
测试这比数据的时候真还是吓到了,screen:blit 的显示速度居然可以是0.006秒..(222MHZ情况下)
我们来算一下用
screen:blit显示一个图片需要 0.381+0.006=0.387秒 需要较多内存
my.print显示一个图片需要 打开文件忽略不计 0.217+0.185=0.4秒 需要较小内存
怎么用就自己决定咯!

这两函数是主角。当然需要用到游戏里咯。今天我为自己的人物做了个行走动作
因为人物的动作不止一个 所以考虑了很多情况数据扩充比较多 下面是真个player.lua内容
[code=lua]
player={}
player.x=0 --玩家X坐标
player.y=0 --玩家y坐标
player.LR=0 --判定左右 0:左 1右
player.FPS=0 --总控制帧
player.walk={} --行走
player.walk.FPS=1 --walk帧编号
player.stand={} --站立
player.stand.FPS=1 --stand帧编号
player.actionnum=1 --动作编号
player.mytimer=Timer.new()
player.stand.img={}
player.walk.img={
my.loadimg("img/player/walk/walk0.png"),
my.loadimg("img/player/walk/walk1.png"),
my.loadimg("img/player/walk/walk2.png"),
my.loadimg("img/player/walk/walk3.png"),
}


function player.walk.begin()
if player.walk.FPS+player.FPS > 4 then player.walk.FPS=0 end
player.walk.FPS=player.walk.FPS+player.FPS
if player.LR==0 then my.print(player.x,player.y,player.walk.img[player.walk.FPS]) end
if player.LR==1 then my.print(player.x,player.y,player.walk.img[player.walk.FPS]) end
end

function player.stand.begin()
end
function player.begin()
player.mytimer:start()
if pad:left() then player.LR=0 player.actionnum=1 end
if pad:right() then player.LR=1 player.actionnum=1 end
if player.LR==0 then
if player.actionnum==1 then player.walk.begin() end
if player.actionnum==2 then my.print(player.x,player.y,player.stand.img[player.stand.FPS+player.FPS]) end
end


if player.LR==1 then
if player.actionnum==1 then player.walk.begin() end
if player.actionnum==2 then my.print(player.x,player.y,player.stand.img[player.stand.FPS+player.FPS]) end
end

if player.mytimer:time() >= 180 then
player.FPS=1
player.mytimer:reset(0)
else player.FPS=0
end
end
[/code]
这样在主脚本里调用 player.stand.begin() 人物就知道动啦。要走起来也很简单 只需要改变player.x的值就OK~今天就先不做下去了。明天嘛!HOHO~~~看看这个走路的小人吧- -

[attach]627[/attach]

完毕,晚上还要继续啊~~
我给我自己加油~加油加油!!!!