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

游戏开发 游戏开始界面

目录

前言

一  游戏初始化界面的分析

二  游戏的大概框架

三 显示界面的开发 

四  完整代码 

总结


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

勇士游戏样例


前言

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


一  游戏初始化界面的分析

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

 
首先我们先需要收集资源如:背景,游戏开始图标,显示的图标
有人问:为什么一个背景是白的留一个图标,一个是黑的图标是白的,这个黑白的是掩码图,使用来我们实现透明效果的,就是在窗口只显示图标,而不显示图片的背景,增加美观,至于掩码图怎么弄,我这里推一个视频,运用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 picturesprintf(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 controlsprintf(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.lryc.cn/news/542454.html

相关文章:

  • Python解析 Flink Job 依赖的checkpoint 路径
  • Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用
  • 计算机视觉算法实战——产品分拣(主页有源码)
  • 汽车软件︱AUTO TECH China 2025 广州国际汽车软件与安全技术展览会:开启汽车科技新时代
  • Visual Studio打开文件后,中文变乱码的解决方案
  • Python爬虫selenium验证-中文识别点选+图片验证码案例
  • MySQL后端返回给前端的时间变了(时区问题)
  • 计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+文档+PPT+讲解)
  • 前端性能优化面试题及参考答案
  • 【NLP 37、激活函数 ③ relu激活函数】
  • 量子计算的威胁,以及企业可以采取的措施
  • C#初级教程(5)——解锁 C# 变量的更多奥秘:从基础到进阶的深度指南
  • Pytorch实现之GIEGAN(生成器信息增强GAN)训练自己的数据集
  • 使用PHP接入纯真IP库:实现IP地址地理位置查询
  • 计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)
  • 无人机实战系列(三)本地摄像头+远程GPU转换深度图
  • 七.智慧城市数据治理平台架构
  • UE5从入门到精通之多人游戏编程常用函数
  • RK3399 Android7 Ethernet Tether功能实现
  • 【论文学习】基于规模化Transformer模型的低比特率高质量语音编码
  • Pretraining Language Models with Text-Attributed Heterogeneous Graphs
  • 什么是将应用放在边缘服务器上创建?应用不是在用户手机上吗?边缘计算究竟如何优化?通过两个问题来辨析
  • uni-app 系统学习,从入门到实战(二)—— 项目结构解析
  • 滴水逆向_引用_友元函数_运算符重载
  • java医院多维度综合绩效考核源码,医院绩效管理系统,支持一键核算和批量操作,设有审核机制,允许数据修正
  • 科普:HTTP端口80和HTTPS端口443
  • uniapp打包生产证书上架IOS全流程
  • 山东大学软件学院nosql实验一环境配置
  • 【2024 CSDN博客之星】大学四年,我如何在CSDN实现学业与事业的“双逆袭”?
  • 【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】