当前位置:首页 > 05+C++课程设计 - 迷你高尔夫 - 图文
#define #define #define
RIGID_BLOCK BLACK_HOLE GOLF_EXIT
1 2 3
// 以下3个分别为方块阻挡物、黑洞、出口的值
3、 进入LessonX.cpp中添加上面的成员变量的初始化:
1) 在构造函数中把m_iGameState的值由0改为1:
m_iGameState = 1; 2) 在构造函数中添加下面代码:
m_iRigidBlockCount m_iBlackHoleCount m_iGolfExitCount m_iCurLevel
= = = =
0; 0; 0; 1;
//球的初始X坐标 //球的初始Y坐标
// 本关卡创建的阻挡物方块数量 // 本关卡创建的黑洞数量
m_iControlStartX = 0; m_iControlStartY = 0;
3) 对于const类型的成员变量,我们需要在函数外面单独进行初始化,在文件最后面添加如下代码:
const float CGameMain::m_fGridStartX const float CGameMain::m_fGridStartY
=-27.5f; =-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},
RIGID_BLOCK, RIGID_BLOCK, RIGID_BLOCK,0, 0, 0,
0, 0, 0,
0, 0, 0,
{0, 0, 0, RIGID_BLOCK, {0, 0, 0, RIGID_BLOCK,
0, 0, 0,
{0, 0, 0, RIGID_BLOCK, {0, 0, 0, RIGID_BLOCK, {0, 0, 0, 0, GOLF_EXIT, {0, 0, 0, 0, 0, 0, 0, 0, };
{0, 0, 0, 0, {0, 0, 0, 0, {0, 0, 0, 0,
RIGID_BLOCK, RIGID_BLOCK, 0, 0, 0},
RIGID_BLOCK, 0, 0, 0}, RIGID_BLOCK, 0, 0, 0}, BLACK_HOLE, 0, 0, 0}, 0, 0, 0, 0, 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, 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、 游戏初始化的时候,首先我们需要将前边添加的精灵全部删除掉,因此需要自定义
的创建清除所有精灵函数ClearAllSprite()来实现这个功能。 1) 进入LessonX.h文件的CGameMain类中添加该函数的声明:
void ClearAllSprite();
2) 在LessonX.cpp最后面添加该函数的定义:
void CGameMain:: ClearAllSprite()
{ }
3) 再使用3个循环,分别将上一关卡创建的3种精灵删除掉。在上边定义的函数
中添加如下代码:
int { }
for( iLoop = 0; iLoop < m_vBlackHole.size(); iLoop++ ) { }
for( iLoop = 0; iLoop < m_vGolfExit.size(); iLoop++ ) {
}
m_vGolfExit[iLoop]->DeleteSprite(); m_vBlackHole[iLoop]->DeleteSprite(); m_vRigidBlock[iLoop]->DeleteSprite();
iLoop
= 0;
for( iLoop = 0; iLoop < m_vRigidBlock.size(); iLoop++ )
其中m_vRigidBlock、m_vBlackHole、m_vGolfExit是存储三种精灵的向量数组,每一个循环都遍历一遍向量数组并调用数组中每个精灵的DeleteSprite函数即可。 m_vRigidBlock.size()、m_vBlackHole.size()、m_vGolfExit.size()表示每种精灵的总数。
4) 最后在GameInit()中添加调用此函数的代码:
ClearAllSprite(); 5、 在GameInit()中,我们也需要对关卡进行选择初始化。因此我们需要自定义一个初
始化关卡函数InitLevel ()来实现这个功能。
1) 进入LessonX.h文件的CGameMain类中添加该函数的声明:
void InitLevel();
2) 在LessonX.cpp最后面添加该函数的定义:
void CGameMain:: InitLevel() { }
3) 初始化关卡,要根据当前关卡,选择关卡的数据,即将代表关卡的二维数组中
的数据拷贝到m_iGridData中,同时设置控制球在每个数组中的起始位置。首先把需要的数据初始化为0,代码如下:
// 总数置0,重新创建 m_iRigidBlockCount m_iBlackHoleCount m_iGolfExitCount =
= = 0;
0; 0;
4) 选择关卡我们使用了switch-case结构,程序通过判断switch中的参数进入到
不同的case中去,每个case就是一种情况的实现。代码如下:
// 根据当前关卡,选择关卡数据 switch( m_iCurLevel ) { case 2:
{
} break; { } break;
// Level1 或者g_iCurLevel错误
m_iControlStartX m_iControlStartY =
= 6;
3;
m_iControlStartX m_iControlStartY =
= 9;
5;
memcpy( m_iGridData, m_iLevelData2, sizeof(int) * GRID_COUNT * GRID_COUNT );
case 3:
memcpy( m_iGridData, m_iLevelData3, sizeof(int) * GRID_COUNT * GRID_COUNT );
case 1: default: };
{ } break;
m_iControlStartX m_iControlStartY =
= 6;
5;
memcpy( m_iGridData, m_iLevelData1, sizeof(int) * GRID_COUNT * GRID_COUNT );
memcpy函数作用是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。因为二维数组在内存中的存放方式是连续的,因此我们将源地址拷贝给m_iGridData的起始地址之后,系统后自动根据m_iGridData的下标来找到正确的值。
5) 最后在GameInit()中添加调用此函数的代码:
InitLevel();
至此,本实验结束。
实验三 初始化游戏精灵
【实验内容】 步骤一、创建精灵
步骤二、初始化精灵位置 【实验思路】
遍历二维数组m_iGridData,根据数组值生成对应的精灵实例:值为0的时候不用创建,需要创建的精灵名字前缀为(按照宏定义的1,2,3顺序):RigidBlock, BlackHole, GolfExit。每创建一种精灵,将其总数加1 :m_iRigidBlockCount, m_iBlackHoleCount,m_iGolfExitCount。 【实验指导】
1、 进入LessonX.h,CGameMain类中添加下面成员变量的声明:
CSprite* m_pControlBall;
CSprite* m_pGolfArrow;
//控制球精灵 //指示箭头精灵
共分享92篇相关文档