扫雷游戏设计过程讲义
前言
此讲义是根据《游戏课程设计》李老师的课堂代码,所写的设计过程讲义。
主要对游戏整体框架进行拆解和分析。
实现的功能
- 场景,雷,按钮的基本布置。
- 计时功能的实现。
- 鼠标左键单击可以翻开所选块面。
- 鼠标右键单击可以插旗标记所选块面为雷。
- 鼠标左键双击可以检测所选的块面周围一圈是否已经查找出所有雷。
主函数
根据渲染驱动游戏的思想,可以得到以下主循环。
void Game::Run()
{
do {
Initial();
while (window.isOpen() && gameOver == false)
{
Input();
Logic();
Draw();
}
}
主循环主要分为初始化,输入,逻辑判断,输出。
初始化 难度以及布尔变量
void Game::Initial()
{
window.setFramerateLimit(60); //每秒设置目标帧数
gridSize = GRIDSIZE;//---->点击的位置的块的大小
switch (gameLvL)
{
case 1:
stageWidth = LVL1_WIDTH;
stageHeight = LVL1_HEIGHT;
mMineNum = LVL1_NUM;//初始化雷的个数
break;
case 2:
stageWidth = LVL2_WIDTH;
stageHeight = LVL2_HEIGHT;
mMineNum = LVL2_NUM;//初始化雷的个数
break;
case 3:
stageWidth = LVL3_WIDTH;
stageHeight = LVL3_HEIGHT;
mMineNum = LVL3_NUM;//初始化雷的个数
break;
default:
break;
}
gameOver = false;
gameQuit = false;
isGameOverState = ncNO;
mFlagCalc = 0;//初始化旗子的数量
isGameBegin = false;//初始化游戏是否开始
mTime = 0;
mCornPoint.x = (Window_width - stageWidth * GRIDSIZE) / 2;
mCornPoint.y = (Window_height - stageHeight * GRIDSIZE) / 2;
IniData();//初始化数据
LoadMediaData();//加载素材
}
其中IniData()和LoadMediaData()分别初始化雷的二维排列数组,提前载入贴图素材。
贴图载入方法
tBackground.loadFromFile(" ");
sBackground.setTexture(tBackground);
雷的数组
void Game::IniData()
{
int i, j;
for (j = 0; j < stageHeight; j++)//所有块置为空且未点击
for (i = 0; i < stageWidth; i++)
{
mGameData[j][i].mState = ncUNDOWN;
mGameData[j][i].isPress = false;
}
}
渲染
void Game::Draw()
{
//window.clear(Color::Color(255, 0, 255, 255)); //清屏
window.clear(); //清屏
//Prompt_info(width*GRIDSIZE + GRIDSIZE, GRIDSIZE);
//绘制背景
sBackground.setPosition(0, 0);
window.draw(sBackground);
//绘制舞台
DrawGrid();
DrawButton();
DrawTimer();
DrawScore();
if (isGameOverState)
DrawGameEnd();
window.display(); //把显示缓冲区的内容,显示在屏幕上。SFML采用的是双缓冲机制
}
其中
DrawGrid()负责绘制基本的块面
void Game::DrawGrid()
{
for (int j = 0; j < stageHeight; j++)