01北科大暑期计算机实践FunCode游戏设计+C++课程设计_海底世界 下载本文

2、 首先检测是否是鱼碰撞到了边界,在该函数里面添加如下代码,判断碰到世界边界

的精灵是否为yu_0:

bool bFlip; float fSpeedX;

if(strcmp(szName, \ { }

3、 如果鱼碰撞到的是右边的边界,则图片翻转,鱼的速度为负速度,即反方向速度,

在上面的if中添加如下代码:

if(iColSide == 1) // 右边 { bFlip = true; fSpeedX = -15.f; } 4、 如果碰到的是左边界,则图片不翻转,鱼的速度为正速度:

else if(iColSide == 0) // 左边 { bFlip = false; fSpeedX = 15.f; } 5、 最后调用函数,使鱼的图片改变,设置鱼的速度:

m_pFish->SetSpriteFlipX( bFlip); m_pFish->SetSpriteLinearVelocity(fSpeedX, 0);

实验五多条鱼同时来回游动

【实验内容】

步骤一、通过鱼的模板创建多条鱼的精灵

步骤二、鱼碰撞到边界后设置鱼的速度为反方向

【实验思路】

使用for循环,通过鱼的模板利用CloneSprite函数创建鱼精灵,设置它的边界限制,给它一个初始的速度,最后将该鱼精灵加入到m_vFish向量数组中保存下来。

当系统检测到鱼碰撞到世界边界的时候调用SetSpriteLinearVelocity函数使鱼的速度为原来速度的相反数,如原来是15.f,碰撞后为-15.f,原来是-15.f,碰撞后为15.f。再调用SetSpriteFlipX函数是鱼的图片翻转,让鱼继续游动即可。

【实验指导】

1、 进入LessonX.h添加如下的成员变量声明,来创建一个保存鱼的容器对象:

vector m_vFish;

2、 因为用到vector容器,因此需要在LessonX.h中添加头文件和声明命名空间:

#include using namespace std;

3、 在LessonX.cpp中的GameInit函数里面添加如下的代码:

// 生成多条鱼精灵

for(int i=0; i<4; i++) {

char szName[128]; float fPosX, fPosY; float fSpeedX;

//将szName的值赋为”fish”加I,级循环因子 sprintf(szName, \

CSprite* tmpSprite=new CSprite(szName); tmpSprite->CloneSprite(\创建精灵 }

4、 随机生成鱼的位置,并设置它的世界边界限制。在上面的for循环里添加:

fPosX = CSystem::RandomRange(m_fScreenLeft+10.f, m_fScreenRight-10.f); fPosY = CSystem::RandomRange(m_fScreenTop+10.f,m_fScreenBottom-10.f);

tmpSprite->SetSpritePosition(fPosX, fPosY); tmpSprite->SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft-20.f, m_fScreenTop, m_fScreenRight+20.f, m_fScreenBottom); 5、 最后随机生成鱼的速度,并将它放入m_vFish数组中保存:

fSpeedX = CSystem::RandomRange(10, 20); tmpSprite->SetSpriteLinearVelocity(fSpeedX, 0); m_vFish.push_back(tmpSprite);

push_back函数是c++中vector的内置操作,作用是将元素存放在数组的最后面。 6、 处理多条鱼与世界边界的碰撞的问题,需要添加一个自定义查找某条鱼的函数

FindSpriteByName

1) 在LessonX.h中添加该函数的声明:

CSprite* FindSpriteByName(const char* szName);

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

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

3) 使用for循环遍历数组,找到与传进去的精灵名称相同的鱼并返回即可。在上

面的函数定义里面添加如下的代码:

for(int i=0;iGetName())==0) return m_vFish[i]; 7、 系统检测到鱼碰撞了世界边界,则使用FindSpriteByName函数找到该鱼并随机生成

速度赋给它,最后判断是碰到哪个边界再决定是否翻转鱼的图片:

1) 就首先检测是否是鱼碰撞到了边界,在该函数里面添加如下代码,判断碰到世

界边界的精灵是否为克隆yu_2的精灵: if(strstr(szName,\ { }

2) 如果鱼碰撞到的是右边的边界,则图片翻转,鱼的速度为负速度,用函数随意

生成鱼的速度值,在上面的if中添加如下代码:

if(iColSide == 1) // 右边 { bFlip = true; fSpeedX = -CSystem::RandomRange(10, 20); }

3) 如果碰到的是左边界,则图片不翻转,鱼的速度为正速度:

else if(iColSide == 0) // 左边 { bFlip = false; fSpeedX = CSystem::RandomRange(10, 20); }

4) 再调用函数找到哪条鱼碰撞了世界边界判断是否翻转并设置速度。

CSprite* tmpSprite=FindSpriteByName(szName); tmpSprite->SetSpriteFlipX(bFlip); tmpSprite->SetSpriteLinearVelocity(fSpeedX, 0); fPosY=CSystem::RandomRange(m_fScreenTop+10.f,

m_fScreenBottom-10.f);

//因为有不同的鱼,因此随机生成Y方向的速度后需要分配给不同的 //鱼,这样多条鱼就不会重复了

tmpSprite->SetSpritePositionY(fPosY);

实验六键盘控制鱼的游动

【实验内容】

步骤、响应系统按键消息移动鱼

【实验思路】

当键盘上的W(表示向上方向)A(表示向左方向)S(表示向下方向)D(表示向右方向)按键中的一个按下后,给鱼一个初始速度并按该按键代表的方向游动,当按键释放后将鱼的速度设置为0,使其停止。

【实验指导】

1、 在静态精灵视图中添加一个鱼精灵到地图中并按下图位置摆放。在“编辑”->“程

序接口”中设置名称为myfish

2、 在LessonX.h中添加以下的成员变量声明:

CSprite* m_pMyFish;

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

m_pMyFish=new CSprite(\

4、 处理键盘按下消息需要添加一个自定义函数OnKeyDown:

1) 在LessonX.h中添加该函数的声明:

void OnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress );

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

void CGameMain::OnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress ) { } 3) 判断按下的按键键值并给响应方向的速度值,在上面的函数里面添加如下代码:

float fSpeedX=0.f,fSpeedY=0.f; switch(iKey) {

case KEY_W:

fSpeedY= -10.f; //向上的时候Y方向速度为负的 break; case KEY_A: fSpeedX= -15.f; //向左的时候X方向的速度为负值 break; case KEY_S: fSpeedY= 10.f; //向下的时候Y方向的速度为正值 break; case KEY_D: