发布时间 : 星期三 文章05 C语言课程设计_迷你高尔夫更新完毕开始阅读e2776ea62af90242a995e500
if( RIGID_BLOCK == g_iGridData[iLoopY][iLoopX] ) {
szName = dMakeSpriteName( \ dCloneSprite( \ MoveSpriteToBlock( szName, iLoopX, iLoopY ); g_iRigidBlockCount++; }
else if( BLACK_HOLE == g_iGridData[iLoopY][iLoopX] ) {//如果是黑洞就建立黑洞
szName = dMakeSpriteName( \dCloneSprite( \MoveSpriteToBlock( szName, iLoopX, iLoopY ); g_iBlackHoleCount++; }
else if( GOLF_EXIT == g_iGridData[iLoopY][iLoopX] ) {//如果是出口,就出去
szName = dMakeSpriteName( \ dCloneSprite( \ MoveSpriteToBlock( szName, iLoopX, iLoopY ); g_iGolfExitCount++; }
2、 最后将控制球和指示箭头摆放到初始位置,此时球静止,因此指示箭头可见。在上
面的两个循环后面添加下面的代码:
// 将控制的球和指示箭头摆放到出生点 dSetSpriteLinearVelocity( \ MoveSpriteToBlock( \ MoveSpriteToBlock( \ dSetSpriteVisible( \至此,本实验结束。
实验四移动球
【实验内容】
步骤一、响应键盘按键按下消息
步骤二、球精灵坐标转换为二维格子数组索引 步骤三、判断移动方向,使球获取速度 【实验思路】 首先响应系统的按键消息函数,然后获取精灵坐标,并将其转换为二维格子中的坐标,判断其旁边的格子是否是方块,如果不是则给球一个移动的速度。 【实验指导】
1、 在Main.cpp中定义dOnKeyDown事件函数:
void OnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress ) { }
2、 首先判断游戏状态,只有在游戏中已经可以移动状态才响应按键,在上面函数中添
加下面的代码: // 只有在游戏中已经可以移动状态才响应按键 if( 2 != g_iGameState || 0 != g_iMoveState ) return;
3、 获取控制球精灵坐标转换到二维格子数组索引,这里我们需要定义两个函数
SpritePosXToIndexX和SpritePosXToIndexY分别处理精灵坐标转换为二维格子的X索引和Y索引:
1) 进入Main.cpp中添加SpritePosXToIndexX的定义:
int SpritePosXToIndexX ( const float fPosX ) { }
2) 首先得到左右边界的坐标值。g_fGridStartX是在方块的中心,所以需要减去
半个方块的宽度才是左边边界。在SpritePosXToIndexX函数定义中添加下面的代码:
// 左右边界坐标值。g_fGridStartX是在方块的中心,所以需要减去半个方块的 // 宽度才是左边边界
const float fLeftSide = g_fGridStartX - g_fGridSize / 2.f; const float fRightSide = fLeftSide + g_fGridSize * GRID_COUNT; 3) 最后需要判断坐标是否出了左右边界,如果没有则返回X索引值。在上面的函
数里面添加下面的判断代码: // 判断是否出了左右边界
if( fPosX < fLeftSide || fPosX > fRightSide ) return -1;
int iIndexX = (int)( (fPosX - fLeftSide) / g_fGridSize ); return iIndexX;
4) 在Main.cpp中添加SpritePosYToIndexY函数的定义:
int SpritePosYToIndexY( const float fPosY ) { }
5) 首先获取上下边界坐标值。g_fGridStartY是在方块的中心,所以需要减去半
个方块的宽度才是上边边界。在上面的函数定义中添加下面的代码:
// 上下边界坐标值。g_fGridStartY是在方块的中心,所以需要减去半个方块的 // 宽度才是上边边界 const float fTopSide = g_fGridStartY - g_fGridSize / 2.f; const float fBottomSide = fTopSide + g_fGridSize * GRID_COUNT; 6) 最后判断是否超过了上下边界,没有则返回Y索引值: // 判断是否出了上下边界
if( fPosY < fTopSide || fPosY > fBottomSide ) return -1;
int iIndexY = (int)( (fPosY - fTopSide) / g_fGridSize ); return iIndexY;
4、 有了上面的两个函数,我们就可以将控制球精灵坐标转换到二维格子数组索引,并
判断坐标是否超出边界,在OnKeyDown函数中添加下面的代码:
// 先将控制球精灵坐标转换到二维格子数组索引 float fPosX = dGetSpritePositionX( \ float fPosY = dGetSpritePositionY( \ int iIndexX = SpritePosXToIndexX( fPosX ); int iIndexY = SpritePosYToIndexY( fPosY ); if( iIndexX < 0 || iIndexX >= GRID_COUNT || iIndexY < 0 || iIndexY >= GRID_COUNT ) return;
5、 根据上下左右方向键,先判断控制球旁边是否是方块,如果是方块则不能移动。不
是方块,则给予控制球一个速度 使用iIndexX, iIndexY的时候,注意要判断是否是边缘的索引,如果不判断就进行加1减1,访问数组会造成下标溢出,即如果要判断左边是否是方块阻挡,则索引值为 IndexX - 1 。此时必须先判断iIndexX大于0,才能减一。如果iIndexX为0,代表直接可以移动如果是按下向上方向键: if( KEY_UP == iKey ) {
if( iIndexY > 0 && RIGID_BLOCK == g_iGridData[iIndexY - 1][iIndexX] ) return;
// 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头 g_iMoveState = 1;
dSetSpriteLinearVelocityY( \ dSetSpriteVisible( \}
// TODO 按下方向键,控制球移动:
// 参考上面的if代码,完成下、左、右三个方向的控制代码 else if( KEY_DOWN == iKey ) {
if( iIndexY < GRID_COUNT - 1 && RIGID_BLOCK == g_iGridData[iIndexY + 1][iIndexX] ) return;
// 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头 g_iMoveState = 2;
dSetSpriteLinearVelocityY( \ dSetSpriteVisible( \}
else if( KEY_LEFT == iKey ) {
if( iIndexX > 0&&RIGID_BLOCK == g_iGridData[iIndexY][iIndexX -1]) return;
// 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头 g_iMoveState = 3;
dSetSpriteLinearVelocityX( \ dSetSpriteVisible( \
}
else if( KEY_RIGHT == iKey ) {
if(iIndexX // 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头 g_iMoveState = 4; dSetSpriteLinearVelocityX( \ dSetSpriteVisible( \} 至此,本实验结束。 实验五 球运动情况的处理 【实验内容】 步骤一、获得球所在边缘格子信息 步骤二、不同格子分情况处理 【实验思路】 获取球精灵的当前坐标并将其转换为二维格子的坐标,判断在运动中球边缘的情况,如果已经出了边界则不需要再判断,否则如果是方块则球停靠、是黑洞则重新开始关卡、是出口则通关。 【实验指导】 1、 进入Main.cpp中的while循环当中,移动状态为移动中,时刻监测控制球的移动情 况,根据移动方向的下一个方块,进行对应的处理。添加下面的if判断: if( 0 != g_iMoveState ) { } 2、 先将控制球精灵坐标转换到二维格子数组索引,如果控制球已经出了边界,所以不需 要再判断。在上面的判断里面添加下面的代码: // 先将控制球精灵坐标转换到二维格子数组索引 float fPosX = dGetSpritePositionX( \ float fPosY = dGetSpritePositionY( \ int iIndexX = SpritePosXToIndexX( fPosX ); int iIndexY = SpritePosYToIndexY( fPosY ); // 控制球已经出了边界,所以不需要再判断 if( iIndexX < 0 || iIndexX >= GRID_COUNT || iIndexY < 0 || iIndexY >= GRID_COUNT ) return; 3、 根据当前方向,获得控制球边缘所在的格子信息(球在坐标是在中心点,所以加上球 的大小的一半)。总共有4中方向,即上下左右,分别用1、2、3、4来表示,添加下面的代码: 4、 // 根据当前方向,获得控制球边缘所在的格子信息(球在坐标是在中心点,所以加上 球的大小的一半) float fNextPosX = fPosX; float fNextPosY = fPosY; if( 1 == g_iMoveState )