05 C++课程设计 - 迷你高尔夫 - 图文 联系客服

发布时间 : 星期六 文章05 C++课程设计 - 迷你高尔夫 - 图文更新完毕开始阅读

3、 进入LessonX.cpp中添加上面的成员变量的初始化:

1) 在构造函数中添加下面代码:

2) m_iRigidBlockCount = 0; // 本关卡创建的阻挡物方块数量

m_iBlackHoleCount = 0; // 本关卡创建的黑洞数量 m_iGolfExitCount = 0; m_iCurLevel = 1;

3) 对于const类型的成员变量,我们需要在函数外面单独进行初始化,在文件最

后面添加如下代码:

const float CGameMain::m_fGridStartX =-27.5f; const float CGameMain::m_fGridStartY =-27.5f; const float CGameMain::m_fGridSize =5.f;

const int CGameMain::m_iLevelData1[GRID_COUNT][GRID_COUNT] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, 0, 0},

{0, 0, 0, RIGID_BLOCK, 0, 0, 0, 0, RIGID_BLOCK, 0, 0, 0},

{0, 0, 0, RIGID_BLOCK, 0, 0, 0, 0, RIGID_BLOCK, 0, 0, 0},

{0, 0, 0, RIGID_BLOCK, 0, 0, 0, 0, BLACK_HOLE, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, GOLF_EXIT, RIGID_BLOCK, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

};

const int CGameMain::m_iLevelData2[GRID_COUNT][GRID_COUNT]={

{0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0},

{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0}, {0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0}, {0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0}, {0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},

{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},

{0, RIGID_BLOCK, 0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, 0, RIGID_BLOCK, 0},

{0, RIGID_BLOCK, 0, 0, 0, 0, 0, RIGID_BLOCK, 0, 0, RIGID_BLOCK, 0}, {0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, GOLF_EXIT, RIGID_BLOCK, RIGID_BLOCK, 0},

{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},

{0, RIGID_BLOCK, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, RIGID_BLOCK, 0}

};

const int CGameMain::m_iLevelData3[GRID_COUNT][GRID_COUNT]={ {0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, 0, 0},

{0, 0, RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, RIGID_BLOCK},

{RIGID_BLOCK, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, GOLF_EXIT, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, RIGID_BLOCK, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0},

{0, 0, 0, RIGID_BLOCK, 0, 0, 0, 0, 0, 0, RIGID_BLOCK, 0}, {0, 0, 0, 0, BLACK_HOLE, RIGID_BLOCK, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} };

二维数组中0表示该位置不创建精灵,否则根据不同的值创建不同精灵,RIGID_BLOCK(值为1)表示创建一个方块精灵,BLACK_HOLE(值为2)表示创建一个黑洞精灵,GOLF_EXIT(值为3)表示创建一个出口精灵。

4) 进入GameInit函数里面,将球的运动状态初始化为静止,添加下面代码:

m_iMoveState=0;

4、 进入GameInit函数,使用3个循环,分别将上一关卡创建的3种精灵删除掉,添

加如下代码:

int iLoop = 0; for( iLoop = 0; iLoop < m_vRigidBlock.size(); iLoop++ ) { m_vRigidBlock[iLoop]->DeleteSprite(); } for( iLoop = 0; iLoop < m_vBlackHole.size(); iLoop++ ) { m_vBlackHole[iLoop]->DeleteSprite(); } for( iLoop = 0; iLoop < m_vGolfExit.size(); iLoop++ ) {

m_vGolfExit[iLoop]->DeleteSprite(); }

其中m_vRigidBlock、m_vBlackHole、m_vGolfExit是存储三种精灵的向量数组,每一个循环都遍历一遍向量数组并调用数组中每个精灵的DeleteSprite函数即可。 m_vRigidBlock.size()、m_vBlackHole.size()、m_vGolfExit.size()表示每种精灵的总数。

5、 根据当前关卡,选择关卡的数据,即将代表关卡的二维数组中的数据拷贝到

m_iGridData中,同时设置控制球在每个数组中的起始位置。代码如下:

// 总数置0,重新创建 m_iRigidBlockCount = 0; m_iBlackHoleCount = 0; m_iGolfExitCount = 0;

// 控制球在数组中的开始位置(出生点),该位置不能为0.根据关卡数据自行指定 int iControlStartX = 0, iControlStartY = 0;

6、 选择关卡我们使用了switch-case结构,程序通过判断switch中的参数进入到不

同的case中去,每个case就是一种情况的实现。代码如下:

// 根据当前关卡,选择关卡数据 switch( m_iCurLevel ) { case 2: { iControlStartX = 5; iControlStartY = 9;

memcpy( m_iGridData, m_iLevelData2, sizeof(int) * GRID_COUNT * GRID_COUNT );

} break; case 3: { iControlStartX = 3; iControlStartY = 6;

memcpy( m_iGridData, m_iLevelData3, sizeof(int) * GRID_COUNT * GRID_COUNT );

} break; // Level1 或者g_iCurLevel错误 case 1: default: { iControlStartX = 5; iControlStartY = 6;

memcpy( m_iGridData, m_iLevelData1, sizeof(int) * GRID_COUNT * GRID_COUNT );

} break; };

7、 memcpy函数作用是从源src所指的内存地址的起始位置开始拷贝n个字节到目标

dest所指的内存地址的起始位置中。因为二维数组在内存中的存放方式是连续的,因此我们将源地址拷贝给m_iGridData的起始地址之后,系统后自动根据m_iGridData的下标来找到正确的值。 至此,本实验结束。

实验三 游戏精灵初始化

【实验内容】 步骤一、创建精灵

步骤二、初始化精灵位置 【实验思路】

遍历二维数组m_iGridData,根据数组值生成对应的精灵实例:值为0的时候不用创建,需要创建的精灵名字前缀为(按照宏定义的1,2,3顺序):RigidBlock, BlackHole, GolfExit。每创建一种精灵,将其总数加1 :m_iRigidBlockCount, m_iBlackHoleCount,m_iGolfExitCount。 【实验指导】

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

CSprite* m_pControlBall; //控制球精灵 CSprite* m_pGolfArrow; //指示箭头精灵 2、 在LessonX.cpp中在构造函数里面添加上面成员变量的初始化:

m_pControlBall = new CSprite(\ m_pGolfArrow = new CSprite(\

3、 创建精灵之后需要将精灵移到特定位置,因此我们需要定义一个自定义的函数

MoveSpriteToBlock来实现这个功能。 1) 进入LessonX.h中添加该函数的声明:

void MoveSpriteToBlock( CSprite* tmpSprite, const int iIndexX, const int iIndexY );

2) 在LessonX.cpp最后面添加该函数的定义:

void CGameMain::MoveSpriteToBlock( CSprite* tmpSprite, const int iIndexX, const int iIndexY ) { }

3) 传入该函数的是精灵实体以及x,y坐标参数。再通过SetSpritePosition函数

设置精灵位置,在该函数里面添加如下代码:

float fPosX = m_fGridStartX + iIndexX * m_fGridSize; float fPosY = m_fGridStartY + iIndexY * m_fGridSize; tmpSprite->SetSpritePosition(fPosX, fPosY);

4、 我们通过两个for循环来创建精灵,判断m_iGridData的值,如果为0,则不创建,

如果为RIGID_BLOCK则创建一个方块精灵,为 BLACK_HOLE则创建一个黑洞精灵,为GOLF_EXIT则创建一个出口精灵。由于我们预先在地图中摆放了三个模板精灵,因此只需要使用CloneSprite函数即可创建新的精灵。然后再调用MoveSpriteToBlock函数将精灵移动到指定位置。最后每创建一个实现精灵,将它