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
2、 因为用到vector容器,因此需要在LessonX.h中添加头文件和声明命名空间:
#include
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;i
速度赋给它,最后判断是碰到哪个边界再决定是否翻转鱼的图片:
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: