太空战机实验报告Word格式.docx
- 文档编号:17976064
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:33
- 大小:633.39KB
太空战机实验报告Word格式.docx
《太空战机实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《太空战机实验报告Word格式.docx(33页珍藏版)》请在冰豆网上搜索。
//表示子弹的发射间隔.
m_bCanFire;
//表示判断是否开火
2.子弹类CBullet:
m_iType;
//表示该子弹是谁发射的变量
3.敌方战机类CEnemyFighter:
m_fCreateTime;
//创建敌机的时间见隔
m_iCreatedSpriteCount;
//表示创建战机数量
m_fCanFireAfterCreated;
//判断敌机创建后能否开火
//子弹发射时间间隔
m_fFloatTime;
//战机飞行时上下浮动的时间间隔
m_bFloatUp;
//战机飞行时是上浮还是下浮
4.链表类CSpriteList:
structSpriteStruct//一个精灵结构体SpriteStruct;
{
CSprite*pSprite;
SpriteStruct*pNext;
SpriteStruct*pPrev;
};
SpriteStruct*m_pListHeader;
//一个头节点指针
intm_iListSize;
//表示链表节点数的私有成员变量
CSprite*m_pSpriteList;
//精灵指针
5.精灵父类CGameSprite:
virtual~CGameSprite();
//get方法
6.lessen.x类:
m_iGameState;
//游戏状态0:
结束或者等待开始1:
初始化2游戏进行中.
CSprite*m_pGameBegin;
//游戏开始文字精灵
CMyFighter*m_pMyFighter;
//战机类指针
floatm_iCreatedSpriteCount;
//创造精灵数量
CSpriteListm_SpriteList;
//链表类精灵
CSpriteListdiji;
//链表类敌机
CEffect*die_texiao;
//特效类精灵
5.算法描述
在外星球上,玩家通过键盘WSAD键控制己方战机,通过空格键发射子弹消灭外星球的邪恶战机。
游戏状态m_iGameState分为三种状态0,1,2,其中0表示游戏结束状态,1表示游戏初始化,2则表示游戏运行状态;
01的转换为“空格开始”,初始化函数为GameInit函数;
播放背景音乐。
12的转换自然发生,即游戏初始化函数后会自动将游戏状态从1置为2
2表示游戏运行状态,在该状态,敲击空格发射子弹消灭敌机,消灭敌机分数增加,被敌机打中自身的血量减少。
20的转换是游戏结束。
CGameMain:
:
CGameMain()构造函数
完成初始化工作
初始化状态为0
设置开始按钮
我方战机初始化为空
创造精灵数量初始化为0
GameMainLoop(floatfDeltaTime)
游戏的主循环,根据游戏的状态切换逻辑
1、当当游戏状态为0时,主循环一直循环,但不做处理,而是等待空格键按下,开始游戏。
调用背景音乐。
2、当游戏状态为1时,调用GameInit()方法初始化游戏,然后置游戏状态为2。
当游戏状态为2时,调用GameRun(fDeltaTime)方法,在CGameMain类的GameRun方法中,遍历链接中的每个节点,获得所有敌方战机的节点,让战机执行LoopTick方法,实现战机发射子弹和上下浮动。
3、游戏结束时会执行GameEnd且置状态为0。
GameInit()
完成对各种精灵的初始化
1.播放放在bin中的游戏背景音乐。
2.初始化我方战机为战机类指针”ControlSprite”.设计我方战机的世界边界限制。
3.初始化分数为0.
4.初始化血量为100.
GameRun(floatfDeltaTime)
对于游戏进行的设置
1.如果是我的战机,我方战机初始化
2.敌方战机引用函数CEnemyFighter:
ClassTick(fDeltaTime)进行引用。
3.当游戏状态为2时,调用GameRun(fDeltaTime)方法,在CGameMain类的GameRun方法中,遍历链接中的每个节点,获得所有敌方战机的节点,让战机执行LoopTick方法,实现战机发射子弹和上下浮动。
OnKeyDown(constintiKey,constboolbAltPress,constboolbShiftPress,constboolbCtrlPress)
游戏开始和控制按钮
1、如果空格按下时,游戏未开始,即游戏状态为0,则将游戏状态改为1,运行游戏初始化函数(GameInit)。
隐藏文字精灵“开始游戏”。
2、如果游戏状态是2时,设置战机移动,调用函数OnMove
3、如果空格按下时,战机为空。
则调用函数SetCanFire,按下空格键即可发送子弹。
voidCGameMain:
OnSpriteColSprite(constchar*szSrcName,constchar*szTarName)
设置碰撞的发送方与接收方
1.调用匹配函数cemcmp(szSrcName,””,strlen(“”))==0),如果对象是子弹则继续判断
2.假若是我方战机被子弹击中则血量减少0.5.显示当前血量。
3.假如是对方战机被击中,则得分增加10分,更新显示我方分数。
voidCMyFighter:
OnMove(boolbKeyDown,intiKey)
设置战机飞行速度
编写CMyFighter类OnMove方法代码。
首先判断当前按键是按下还是松开的,其次判断是哪个按键的消息,根据这两个判断,为4个方向的速度矢量赋值。
再次算出X后和Y轴上的速度,并设置战机的速度。
m_pMyFighter->
SetSpriteWorldLimit(WORLD_LIMIT_STICKY,CSystem:
GetScreenLeft()-10.f,CSystem:
GetScreenTop(),CSystem:
GetScreenRight()+200.f,)
设置战机的世界边界
其次在构造函数中将m_pMyFighter赋予NULL的初始值。
再次在GameInit方法中初始化m_pMyFighter。
因为我们用new方法创建了m_pMyFighter对象,分配了内存,所以我们在CGameMain类的析构函数中需要调用delete方法将m_pMyFighter使用的内存释放掉。
m_CurScoreText->
SetTextValue(0);
m_MaxScoreText->
/更新当前等级/HP显示
在CGameMain类的GameInit方法中显示当前积分和最高积分
LoopTick(floatfDeltaTime)
//处理子弹的发射
CMyFighter添加m_fBulletCreateTime,表示子弹的发射间隔,注意在构造函数中初始化为0.3。
然后添加LoopTick方法,处理子弹的发射。
参数为游戏的时间间隔;
CreateBullet(constfloatfPosX,constfloatfPosY)
CGameMain类中添加m_iCreatedSpriteCount属性,表示游戏中发射子弹的数目注意在构造函数中初始化为0。
然后添加CreateBullet方法,参数为子弹的X轴和Y轴坐标。
并在该方法中创建一个子弹类,并设置子弹的位置和速度。
因为模板子弹的方向是朝左,所以需要设置子弹按X轴对称旋转;
IntiPosBase=CSystem:
RandomRange((int)CSystem:
GetScreenTop()+10,(int)CSystem:
GetScreenBottom()-10);
创建战机时,只需要战机不显示在世界边界之外就可以,即Y轴坐标在比世界边界的上下边界稍微大一点的范围之间,在此我们设置比世界边界大10个世界坐标单位。
voidCEnemyFighter:
在函数中添加代码,当表示战机创建之后,隔多久才可以开始发射子弹的变量递减到小于等于0时,开始可以创建子弹,然后开始递减子弹的发射间隔变量,当递减到小于等于0时,战机发射子弹。
if(m_bFloatUp)
添加战机上下浮动的代码。
当战机浮动时,首先累计浮动的时间,当浮动时间大于1和小于0时,修改上浮还是下浮的变量值。
然后获得战机此时的Y轴坐标,我们设置上下浮动的速度为6,这样就可以计算出浮动后的Y轴坐标。
CreateBullet(intiType,constfloatfPosX,constfloatfPosY)
为CBullet添加一个表示该子弹是谁发射的变量。
if(1==iType)//如果iType值为1,则说明子弹为敌方战机反射。
SpriteStruct*CSpriteList:
AddSprite(CSprite*pSprite)
为链接类添加增加节点的方法
voidCSpriteList:
DeleteSprite(constchar*szName,boolbDeleteImage)
添加根据精灵名称删除其在链接中的节点的方法。
其中第二个参数表示是否将其在游戏中的精灵也删除。
CSprite*CSpriteList:
GetSprite(constintiIndex)
添加获得链接中某个节点的方法。
首先根据索引获得精灵。
DeleteSprite(constchar*szName,boolbDeleteImage)
根据名字删除精灵
DeleteSprite(CSprite*pSprite,boolbDeleteImage)
根据精灵对象删除精灵
源代码
Lessenx.h
public:
CGameMain();
//构造函数
~CGameMain();
//析构函数
//Get方法
intGetGameState(){returnm_iGameState;
}
//Set方法
voidSetGameState(constintiState){m_iGameState=iState;
//游戏主循环等
voidGameMainLoop(floatfDeltaTime);
voidGameInit();
voidGameRun(floatfDeltaTime);
voidGameEnd();
//事件函数
voidOnMouseMove(constfloatfMouseX,constfloatfMouseY);
voidOnMouseClick(constintiMouseType,constfloatfMouseX,constfloatfMouseY);
voidOnKeyDown(constintiKey,constboolbAltPress,constboolbShiftPress,constboolbCtrlPress);
voidOnKeyUp(constintiKey);
voidOnSpriteColSprite(constchar*szSrcName,constchar*szTarName);
voidOnSpriteColWorldLimit(constchar*szName,constintiColSide);
voidCreateBullet(intiType,constfloatfPosX,constfloatfPosY);
voidAddSprite(CSprite*pSprite);
CSprite*GetSprite(constchar*szName){returnm_SpriteList.GetSprite(szName);
}
voidDeleteSprite(CSprite*pSprite,boolbDeleteImage){m_SpriteList.DeleteSprite(pSprite,bDeleteImage);
/////////////////////////////////////////////////////////////////////////////////
//
externCGameMaing_GameMain;
#endif//_LESSON_X_H_
Lessenx.cpp
//
#include<
Stdio.h>
#include"
CommonClass.h"
#include"
CSpriteList.h"
LessonX.h"
CBullet.h"
CEnemyFighter.h"
string.h>
inta=100,b=0;
CTextSprite*g_CurScoreText=newCTextSprite("
CurScoreText"
);
//显示当前积分
CTextSprite*g_MaxScoreText=newCTextSprite("
MaxScoreText"
//显示最高分
//CEffect*die_texiao=newCEffect("
playerExplode"
////////////////////////////////////////////////////////////////////////////////
CGameMaing_GameMain;
//==============================================================================
//大体的程序流程为:
GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。
//构造函数
CGameMain()
m_iGameState=0;
m_pGameBegin=newCSprite("
GameBegin"
m_pMyFighter=NULL;
m_iCreatedSpriteCount=0;
//析构函数
~CGameMain()
deletem_pMyFighter;
//游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
//用以处理游戏的开始、进行中、结束等各种状态.
//函数参数fDeltaTime:
上次调用本函数到此次调用本函数的时间间隔,单位:
秒
GameMainLoop(floatfDeltaTime)
switch(GetGameState())
{
//初始化游戏,清空上一局相关数据
case1:
{
GameInit();
SetGameState
(2);
//初始化之后,将游戏状态设置为进行中
}
break;
//游戏进行中,处理各种游戏逻辑
case2:
//TODO修改此处游戏循环条件,完成正确游戏逻辑
if(true)
{
GameRun(fDeltaTime);
}
else//游戏结束。
调用游戏结算函数,并把游戏状态修改为结束状态
{
SetGameState(0);
GameEnd();
//游戏结束/等待按空格键开始
case0:
default:
};
//=============================================================================
//每局开始前进行初始化,清空上一局相关数据
{
PlaySound("
yinyue"
0,SND_FILENAME|SND_ASYNC|SND_LOOP);
if(NULL==m_pMyFighter)
m_pMyFighter=newCMyFighter("
ControlSprite"
GetScreenRight()+200.f,CSystem:
GetScreenBottom());
g_CurScoreText->
SetTextValue(100);
g_MaxScoreText->
//每局游戏进行中
GameRun(floatfDeltaTime)
if(m_pMyFighter)
m_pMyFighter->
LoopTick(fDeltaTime);
CEnemyFighter:
ClassTick(fDeltaTime);
intiListSize=m_SpriteList.GetListSize();
for(intiLoop=0;
iLoop<
iListSize;
iLoop++)
CEnemyFighter*pSprite=(CEnemyFighter*)m_SpriteList.GetSprite(iLoop);
if(NULL!
=pSprite)
pSprite->
//本局游戏结束
GameEnd()
OnMouseMove(constfloatfMouseX,constfloatfMouseY)
OnMouseClick(constintiMouseType,constfloatfMouseX,constfloatfMouseY)
OnKeyDown(constintiKey,constboolbAltPress,constboolbShiftPress,constboolbCtrlPress)
if(KEY_SPACE==iKey&
&
0==m_iGameState)
m_iGameState=1;
m_pGameBegin->
SetSpriteVisible(0);
if(2==GetGameState())//当游戏状态为2时
OnMove(true,iKey);
if(KEY_SPACE==iK
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 太空 战机 实验 报告