大鱼吃小鱼实训指南
游戏规则
1. 按下空格键游戏开始。
2. 通过 WSAD 键控制玩家鱼上下左右移动,但不能游出边境。
3. 克隆出多条鱼放在容器当中。
4. 克隆出来的容器中的鱼从右向左移动,不同的鱼游动的速度不同。
5. 当玩家鱼碰撞到了容器中的鱼,删除容器中的鱼,并增加玩家鱼的得分。
6. 当容器中鱼没有被吃到,而是撞到了左边世界边界,则从玩家鱼的分数中减去该鱼的价
值,当玩家鱼的分数被减为负值,游戏结束。
实验准备
打开 FunCode,创建一个新的 C++项目。注意:项目名称必须为英文和数字,且不能有
空格。
点击“项目”→“导入地图模板”,从对话框中选取名称为 FishEatFish 的模板导入。
导入成功后,界面如下:
查看模板设置。模板设置中有如下几点,在项目开发时需要用到:
精灵的名称,创建精灵对象时,通过精灵名称把对象和精灵图片绑定在一起。
点击“启动 VC 工程”,将 VC 打开:
类的设计
游戏中能直接看到的精灵:玩家鱼、电脑鱼、玩家得分文本、玩家等级文本。其中,玩
家得分和玩家等级只需要显示分数,可以直接使用 CTextSprite 类。玩家鱼、电脑鱼创建相
应的类。
可以从玩家鱼和电脑鱼抽象出一个鱼类,作为父类。
鱼类继承 CSprite 类,通过 CSprite 类的方法操作精灵。
创建一个游戏类,各个类之间的通信在游戏世界类中进行。本游戏是大鱼吃小鱼,该类
称为鱼游戏类。
创建一个精灵工厂类,用来生成各种精灵类的对象。这就是“工厂模式”。
游戏流程
主流程
游戏分四个状态:未开始、开始、运行和结束。CGameMain 类是控制游戏流程的类,游
戏屏幕每刷新一次,调用一次该类的 GameMainLoop 方法。GameMainLoop 根据 m_iGameState
的值分别调用该类的 GameInit、GameRun 和 GameEnd 方法。这三个方法对应初始化游戏、游
戏运行和游戏结束这三个状态。GameInit 只执行一次。执行后修改游戏状态。屏幕刷新后,
进入状态 2,开始执行 GameRun 方法。当玩家积分>=0 即玩家鱼不死的时候,GameRun 一直
被执行。玩家鱼死亡后,调用 GameEnd 执行一次,清除本局游戏数据,恢复游戏未开始状态。
游戏初始化
完成游戏初始工作,界面上的工作:玩家积分和等级显示为 0,创建玩家鱼并放置在指
定位置,并且把玩家鱼对象加入到 FishesWorld 对象中。
游戏运行
游戏运行中,每刷新一次屏幕,需要根据最新数据,更新玩家得分和等级,移动玩家鱼,
删除被吃掉的电脑鱼,当达到相应的时间间隔时,创建新的电脑鱼。
游戏结束
将游戏中剩余的精灵删除,包括删除精灵本身和集合中对应的对象。
重新显示游戏开始的提示图片。
生产精灵对象
本游戏中的玩家鱼、电脑鱼这两种精灵类的对象都在精灵工厂类中产生。根据参数确定
生产何种精灵。右下图是玩家飞机的生产过程,主要是创建对象,复制模板,并设置几个基
本属性(碰撞、世界边界、初始位置、初始速度)。
键盘按下事件
本游戏中,游戏状态为 0 时,按下空格键,游戏状态转为 1。游戏状态为 2 时,玩家按
下了 WSAD 键,分别设置玩家鱼的上下左右速度。
键盘弹起事件
本游戏中,游戏状态为 2 时,玩家松开 WSAD 键,设置玩家飞机对应方向上的速度为 0。
精灵与精灵的碰撞
本游戏中,玩家鱼设置为发送碰撞,电脑鱼设置为接收碰撞。精灵碰撞时,如果电脑鱼
等级比玩家鱼高,则玩家鱼减少积分,反之,玩家鱼增加积分。
世界边界碰撞事件
本游戏中,游戏状态为 2 时,玩家鱼碰到边界停止继续游动。电脑鱼碰到边界,设置该
鱼的生命值 hp 为 0。获得该鱼的价值,从玩家鱼当前的得分中减去该值。