05 C语言课程设计_迷你高尔夫 联系客服

发布时间 : 星期三 文章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 )