一、 设计任务及需求分析
《坦克大战》是由日本南梦宫Namco游戏公司开发的一款平面射击游戏,于1985年发售。游戏以坦克战斗及保卫基地为主题,属于策略型联机类。以二战坦克为题材,既保留了射击类游戏的操作性,也改进了射击类游戏太过于复杂难玩的高门槛特点,集休闲与竞技于一身。
使用第三方图形库SFML还原FC经典坦克大战,用13*13的方块组成游戏地图,地形包括空气,钢板,砖墙,实现原版坦克大战中坦克行走,坦克与墙壁之间碰撞,坦克发射子弹,敌军生成,敌军随机走动,子弹与实体之间互动,游戏键盘操作,游戏结束界面
游戏操作,WASD控制玩家坦克上下左右移动,J发射子弹
二、总体设计方案
用Game类作为中介类,内存有所有游戏对象的指针,而每个游戏对象都有Game类的指针,用于不同游戏模块之间的通信,Game类又负责了整个游戏的运行(Run()成员函数用于处理每一帧的要处理的事件,PushEvent将每个要处理的键盘事件交给Control对象处理)
Control类用于处理键盘输入信息,使得游戏对象对于每个得到的事件做出相应的反应,例如WASD改变玩家的转向以及移动
Drawer类用于绘制所有地图中的游戏对象,控制绘制顺序
GameObject类作为所有游戏对象的父类,内涵纹理以及纹理对象的属性,以及纯虚函数Draw()接口
Block类作为所有方块对象的父类,内含枚举类型方块种类BlockType,WallBlock构造函数为BlockType赋值,其他方块同理
Map类是Block类的聚合,构造函数为其初始化每个方块的位置,用字符串数组来快速编辑地图方块布局,setLostMap()为设置游戏结束之后地图显示的界面
Player类内含speed,isDead,isMoving, direction属性,
Move()方法:按照direction方向以speed速度运动,每次运动判断是否与所有游戏对象发生碰撞,若碰撞退回去且不再运动
Turn(Direction dir)方法:设置运动方向,贴图旋转
Enemy类内含静态属性StartPos设置每次生成位置,属性sf::Clock计时器用于控制每个敌方坦克的发射子弹的时间
Bullet抽象类内含speed,isDead属性,Move方法每次运动都会去判断是否有碰撞到游戏对象,若发生碰撞,则设置Bullet和该对“死亡”,在game->Run()中将其清除,PlayerBullet实现了Move函数,EnemyBullet实现了Move函数
Home类为游戏中基地对象,若isDead属性为True则游戏结束