funcode微信版打飞机Funcode.docx
- 文档编号:23404122
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:33
- 大小:1.18MB
funcode微信版打飞机Funcode.docx
《funcode微信版打飞机Funcode.docx》由会员分享,可在线阅读,更多相关《funcode微信版打飞机Funcode.docx(33页珍藏版)》请在冰豆网上搜索。
funcode微信版打飞机Funcode
FunCode游戏开发设计文档
微信版打飞机
编写:
2017年5月18日
一、问题定义
开发一款微信打飞机的小游戏,实现自己飞机击毁敌机得分,吃到加血物品加血,吃到加魔的物品加魔,魔到一定值时可以通过吃掉相应物品在一定时间内获得不同的子弹发射方式和飞机移动速度。
规则如下:
1.按下空格键游戏开始。
2.通过WSAD键控制玩家飞机移动上下左右移动,但不能飞出边境。
3.玩家飞机每隔一段时间自动发射一发炮弹。
4.玩家飞机被敌机碰到后,生命值会减少,生命值变为0的时候,游戏结束。
5.在游戏上方会一直出现电脑飞机(敌机),敌机分为大、中、小三种类型,越小的飞机出现的几率越大。
6.敌机被玩家飞机击中后,生命值会减少,生命值变为0时,该敌机被摧毁,玩家得分。
越大的飞机越难击毁,击毁后玩家得分也越多。
7.敌机飞到界面下方时,删除敌机。
8.在界面外用一个文本显示玩家游戏得分。
二、实验准备
打开FunCode,创建一个新的C++项目。
注意:
项目名称必须为英文和数字,且不能有空格。
点击“项目”→“导入地图模板”,从对话框中选取名称为WarPlane的模板导入。
导入成功后,界面如下:
查看模板设置。
模板设置中有如下几点,在项目开发时需要用到:
精灵的名称,创建精灵对象时,通过精灵名称把对象和精灵图片绑定在一起。
玩家飞机的链接点,右下图鼠标点击的位置就是玩家飞机的链接点,飞机发散子弹时,位置应该在链接点前方位置。
子弹的碰撞边界的设定,把碰撞边界设置在图片中的有颜色区域,这样敌方飞机实际是碰撞到子弹图片的有颜色区域才发生碰撞事件,从而是游戏效果更逼真。
在“场景预览”窗口中,点击游戏屏幕之外的区域,然后在“编辑”面板中修改“窗口大小”,该属性用来设置游戏运行时屏幕大小。
“屏幕位置”中的“宽”“高”则是用来设置“场景预览”窗口中可见区域的大小。
按下图进行设置。
也可以自行调整这两个区域大小,以及图片大小,从而达到最佳效果。
三、可行性分析
FunCode作为一个功能比较简单,封装的库函数不多的,游戏开发引擎,上手比较容易,对于开发平台的性能要求也不高,符合技术可行性和系统可行性。
四、用例图及类图设计
玩家控制飞机移动,飞机自动发射子弹,然后游戏一直循环,当飞机HP归0时游戏结束。
飞机类作为其他所有和飞机相关类的基类,PlaneGame类是控制类,这个游戏的主要实现在PlaneGame类中完成。
包括设定子弹、开火、删除已摧毁精灵、通过名字获得精灵、播放动画、创建敌机、创建物品等动作。
类的具体定义如下:
飞机类:
Plane继承自CSprite类
属性
privateintiHP
飞机生命值
privatefloatfPointX
飞机当前位置中心点的X坐标
privatefloatfPointY
飞机当前位置中心点的Y坐标
privatefloatfSpeedX
飞机X轴方向移动速度
privatefloatfSpeedY
飞机Y轴方向移动速度
方法
publicintgetHP()
获取飞机生命值
publicvoidsetHP(inthp)
根据参数设置飞机生命值
publicfloatgetPointX()
获得飞机的X坐标
publicvoidsetPointX(intx)
设置飞机的X坐标
publicfloatgetPointY()
获得飞机的Y坐标
publicvoidsetPointY(inty)
设置飞机的Y坐标
publicfloatgetMoveSpeedX()
获得飞机X轴方向上速度
publicvoidsetMoveSpeedX(floatspeedX)
设置飞机X轴方向上速度
publicfloatgetMoveSpeedY()
获得飞机Y轴方向上速度
publicvoidsetMoveSpeedY(floatspeedY)
设置飞机Y轴方向上速度
敌方飞机类:
EnemyPlane继承自Plane类
属性
privateintiValue
敌机价值,即玩家飞机击毁敌机后可获得分数
privateintiType
飞机类型。
0–大型敌机1–中型敌机2–小型敌机
方法
publicintgetValue()
获取敌机价值
publicvoidsetValue(intvalue)
设置敌机价值
publicintgetPlaneType()
获取敌机类型
publicvoidsetPlaneType(intplaneType)
设置敌机类型
玩家飞机类:
Player继承自Plane类
属性
privateintiScore
玩家得分
privatefloatfFireTime
玩家发射子弹的时间间隔,可理解为安装子弹需要的时间
privatefloatfUsedTime
玩家飞机安装子弹已经用去的时间
privateintiMp
魔抗值
privateboolflag
标志位
方法
publicintgetScore()
获取玩家得分
publicvoidsetScore(intscore)
设置玩家得分
publicfloatgetFireTime()
获取玩家子弹发射间隔
publicvoidsetFireTime(floatfireTime)
设置玩家子弹发射间隔
publicfloatgetUsedTime()
获取玩家飞机装弹已用时间
publicvoidsetUsedTime(floatusedTime)
设置玩家飞机装弹已用时间
publicvoidmove()
玩家飞机移动
publicvoidstopMove(inthp)
忘记飞机停止移动
publicvoidfire()
玩家飞机发射子弹
publicintgetMP()
获得魔抗
publicvoidsetMP(intmp)
设置魔抗
publicboolgetflag()
获得标志位
publicvoidsetflag()
设置标志位
子弹类:
Bullet继承自Plane类
属性
privateintiDamage
子弹伤害值
方法
publicintgetiDamage()
获取子弹伤害值
publicvoidsetiDamage(intval)
设置子弹伤害值
精灵工厂类:
SpriteFactory
属性
privatestaticintiId
静态成员变量。
缺省值为0,每复制一个精灵时递增一次,用于作为新生成的精灵名称的后缀。
例如:
plane1,plane2,bullet3
方法
publicCSprite*getSprite(inttype)
获取生产出的精灵。
type:
0–大型敌机1–中型敌机2–小型敌机3–玩家飞机4–子弹
5,6,7,8,9–物品
privatestaticPlayer*createPlayer()
创建玩家飞机对象
privatestaticEnemyPlane*createEnemyPlane(constintiType)
创建敌方飞机对象
privatestaticBullet*createBullet()
玩家子弹精灵对象
privatestaticPlaneItem*createItem(constintiType)
飞机游戏类:
PlaneGame
属性
privatestaticPlaneGame*pGame
游戏对象
privateCTextSprite*pTextScore
显示玩家得分的文本精灵
privateCTextSprite*pTextHp
显示玩家生命值的文本精灵
privateCTextSprite*pTextMp
显示玩家魔抗值的文本精灵
privatePlayer*pPlayer
玩家飞机
privateList
精灵集合
privatefloatfCreateEnemyTime
生成一架新敌机的时间间隔,即生产一架新敌机需要的时间
privatefloatfUsedEnemyTime
生产一架新敌机已经用去的时间
privatefloatfCreateItemTime
生成一个物品的时间间隔,即生产一个物品需要的时间
privatefloatfUsedItemTime
生产一个物品已经用去的时间
privatefloatfMPTime
魔法能持续的时间
privatefloatfMPUsedTime
魔法已经持续的时间
privateintbulletType
子弹的类型
privatefloatspeed
飞机加速后的速度
方法
privatePlaneGame()
单例模式的做法,构造函数是私有的,用户不能直接创建该类对象
publicstaticPlaneGame*getPlaneGame()
用户只能通过该方法获得PlaneGame对象,且对象为同一个
publicCSprite*getSpriteByName(constchar*name)
通过名称从集合中获取精灵(敌方飞机、子弹)
publicvoidsetTextScore(intscore)
设置显示玩家得分的文本精灵对象
publicvoidsetTextHp(inthp)
设置显示玩家血量的文本精灵对象
publicvoidsetTextMp(intmp)
设置显示玩家魔抗的文本精灵对象
publicintgetBulletType()
获得子弹类型
publicvoidsetBulletType(floattime)
根据时间设置子弹类型
publicvoidsetBulletType(inttype)
设置子弹类型
publicfloatgetfMPTime()
获得魔抗能持续的时间间隔
publicvoidsetfMPTime(floatval)
设置魔抗能持续的时间间隔
publicfloatgetfMPUsedTime()
获得魔抗已经持续的时间
voidsetfMPUsedTime(floatval)
设置魔抗已经持续的时间
publicPlayer*getPlayer()
获得玩家飞机
publicvoidsetPlayer(Player*myPlane)
设置玩家飞机
publicfloatgetEnemyPlaneCreateTime()
获得产生一架敌机的时间间隔
publicvoidsetEnemyPlaneCreateTime(floatcreateTime)
设置产生一架敌机的时间间隔
publicfloatgetEnemyPlaneUsedTime()
获得生产一架敌机已经用去的敌机
publicvoidsetEnemyPlaneUsedTime(floatusedTime)
设置生产一架敌机已经用去的敌机
publicListgetEnemyPlaneList()
获得敌机集合
publicListgetBulletList()
获得子弹集合
publicvoidplayerFire(floattime,inttype)
玩家飞机每隔一段时间发散一发子弹。
参数time是屏幕每次刷新的时间
publicvoiddestroyDeadSprites()
从精灵集合中删除HP<=0的精灵
publicvoidcreatNewEnemyPlane(floattime)
每隔一段时间创建一架敌方飞机。
参数time是屏幕每次刷新的时间
publicvoidcreatNewItemPlane(floatTime)
每隔一段时间创建一个物品。
参数time是屏幕每次刷新的时间
publicvoiddestroyPlayer()
删除玩家飞机
publicvoidplayExplodeAnimation(floatx,floaty)
播放爆炸动画,参数是要爆炸的精灵当前所在位置坐标
publicvoidsetspeed(floatispeed)
设置子弹加速的速度
publicfloatgetspeed()
获得子弹加速的速度
常量值类:
EnumDefine
属性
PublicstaticintBIG_ENEMY=0
大型敌机
publicstaticintMEDIUM_ENEMY=1
中型敌机
publicstaticintSMALL_ENEMY=2
小型敌机
publicstaticintPLAYER_PLANE=3
玩家飞机
publicstaticintBULLET=4
子弹
publicstaticintHP=5
加血
publicstaticintMP=6
加魔抗
publicstaticintBULLET1=7
子弹1
publicstaticintBULLET2=8
子弹2
publicstaticintBULLETSPEED=9
加速
PublicstaticintBIG_ENEMY_VALUE=10
打掉大飞机的玩家得分
PublicstaticintMEDIUM_ENEMY_VALUE=5
打掉中飞机的玩家得分
publicstaticintSMALL_ENEMY_VALUE=2
打掉小飞机的玩家得分
publicstaticintBULLET_DAMAGE=1
子弹伤害
publicstaticintPLAYER_HP=1
玩家血量
publicstaticfloatPLAYER_SPEED=30
玩家速度
publicstaticfloatBULLET_SPEED=50
子弹速度
publicstaticfloatBIG_ENEMY_SPEED=5
大飞机速度
publicstaticfloatMEDIUN_ENEMY_SPEED=10
中飞机速度
publicstaticfloatSMALL_ENEMY_SPEED=20
小飞机速度
publicstaticfloatHP_SPEED=20
加血速度
publicstaticfloatMP_SPEED=20
加魔速度
publicstaticfloatBULLET1_SPEED=20
子弹1速度
publicstaticfloatBULLET2_SPEED=20
子弹2速度
publicstaticfloatBULLETSPEED_SPEED=20
飞机加速速度
五、时序图设计与流程描述
5.1游戏初始化
从PlaneGame中后的一个单例模式的PlaneGame对象,产生玩家飞机,把玩家飞机放到PlaneGame的对象pGame中。
5.2键盘相关函数设计
键盘按下有两种情况,如果游戏状态为0并且按下的是空格,就把游戏状态设为1,如果游戏状态是2并且按下的为WASD这几个键,那么就给玩家飞机设置速度让其移动。
键盘松开就把玩家飞机速度归0
5.3游戏运行相关设计
游戏运行的主过程,先更新玩家的得分、MP值和HP值,如果HP<=0游戏结束。
然后设置子弹的类型,飞机自动开火。
在列表中删除已经被摧毁的精灵,生成新的敌机和新的物品。
对于子弹开火的函数,先判断生成子弹易用的时间是否大于等于需要的时间,然后根据子弹的类型选择哪几个链接点,然后获取链接点坐标,设置为子弹的坐标,然后把子弹对象放入集合,将生成子弹已用的时间归0。
在集合中循环删除精灵,先获得HP值,判断是否大于0,对于小于等于0的精灵,如果是敌机,就给玩家加分,然后删除敌机,播放动画。
如果是子弹,就直接删除。
如果是物品,就直接删除。
根据坐标设置动画精灵的坐标,设置时长,播放动画。
如果生成一架敌机的已用时间大于等于需要时间,就从精灵工程中获得一架新的飞机,这里通过生成随机数,在1-50之间时,就生产小型敌机;在51-80之间时,就生产中型敌机;在81-100之间时,就生产大型敌机。
如果生成一个物品的已用时间大于等于需要时间,就从精灵工程中获得一个新的物品,这里通过生成随机数,在1-10之间时,就生产加血物品;在11-30之间时,就生产加魔物品;在31-50之间时,就生产子弹1;在51-80之间时,就生产子弹2;在81-100之间时,就生产飞机加速。
5.4碰撞函数设计
如果玩家与敌机碰撞,敌机HP归0,玩家HP-1,如果敌机与子弹碰撞,子弹HP归0,敌机HP-1。
如果玩家与物品碰撞,物品HP归0,加血则玩家HP+1,加魔则玩家MP+1,子弹1则改变子弹类型为1,子弹2则改变子弹类型为2,飞机加速则改变玩家速度。
如果游戏状态为2,且与世界边界碰撞的是敌机、子弹或者物品,则删除精灵。
5.5游戏结束设计
删除玩家飞机、被摧毁的敌机,然后清空精灵集合。
六、编码与实现
Plane类
#include"CommonClass.h"
classPlane:
publicCSprite
{
public:
Plane(constchar*name);
virtual~Plane();
intgetHP(){returniHP;}
voidsetHP(inthp){iHP=hp;}
floatgetPointX(){fPointX=GetSpritePositionX();returnfPointX;}
voidsetPointX(floatx){fPointX=x;SetSpritePositionX(x);}
floatgetPointY(){fPointY=GetSpritePositionY();returnfPointY;}
voidsetPointY(floaty){fPointY=y;SetSpritePositionY(y);}
floatgetMoveSpeedX(){returnfSpeedX;}
voidsetMoveSpeedX(floatspeedX){fSpeedX=speedX;SetSpriteLinearVelocityX(speedX);}
floatgetMoveSpeedY(){returnfSpeedY;}
voidsetMoveSpeedY(floatspeedY){fSpeedY=speedY;SetSpriteLinearVelocityY(speedY);}
protected:
private:
intiHP;
floatfPointX;
floatfPointY;
floatfSpeedX;
floatfSpeedY;
};
Player类
#include"Plane.h"
classPlayer:
publicPlane
{
public:
Player(constchar*name);
virtual~Player();
intgetMP(){returniMp;}
voidsetMP(intmp){iMp=mp;}
intgetiScore(){returniScore;}
voidsetiScore(intval){iScore=val;}
floatgetfFireTime(){returnfFireTime;}
voidsetfFireTime(floatval){fFireTime=val;}
floatgetfUsedTime(){returnfUsedTime;}
voidsetfUsedTime(floatval){fUsedTime=val;}
voidMove();
voidstopMove(inthp);
voidfire();
boolgetflag(){returnflag;}
voidsetflag(){if(flag)flag=false;elseflag=true;}
protected:
private:
intiMp;
intiScore;
floatfFireTime;
floatfUsedTime;
boolflag;
};
EnemyPlane类
#include
classEnemyPlane:
publicPlane
{
public:
EnemyPlane(constchar*name);
virtual~EnemyPlane();
intgetiValue(){returniValue;}
voidsetiValue(intval){iValue=val;}
intgetiType(){returniType;}
voidsetiType(intval){iType=val;}
protected:
private:
intiValue;
intiType;
};
Bullet类
#include"Plane.h"
classBullet:
publicPlane
{
public:
Bullet(constchar*name);
virtual~Bullet();
intgetiDamage(){returniDamage;}
voidsetiDamage(intval){iDamage=val;}
protected:
private:
intiDamage;
};
PlaneItem类
#include"Plane.h"
classPlaneItem:
publicPlane
{
public:
PlaneItem(constchar*name);
virtual~PlaneItem();
intgetiType(){returniType;}
voidsetiType(constinttype){iType=type;}
protected:
private:
intiType
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- funcode 微信版打 飞机
![提示](https://static.bdocx.com/images/bang_tan.gif)