当前位置: 首页 > article >正文

游戏开发 游戏开始界面

目录

前言

一  游戏初始化界面的分析

二  游戏的大概框架

三 显示界面的开发 

四  完整代码 

总结


我们可以来看看游戏初始界面是什么样的

勇士游戏样例


前言

这里是开发游戏的初始界面


一  游戏初始化界面的分析

我们需要一个背景图,开始游戏图标,显示图标
 

 
首先我们先需要收集资源如:背景,游戏开始图标,显示的图标
有人问:为什么一个背景是白的留一个图标,一个是黑的图标是白的,这个黑白的是掩码图,使用来我们实现透明效果的,就是在窗口只显示图标,而不显示图片的背景,增加美观,至于掩码图怎么弄,我这里推一个视频,运用ps一下就可以做出来
【PS学习】Easyx 掩码图 \反白图 \黑白贴图 \透明贴图 制作_哔哩哔哩_bilibili
 

二  游戏的大概框架

#define _CRT_SECURE_NO_WARNINGS 1

#include"tool.h"
#include"attribute.h"
int main() {
	initgraph(WIN_LONG, WIN_WIDTH);
	welcome();
	loading();

	runwrold();
	loading();

	while (1) {
		int level = mapmain();
		if (level == 1) {
			loading();
	        level1main();
		}
		mciSendString("stop ./image\\begingame.mp3 ", 0, 0, 0);
		mciSendString("close ./image\\begingame.mpload.mp33 ", 0, 0, 0);
		loading();
		runwrold();
	}
}

这个是游戏的框架,这篇文章就是实现welcome()
welcome()函数框架
1  图片的初始化
2  图片的放置
3  鼠标的是否触碰显示图标
4  鼠标是否点击

三 显示界面的开发 

首先我们进入游戏的时候是需要播放音乐的

char image[60];
mciSendString("open ./image\\begingame.mp3", 0, 0, 0);
mciSendString("play ./image\\begingame.mp3 repeat", 0, 0, 0);

上面那个数组是用来放置图片的,我们来看下面那个
第二句分析

MCIERROR mciSend(
String  LPCTSTR lpszCommand,   // 指向命令字符串的指针
  LPTSTR lpszReturnString, // 指向返回字符串的缓冲区指针
  UINT cchReturn,         // 返回字符串缓冲区的大小
  HANDLE hwndCallback     // 回调窗口句柄
);
  1. lpszCommand
    这是第一个参数,是一个指向命令字符串的指针。它包含了你希望执行的 MCI 命令,例如 "play MySound""stop MySound"

  2. lpszReturnString
    这是第二个参数,是一个指向返回字符串的指针。如果命令执行成功,MCI 会将一些返回信息存储在这个缓冲区中。如果不需要返回信息,可以传入 NULL

  3. cchReturn
    这是第三个参数,表示返回字符串缓冲区的大小(以字符为单位)。如果第二个参数是 NULL,这个参数也应该是 0

  4. hwndCallback
    这是第四个参数,是一个窗口句柄,用于接收 MCI 命令执行过程中的通知消息。如果回调不需要通知,可以传入 NULL0

综上所述:第一个就是用于执行命令的 第二个是用于把一些信息返回到缓冲区的 第三个是返回字符串缓冲区的 第四个就是窗口和你内部代码的互动的

当然我们现在这部游戏没有如此的复杂,所以我们只需要掌握第一个形参即可,我们来分析如何书写

"open ./image\\begingame.mp3 "

对于这个执行命令的输入格式是这样的
<command> [<device>] [<parameters>]

  • <command>:表示要执行的操作,例如 playstopopenclose 等。

  • <device>:可以是设备别名(alias)或设备类型(如 waveaudio)。

  • <parameters>:是命令的附加参数,例如文件路径、播放选项等。

所以第一个是open是打开意思,然后后面是你的文件路径,这个文件路径很简单,就是你文件放置在哪里,中间这个就是你取得别名,这个一般是不需要写的,但是如果你要写的话,就类似于这个,前面加一个alias就好了,这个设备类型得话,我们这里选的是文件路径的话就不需要管这个设备类型

mciSendString("open \"./image\\begingame.mp3\" alias MySound", NULL, 0, NULL);

mciSendString("play MySound", NULL, 0, NULL);  // 播放
mciSendString("stop MySound", NULL, 0, NULL);  // 停止
mciSendString("close MySound", NULL, 0, NULL); // 关闭

然后就是加载图片了

//begin game picture
sprintf(image, "./image\\gamebegin.jpg");
loadimage(&gamebegin, image, 1150, 600);

sprintf(image, "./image\\beginback.jpg");
loadimage(&keyback, image, 260, 260);

sprintf(image, "./image\\begin.jpg");
loadimage(&key, image, 260, 260);
updateBg();

//button control
sprintf(image, "./image\\fight.jpg");
loadimage(&fight, image);

sprintf(image, "./image\\fight1back.jpg");
loadimage(&fightback, image);

 这个十分的简单哈,看过我天天酷跑开发的肯定知道怎么写了
首先就是用sprintf来把这个文件名字存入到这个里面,然后再把这个文件运用loadimage加载到我们前面定义的IMAGE变量里面

IMAGE gamebegin;
IMAGE keyback;
IMAGE key;
IMAGE fightback;
IMAGE fight;

然后就是加载图片了

void updateBg() {
	BeginBatchDraw();
	putimage(0, 0, &gamebegin);
	putimage(WIN_LONG / 2 - 500, WIN_WIDTH / 2 + 40, &keyback, NOTSRCERASE);
	putimage(WIN_LONG / 2 - 500, WIN_WIDTH / 2 + 40, &key, SRCINVERT);
	EndBatchDraw();
}

这里就是把这个背景和图标显示到这个界面里面来
首先把这个背景写进来,然后就是开始游戏的图标了
然后就是透明图的制作,这里运用了颜色的反转我们不需要深入研究,深入研究也学不到什么,只要记住这么写就好了,前面放白底由图标的图,后面放黑底无图标的图
前面两个就是x和y的坐标了
这个begin和end就是把这三个图全部加载到缓冲区之后再加载出来的意思

判断是否由触碰

bool isMouseOnButton(int mouseX, int mouseY) {
	return (mouseX >= BUTTON_X+55 && mouseX <= BUTTON_X+210  &&
		mouseY >= BUTTON_Y+40 && mouseY <= BUTTON_Y+150 );
}

 我们来分析这个函数,这个就是传入你的鼠标的X和Y,然后进行判断,这个return如果是真就是0,是假就是1,我们可以根据这个来进行判断是否触碰,这个后面所相加的数字一般是图片的长与宽,这个就是一个矩形的判断区域

鼠标和结束
 

void keyevent1() {
	while (true) {
		// 获取鼠标消息
		MOUSEMSG msg = GetMouseMsg();  
		int mouseX = msg.x, mouseY = msg.y;
		//进行清屏操作,防止fight按钮持续出现
		cleardevice();
		putimage(0, 0, &gamebegin);
		putimage(WIN_LONG / 2 - 500, WIN_WIDTH / 2 + 40, &keyback, NOTSRCERASE);
		putimage(WIN_LONG / 2 - 500, WIN_WIDTH / 2 + 40, &key, SRCINVERT);
		if (isMouseOnButton(mouseX, mouseY)) {
			/*这里由于无法使用透明化这个黄色,所以我们设计另外的,注意图片还有算自己的宽度0*/
			BeginBatchDraw();
			putimage(BUTTON_X + 210 + 40, BUTTON_Y + 80, &fightback, NOTSRCERASE);
			putimage(BUTTON_X + 210 + 40, BUTTON_Y + 80, &fight, SRCINVERT);
			EndBatchDraw();

			if (msg.uMsg == WM_LBUTTONDOWN) {
				break;
			}
		}
		Sleep(10);
	}
	cleardevice();
	mciSendString("stop ./image\\begingame.mp3", 0, 0, 0);
	mciSendString("close ./image\\begingame.mp3", 0, 0, 0);
}

 首先我们先定义一个鼠标的全部信息的变量msg,msg所等于的函数是获取当前鼠标的具体信息,
因为我们要有图标在旁边显示,我们贴上去就要里面清除,所以就要cleardevice()函数,cleardevice()函数后面是放置背景和开始游戏的图标,要不然清除了就没了,然后我们再进行判断
我们把鼠标现在具体的信息放进到我们自己写的判断函数里面取就好了,然后如果为真,就显示图标,然后我们再判断是否点击,就后面的if语句,里面后面那个是系统自己写的点击的值,然后如相等就是突出,然后没有就先短暂休眠一下,为了保持流畅,然后如果if为真就会结束外面的循环,然后后面就是清理屏幕为加载界面创建空间,然后再进行关闭音乐就好了

 

四  完整代码 
 

#include"attribute.h"
#include"tool.h"

IMAGE gamebegin;
IMAGE keyback;
IMAGE key;
IMAGE fightback;
IMAGE fight;

//判断是否点击了之后是否在按钮的范围
//加减是偏移量,由于图片本身有空白的
bool isMouseOnButton(int mouseX, int mouseY) {
	return (mouseX >= BUTTON_X+55 && mouseX <= BUTTON_X+210  &&
		mouseY >= BUTTON_Y+40 && mouseY <= BUTTON_Y+150 );
}

void updateBg() {
	BeginBatchDraw();
	putimage(0, 0, &gamebegin);
	putimage(WIN_LONG / 2 - 500, WIN_WIDTH / 2 + 40, &keyback, NOTSRCERASE);
	putimage(WIN_LONG / 2 - 500, WIN_WIDTH / 2 + 40, &key, SRCINVERT);
	EndBatchDraw();
}

void keyevent1() {
	while (true) {
		// 获取鼠标消息
		MOUSEMSG msg = GetMouseMsg();  
		int mouseX = msg.x, mouseY = msg.y;
		//进行清屏操作,防止fight按钮持续出现
		cleardevice();
		putimage(0, 0, &gamebegin);
		putimage(WIN_LONG / 2 - 500, WIN_WIDTH / 2 + 40, &keyback, NOTSRCERASE);
		putimage(WIN_LONG / 2 - 500, WIN_WIDTH / 2 + 40, &key, SRCINVERT);
		if (isMouseOnButton(mouseX, mouseY)) {
			/*这里由于无法使用透明化这个黄色,所以我们设计另外的,注意图片还有算自己的宽度0*/
			BeginBatchDraw();
			putimage(BUTTON_X + 210 + 40, BUTTON_Y + 80, &fightback, NOTSRCERASE);
			putimage(BUTTON_X + 210 + 40, BUTTON_Y + 80, &fight, SRCINVERT);
			EndBatchDraw();

			if (msg.uMsg == WM_LBUTTONDOWN) {
				break;
			}
		}
		Sleep(10);
	}
	cleardevice();
	mciSendString("stop ./image\\begingame.mp3", 0, 0, 0);
	mciSendString("close ./image\\begingame.mp3", 0, 0, 0);
}

 void welcome() {
		char image[60];
		mciSendString("open ./image\\begingame.mp3", 0, 0, 0);
		mciSendString("play ./image\\begingame.mp3 repeat", 0, 0, 0);
		//begin game picture
		sprintf(image, "./image\\gamebegin.jpg");
		loadimage(&gamebegin, image, 1150, 600);

		sprintf(image, "./image\\beginback.jpg");
		loadimage(&keyback, image, 260, 260);

		sprintf(image, "./image\\begin.jpg");
		loadimage(&key, image, 260, 260);
		updateBg();
		
		//button control
		sprintf(image, "./image\\fight.jpg");
		loadimage(&fight, image);

		sprintf(image, "./image\\fight1back.jpg");
		loadimage(&fightback, image);
		keyevent1();
}

前面的预处理指令就是包含了一些需要的库函数,系统自己带的,然后我只是懒得每次写的就直接全部放在一起方便些


总结

今天我们学习游戏开始界面的开发和游戏的大概框架,游戏开始界面的开发主要是鼠标的互动,我们只需要MOUSEMSG这个类型知道就好,然后这个里面由x,y与是uMsg这个后面可以理解这个u为use为使用的意思
1  鼠标的互动
2  掩码图
3  加载图和放置图


http://www.kler.cn/a/559087.html

相关文章:

  • 【Blender】二、建模篇--06,曲线建模/父子级和蒙皮修改器
  • 简识MQ之Kafka、ActiveMQ、RabbitMQ、RocketMQ传递机制
  • MQTT实现智能家居------3、源码分析(超详细)
  • AI性能极致体验:通过阿里云平台高效调用满血版DeepSeek-R1模型
  • 浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器
  • 什么是HTTP/2协议?NGINX如何支持HTTP/2并提升网站性能?
  • 使用 AndroidNativeEmu 调用 JNI 函数
  • Python爬虫处理网页中的动态内容
  • 嵌入式硬件篇---数字电子技术中的时序逻辑
  • GeoHD - 一种用于智慧城市热点探测的Python工具箱
  • GPU和FPGA的区别
  • opencv 自适应阈值
  • 蓝桥杯定时器实现led闪烁
  • 每日一题——主持人调度(二)
  • 开源RAG主流框架有哪些?如何选型?
  • NI Multisim仿真实现39计数器
  • 【c++】string类详解
  • 课程分享 | 安全系统建设的挑战与解决方案
  • 周末总结(2024/02/22)
  • Linux的目录结构