07 C++程序设计_打飞碟 联系客服

发布时间 : 星期六 文章07 C++程序设计_打飞碟更新完毕开始阅读b880008e18e8b8f67c1cfad6195f312b3169eb3d

}

3) 首先判断游戏状态,如果是初始化或者正在运行,则将鼠标的坐标赋给准心精

灵。在上面的函数定义里面添加如下代码:

if( m_iGameState==1||m_iGameState==2 ) // 游戏开始

{

}

// 设置准星的位置,随鼠标移动

m_pZhunxing->SetSpritePosition(fMouseX, fMouseY);

4) 在Main.cpp中的OnMouseMove函数里面添加对该自定义函数的调用:

g_GameMain.OnMouseMove(fMouseX,fMouseY); 7、 要改变大炮的朝向,需要获取到鼠标和炮口中心点连线与x坐标轴直接的夹角,然后调用SetSpriteRotation函数设置大炮的朝向即可。在LessonX.cpp中的OnMouseMove函数里面的 if( m_iGameState==1||m_iGameState==2 ) 判断里面添加如下代码:

1) 获取炮筒中心点的坐标:

float fX = m_pDapao->GetSpritePositionX(); float fY = m_pDapao->GetSpritePositionY();

2) 计算通过炮筒中心点与当前鼠标的直线与X坐标轴的夹角:

float fRotation ;

float ftan = atan2((fMouseY-fY),(fMouseX-fX));

3) 将该值转换到0-360度的角度值,如果角度小于0,则按逆方向处理,即加上360度:

// 转换为角度值

fRotation=180*ftan/PI; // 转换到0-360度 if(fRotation<0) fRotation+=360;

4) 将炮筒旋转到通过炮筒中心点与当前鼠标的直线上: m_pDapao->SetSpriteRotation(fRotation );

8、 在GameMainLoop函数里判断剩余时间是否大于0,如果是,则运行GameRun函数,

在GameRun中显示剩余时间,否则游戏结束,运行GameEnd。 把GameMainLoop函数里的

if( true ) { }

if( m_fGameTime > 0 )

GameRun( fDeltaTime );

改为

{ }

GameRun( fDeltaTime );

在GameRun添加如下代码:

m_fGameTime -= fDeltaTime;

if(m_fGameTime > 0) { } else { }

m_iGameState = 0; CSystem::ShowCursor(true); m_pKaishi->SetSpriteVisible(true);

m_pTime->SetTextValue((int)m_fGameTime); //显示剩余时间

m_pDapao->SetSpriteRotation(m_fDapaoRotation); //大炮炮口置回初始位置

实验三发射炮弹

【实验内容】

步骤一、鼠标单击发射炮弹

步骤二、判断炮弹是否越出世界边界

【实验思路】

系统捕捉到鼠标单击消息的时候,获取大炮炮口中心点的坐标作为炮弹发射点,通过炮弹模板精灵创建炮弹精灵,使用SpriteMoveTo函数使炮弹移动到鼠标位置也即是准心精灵的位置,这样就实现了发射炮弹的效果了。

【实验指导】

1、 进入LessonX.h中添加如下的成员变量声明:

float m_fPaodanLeftTime ;// 记录发射一发炮弹后,距离能发射第二发炮弹还

剩多少时间

float float float float

m_fScreenLeft m_fScreenRight m_fScreenTop

;// 屏幕上下左右4个边界值 ;

; ;

m_fScreenBottom

vector m_vPaodan;//炮弹精灵数组 #include

using std::vector;//表明使用的是std标准库里面的vecto.h文件

2、 在LessonX.h的头文件声明处添加vector头文件的声明:

3、 进入LessonX.cpp中的构造函数中添加以上变量的初始化代码:

m_fPaodanLeftTime m_fScreenLeft m_fScreenRight m_fScreenTop

=0.f; =0.f; =0.f;

=0.f; =0.f;

m_fScreenBottom

4、 在GameInit函数中获取屏幕的边界值:

// 获取屏幕4个边界值

m_fScreenLeft = CSystem::GetScreenLeft(); m_fScreenRight = CSystem::GetScreenRight();

m_fScreenTop = CSystem::GetScreenTop();

m_fScreenBottom = CSystem::GetScreenBottom();

5、 在GameRun函数中添加如下一行代码,设置前一发炮弹发射后,进过fDeltaTime

时间才能继续发射后一发炮弹: m_fPaodanLeftTime -= fDeltaTime; 6、 飞碟精灵出现的位置是在地图的右上方,因此,我们不需要将炮口移动的范围设置太大,只需要将其限定在某个范围即可。在OnMouseMove函数里面的if判断里添加如下的代码:

// 将炮筒的旋转方向控制在[280,350]之间

if(fRotation > 350 || fRotation < 135 )

fRotation = 350;

else if(fRotation < 280 && fRotation >=135) fRotation = 280;

7、 实现发射炮弹,则需要添加一个自定义函数OnMouseClick,如果系统捕获到鼠标单击消息,则调用该函数。使用if判断,如果此时m_fPaodanLeftTime小于或等于0,则说明可以发射炮弹,再创建炮弹精灵,使用SpriteMoveTo函数使其移动到准心位置即可。

1) 进入LessonX.h,添加该自定义函数的声明:

void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY );

2) 进入LessonX.cpp中添加该函数的定义:

void CGameMain::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY ) { }

3) 首先判断游戏状态是否是初始化或进行中,以及m_fPaodanLeftTime是否小于

或等于0,在上面的函数里面添加一个if判断:

static int iNum = 0;

char szName[128];

if(m_iGameState && iMouseType==0 && m_fPaodanLeftTime<=0) { }

4) 此时表明发射了炮弹,重新设置m_fPaodanLeftTime的值,获取炮口链接点的

坐标作为炮弹的初始位置:

m_fPaodanLeftTime = 0.5f;

float fPosX, fPosY;

fPosX = m_pDapao->GetSpriteLinkPointPosX(1); fPosY = m_pDapao->GetSpriteLinkPointPosY(1);

5) 创建炮弹精灵,设置其世界边界的限制和初始位置: sprintf(szName, \

CSprite* tmpSprite =new CSprite(szName); tmpSprite->CloneSprite(\

tmpSprite->SetSpriteWorldLimit(WORLD_LIMIT_NULL,m_fScreenLeft-10.f,m_fScreenTop-10.f,m_fScreenRight+10.f,m_fScreenBottom+10.f);

tmpSprite->SetSpritePosition(fPosX, fPosY);

6) 调用SpriteMoveTo函数使炮弹向准心位置移动,同时将该炮弹保存到炮弹向量

数组m_vPaodan中:

tmpSprite->SpriteMoveTo(fMouseX, fMouseY, 50, false);

m_vPaodan.push_back(tmpSprite);

7) 在Main.cpp中的OnMouseClick函数里面添加自定义函数的调用代码: g_GameMain.OnMouseClick(iMouseType,fMouseX,fMouseY);

8、 判断精灵与世界边界的碰撞,需要知道是哪个炮弹精灵,然后再将该精灵删除即可。

1) 进入LessonX.h中添加查找炮弹精灵函数FindPaoDanSpriteByName以及响应世

界边界碰撞的自定义函数OnSpriteColWorldLimit的声明:

void CSprite*

OnSpriteColWorldLimit( const char *szName, const int iColSide ); FindPaoDanSpriteByName(const char* szName);

2) 在LessonX.cpp中添加以上两个函数的定义:

CSprite* CGameMain::FindPaoDanSpriteByName(const char* szName) { }

void CGameMain::OnSpriteColWorldLimit( const char *szName, const int iColSide ) { }

3) 首先变量炮弹精灵数组m_vPaodan,查找与传进去的精灵名称相同的炮弹精灵,

并将其返回,在FindPaoDanSpriteByName函数定义里面添加如下代码:

for(int i=0;i

}

if(strcmp(m_vPaodan[i]->GetName(),szName)==0) { }

return m_vPaodan[i];

4) 如果系统检测到精灵碰撞世界边界,判断是否是炮弹精灵,如果是则将其删除,

在OnSpriteColWorldLimit定义中添加如下代码:

if(strstr(szName, \ {

}

CSprite* tmpSprite=FindPaoDanSpriteByName(szName); tmpSprite->DeleteSprite();

5) 在Main.cpp中的OnSpriteColWorldLimit添加对自定义函数的调用代码:

g_GameMain.OnSpriteColWorldLimit(szName,iColSide);

实验四显示多架飞碟

【实验内容】

步骤一、初始化显示飞碟

步骤二、处理飞碟与世界边界的碰撞

【实验思路】

随机飞碟出现的x坐标位置,以精灵模板ufo_muban0创建飞碟精灵,同时调用