扫雷讲义(作业)

这是一份关于扫雷游戏设计的讲义,详细介绍了游戏的实现过程和功能。主要内容包括初始化难度和布尔变量、渲染游戏场景、实现计时功能,以及鼠标左键单击和双击、右键单击的逻辑判断。主循环由初始化、输入、逻辑判断和输出组成,通过 IniData() 和 LoadMediaData() 函数设置雷区和加载素材。同时,讲解了 DrawGrid(), DrawButton(), DrawTimer(), DrawScore() 等函数在界面绘制中的作用。讲义还涵盖了输入响应,如 LButtonDown(), LButtonDblClk(), RButtonDown() 方法,用于处理鼠标不同操作。" 131222016,18996450,4G_Lora土壤监测:Lora传感器数据经WiFi/4G传输,"['物联网', '单片机', 'Lora技术', 'Modbus协议', '数据传输']
摘要由CSDN通过智能技术生成

前言

此讲义是根据《游戏课程设计》李老师的课堂代码,所写的设计过程讲义。
主要对游戏整体框架进行拆解和分析。

实现的功能

  1. 场景,雷,按钮的基本布置。
  2. 计时功能的实现。
  3. 鼠标左键单击可以翻开所选块面。
  4. 鼠标右键单击可以插旗标记所选块面为雷。
  5. 鼠标左键双击可以检测所选的块面周围一圈是否已经查找出所有雷。

主函数

根据渲染驱动游戏的思想,可以得到以下主循环。

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++)
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值