貼子太旧好象看不見,重貼一下
Win32汇编写FlappyBird
FlappyBird未完成版,尚欠碰撞测试,拿金币,计分,生命,
GameOver,音乐,音效,关卡设计等等,完成度20%
材料:-
1.masm32版,网上自找,最好用 \MASM32 作为文件夹
2.FlappyBird背景图,文字图,柱子及小鸟图,网上抓
3.Photoshop任何版本,把背景图裁剪为游戏窗口的1/4大小
若游戏窗口是800x400,背景图做成200x400,(见压缩包里的4back.bmp)
注意左右拼合起来时,不要看见接驳痕迹.
把抓回来的小鸟褪去背景色,改为全黑背景(透明色),
利用旋转另制作七个小鸟的方向图,分别为
右,右下,下,左下,左,左上,上,右上
合拼八图,增加版面,把flappybird横牌和上下柱子合成一图
(见压缩包里的birdAA.bmp)
记录每一个图像在合拼图的位置和宽长(参看代码中的birdA_offset)
原理:-
1.这种横向2D游戏通常同时有背景卷动和主角移动,我们设定了一个55ms的计时器
invoke SetTimer,NULL,NULL,55,addr _ProcTimer
即是说, 每55ms(1/18秒)系统会呼叫 _ProcTimer 一次,大部份工作都在这程序完成.
2.读取背景图,4个背景图合成一张游戏窗口背景图,
invoke LoadBitmap,hInstance,100 其中100是背景图编号,由rsrc.rc指定
为什么要合拼而不完整一张呢?原因是bmp挺大,一个大bmp随时1m以上,
若改为jpg需额外代码处理,不如bmp方便
用BitBlt函数连续做12(4x3)次合拼,做了一张3个窗口大小的背景暂存(memDC2)
我们叫它1号窗口,2号窗口和3号窗口
另外建立一个窗口大小的显示暂存(memDC3)
设定一个卷动变数var1,每1/18秒轮到_ProcTimer运行时,var1+5
1,2号窗口是一张1600宽的暂存图(memDC2的1和2),每次显示时,
由x=var1,y=0的位置开始搬(memDC2)800x400的资料出来放显示暂存(memDC3)
再把小鸟动作,柱子,金币或各种物件依位置放在显示暂存(memDC3)
最后刷新屏幕时由显示暂存(memDC3)一次置入当前窗口中,
由于var1不断增加,x不断变动,这样就会做成背景卷动和主角移动的效果
当var1累加到达800,视界也到达第2号窗口,这时var1置0,
2号窗口资料搬到1号窗口,3号窗的原始背景移到2号窗口,重新绘上柱子或其他物件
这样,柱子和新物件就源源不断由右方卷出来
3.原代码中有详细注解,在这里也不再多说了,若有不明白地方欢迎提出,
更欢迎指出不足之处,毕竟俺也少写这类程式,错漏难免....
4注意:这只是一个范例程式,若你需要其他功能或加入或删减任何代码,
请随便,但不能要求作者为你订制特定的功能或,根据功课要求而改变这
个子程序改变那个子程序,若是代码错误或优化代码的意见,
则欢迎提出:)
源码:
ht
tps:/
/git.oschina.n
et/zhishi/asm_for_all/blob/master/example/x86/win32/fbird.asm
压缩包,有源码,资源档,图档和make.bat
运行make.bat即可完成编译
Win32汇编写FlappyBird
FlappyBird未完成版,尚欠碰撞测试,拿金币,计分,生命,
GameOver,音乐,音效,关卡设计等等,完成度20%
材料:-
1.masm32版,网上自找,最好用 \MASM32 作为文件夹
2.FlappyBird背景图,文字图,柱子及小鸟图,网上抓
3.Photoshop任何版本,把背景图裁剪为游戏窗口的1/4大小
若游戏窗口是800x400,背景图做成200x400,(见压缩包里的4back.bmp)
注意左右拼合起来时,不要看见接驳痕迹.
把抓回来的小鸟褪去背景色,改为全黑背景(透明色),
利用旋转另制作七个小鸟的方向图,分别为
右,右下,下,左下,左,左上,上,右上
合拼八图,增加版面,把flappybird横牌和上下柱子合成一图
(见压缩包里的birdAA.bmp)
记录每一个图像在合拼图的位置和宽长(参看代码中的birdA_offset)
原理:-
1.这种横向2D游戏通常同时有背景卷动和主角移动,我们设定了一个55ms的计时器
invoke SetTimer,NULL,NULL,55,addr _ProcTimer
即是说, 每55ms(1/18秒)系统会呼叫 _ProcTimer 一次,大部份工作都在这程序完成.
2.读取背景图,4个背景图合成一张游戏窗口背景图,
invoke LoadBitmap,hInstance,100 其中100是背景图编号,由rsrc.rc指定
为什么要合拼而不完整一张呢?原因是bmp挺大,一个大bmp随时1m以上,
若改为jpg需额外代码处理,不如bmp方便
用BitBlt函数连续做12(4x3)次合拼,做了一张3个窗口大小的背景暂存(memDC2)
我们叫它1号窗口,2号窗口和3号窗口
另外建立一个窗口大小的显示暂存(memDC3)
设定一个卷动变数var1,每1/18秒轮到_ProcTimer运行时,var1+5
1,2号窗口是一张1600宽的暂存图(memDC2的1和2),每次显示时,
由x=var1,y=0的位置开始搬(memDC2)800x400的资料出来放显示暂存(memDC3)
再把小鸟动作,柱子,金币或各种物件依位置放在显示暂存(memDC3)
最后刷新屏幕时由显示暂存(memDC3)一次置入当前窗口中,
由于var1不断增加,x不断变动,这样就会做成背景卷动和主角移动的效果
当var1累加到达800,视界也到达第2号窗口,这时var1置0,
2号窗口资料搬到1号窗口,3号窗的原始背景移到2号窗口,重新绘上柱子或其他物件
这样,柱子和新物件就源源不断由右方卷出来
3.原代码中有详细注解,在这里也不再多说了,若有不明白地方欢迎提出,
更欢迎指出不足之处,毕竟俺也少写这类程式,错漏难免....
4注意:这只是一个范例程式,若你需要其他功能或加入或删减任何代码,
请随便,但不能要求作者为你订制特定的功能或,根据功课要求而改变这
个子程序改变那个子程序,若是代码错误或优化代码的意见,
则欢迎提出:)
源码:
ht



压缩包,有源码,资源档,图档和make.bat
运行make.bat即可完成编译