http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2020-11-4 20:45:00
博文_面向对象仿写谷歌小恐龙游戏
自机房装上谷歌浏览器后,学生总是喜欢偷偷玩小恐龙,前几周被迫将谷歌浏览器藏起来了,厉害的学生还是能找到,看样子得忍痛彻底卸载掉谷歌浏览器才行,上周有学生抱怨没有了谷歌,我开玩笑说我带你们做一个小恐龙。

上周六开始动手写,翻出以前的飞机大战代码,看了一遍,再结合积累的一些经验,开始挺顺利的,陆陆续续写了三天,到周一,首版出来了,移动的灌木,跑动的小恐龙,完美的得分记录显示,美中不足的是,恐龙跳跃没有谷歌恐龙的顺畅,严重的是按住键盘键位不松的话,居然可以悬停在窗口顶部,还有原版的谷歌小恐龙,当按下向下方向键时,小恐龙变成爬行奔跑状,想着这是个小问题,结果...

折腾了一天一夜,一堆bug出现了,还是没有解决问题,看来思路有问题

决定先缓缓,一是抽空小结了再次看到飞机大战代码的认识(写了上篇博文,写写博文挺好,开思路),仿照其写法,整理了下逻辑关系,结果出现新情况,测试时一堆报错,对比飞机大战,其场景中speed速度基本是固定的,只需要简单继承,而恐龙游戏背景、灌木、飞鸟的速度是要变化的,随着得分的变化速度要越来越快的,继承父类的speed导致bug出现,按这个思路,去掉了父类的update方法定义,每个类单独定义update方法,且要求传入speed参数,这样的话,在事件逻辑里去写speed的变化,再传给update方法,这些bug就没有了,这个问题解决的挺顺利,且发现一个好处,下段单独写。

偶然发现,总结标记下:
一、给每个类定义update方法,且要求传入speed参数,用来控制对象的移动速度
二、在事件监听的逻辑中,去写speed的变化逻辑,即获取既时speed
三、要点来了,一开始以为要对每个场景中的对象调用update的方法并传入speed最新值,后来一想,这些对象不是已经加入精灵组了吗,能不能直接传speed给精灵组呢,一试,果然行。
具体点,举个例吧,小恐龙类Xkl,定义update方法,要求传入speed,方法中修改小恐龙的rect.y+=speed,使其可以上下移动(跳跃),事件监听中,获取小恐龙的速度最新值给xkl_speed,在窗口绘制时,本来需要xkl.update(speed)更新的,由于有了精灵组,可以直接group.update()去更新,不用每个对象都去调用自己的update,这个以前就知道,意外的是可以直接传参数给精灵组的update!!!

重新整理代码后,思路更清楚了,问题就集中到恐龙身上了,1、要解决按空格或向上方向键,恐龙跃起,且要与按键长短无关,跃起后的恐龙不动画(地面上时有脚跑步动画),在空中时再按键盘无效,落地后按键再次有效,可以再次跃起;2、在地面时,按向下方向键,恐龙变爬行跑步,松开时,恢复直立跑步。

理清逻辑后,发现不简单,还有一个问题要解决,恐龙跳跃的实现,先有了个想法:不能直接用按键去控制移动,而是要通过按键去触发一个开关,通过开关去调一个跳跃函数之类的,有这个思路后,想起之前在前端写js动画,用类似的手段写成功了一个过得去的跳跃代码段(最后还是没有用函数,直接写在逻辑关系里了)

这两天花的时间还是恐龙的问题,真是一有空闲,就想这事,结果慢慢理出逻辑,写了几页草稿后,今晚一试成功,写了45行代码,设置了3个用户事件(跑步事件、跳跃事件、爬行事件),对应3个定时器,循环中进行事件监听,并设置开关jump、crawl,用于控制跑步、爬行、跳跃的状态,还有两个实现动画的walkchange、crawlchange。

写完测试了一番,还行,难度可通过调整代码实现,如调整速度,飞鸟出现的阶段,哈哈哈,就写这些了,标记下,本想放张截图,浏览器不兼容,放弃了,还有上篇本想传代码文件,也是这个问题,暂时这样。

(后记)补充点东西,终于知道怎样在不断网的情况下打开谷歌小恐龙的游戏了,chrome谷歌浏览器中输入chrome://dino/,还可以全屏玩,另外发现原版中,gameover后中间那个按钮其实是假的,按任意键就可以重新开始,这个容易做到,另外我给这个游戏取了个名“高仿谷歌小恐龙”,呵呵,还是传不上图。
mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
请稍候,载入中。。。
公告
请稍候,载入中。。。
时间记忆
请稍候,载入中。。。
最新日志
请稍候,载入中。。。
最新评论
请稍候,载入中。。。
最新回复
请稍候,载入中。。。
我的好友
我的相册
站点信息
请稍候,载入中。。。
生活因感动而精彩,理想在创造中放飞
Powered by Oblog.