游戏开发 游戏开始界面
目录
前言
一 游戏初始化界面的分析
二 游戏的大概框架
三 显示界面的开发
四 完整代码
总结
我们可以来看看游戏初始界面是什么样的
勇士游戏样例
前言
这里是开发游戏的初始界面
一 游戏初始化界面的分析
我们需要一个背景图,开始游戏图标,显示图标
![]()
![]()
首先我们先需要收集资源如:背景,游戏开始图标,显示的图标
有人问:为什么一个背景是白的留一个图标,一个是黑的图标是白的,这个黑白的是掩码图,使用来我们实现透明效果的,就是在窗口只显示图标,而不显示图片的背景,增加美观,至于掩码图怎么弄,我这里推一个视频,运用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 // 回调窗口句柄 );
lpszCommand
这是第一个参数,是一个指向命令字符串的指针。它包含了你希望执行的 MCI 命令,例如"play MySound"或"stop MySound"
lpszReturnString
这是第二个参数,是一个指向返回字符串的指针。如果命令执行成功,MCI 会将一些返回信息存储在这个缓冲区中。如果不需要返回信息,可以传入NULL
cchReturn
这是第三个参数,表示返回字符串缓冲区的大小(以字符为单位)。如果第二个参数是NULL,这个参数也应该是0
hwndCallback
这是第四个参数,是一个窗口句柄,用于接收 MCI 命令执行过程中的通知消息。如果回调不需要通知,可以传入NULL或0
综上所述:第一个就是用于执行命令的 第二个是用于把一些信息返回到缓冲区的 第三个是返回字符串缓冲区的 第四个就是窗口和你内部代码的互动的当然我们现在这部游戏没有如此的复杂,所以我们只需要掌握第一个形参即可,我们来分析如何书写
"open ./image\\begingame.mp3 "对于这个执行命令的输入格式是这样的
<command> [<device>] [<parameters>]
<command>:表示要执行的操作,例如play、stop、open、close等。
<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 加载图和放置图
相关文章:
游戏开发 游戏开始界面
目录 前言 一 游戏初始化界面的分析 二 游戏的大概框架 三 显示界面的开发 四 完整代码 总结 我们可以来看看游戏初始界面是什么样的 勇士游戏样例 前言 这里是开发游戏的初始界面 一 游戏初始化界面的分析 我们需要一个背景图,开始游戏图标࿰…...
Python解析 Flink Job 依赖的checkpoint 路径
引言 Apache Flink 是一个强大的分布式处理框架,广泛用于批处理和流处理任务。其 checkpoint 机制是确保容错的关键功能,允许在计算过程中保存状态,以便在故障时从最近的 checkpoint 恢复。本文详细探讨了一个 Python 脚本,该脚本…...
Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用
功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…...
计算机视觉算法实战——产品分拣(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域简介✨✨ 产品分拣是工业自动化和物流领域的核心技术,旨在通过机器视觉系统对传送带上的物品进行快速识别、定位和分类&a…...
汽车软件︱AUTO TECH China 2025 广州国际汽车软件与安全技术展览会:开启汽车科技新时代
在汽车产业智能化与网联化飞速发展的当下,汽车软件与安全技术已然成为行业变革的核心驱动力。2025年11月20 - 22日,AUTO TECH China 2025 广州国际汽车软件与安全技术展览会将在广州保利世贸博览馆盛大开幕,这场展会将汇聚行业前沿成果&#…...
Visual Studio打开文件后,中文变乱码的解决方案
文件加载 使用Unicode(UTF-8)编码加载文件 C:\WorkSpace\Assets\Scripts\UI\View\ExecuteComplateView.cs时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。...
Python爬虫selenium验证-中文识别点选+图片验证码案例
1.获取图片 import re import time import ddddocr import requests from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.wait import WebDriverWait from …...
MySQL后端返回给前端的时间变了(时区问题)
问题:MySQL里的时间例如为2025-01-10 21:19:30,但是返回到前端就变成了2025-01-10 13:19:30,会出现小时不一样或日期变成隔日的问题 一般来说设计字段时会使用datetime字段类型,这是一种用于时间的字段类型,而这个类型…...
计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
前端性能优化面试题及参考答案
目录 如何通过合并文件减少 HTTP 请求次数? 列举 CDN 加速的适用场景与实现原理。 如何利用 HTTP/2 的多路复用特性优化资源加载? 描述 DNS 预解析的实现方式及其对性能的影响。 异步加载脚本时,async 与 defer 属性的区别是什么? 如何优化 AJAX 请求的并发数与优先级…...
【NLP 37、激活函数 ③ relu激活函数】
—— 25.2.23 ReLU广泛应用于卷积神经网络(CNN)和全连接网络,尤其在图像分类(如ImageNet)、语音识别等领域表现优异。其高效性和非线性特性使其成为深度学习默认激活函数的首选 一、定义与数学表达式 ReLU࿰…...
量子计算的威胁,以及企业可以采取的措施
当谷歌、IBM、Honeywell和微软等科技巨头纷纷投身量子计算领域时,一场技术军备竞赛已然拉开帷幕。 量子计算虽能为全球数字经济带来巨大价值,但也有可能对相互关联的系统、设备和数据造成损害。这一潜在影响在全球网络安全领域引起了强烈关注。也正因如…...
C#初级教程(5)——解锁 C# 变量的更多奥秘:从基础到进阶的深度指南
一、变量类型转换:隐式与显式的门道 (一)隐式转换:编译器的 “贴心小助手” 隐式转换是编译器自动进行的类型转换,无需开发者手动干预。这种转换通常发生在将取值范围小的数据类型赋值给取值范围大的数据类型时&#…...
Pytorch实现之GIEGAN(生成器信息增强GAN)训练自己的数据集
简介 简介:在训练数据样本之前首先利用VAE来推断潜在空间中不同类的分布,用于后续的训练,并使用它来初始化GAN。与ACGAN和BAGAN不同的是,提出的GIEGAN有一个分类器结构,这个分类器主要判断生成的图像或者样本图像属于哪个类,而鉴别器仅判断图像是来自于生成器还是真实样…...
使用PHP接入纯真IP库:实现IP地址地理位置查询
引言 在日常开发中,我们经常需要根据用户的IP地址获取其地理位置信息,例如国家、省份、城市等。纯真IP库(QQWry)是一个常用的IP地址数据库,提供了丰富的IP地址与地理位置的映射关系。本文将介绍如何使用PHP接入纯真IP库,并通过一个完整的案例演示如何实现IP地址的地理位…...
计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
无人机实战系列(三)本地摄像头+远程GPU转换深度图
这篇文章将结合之前写的两篇文章 无人机实战系列(一)在局域网内传输数据 和 无人机实战系列(二)本地摄像头 Depth-Anything V2 实现了以下功能: 本地笔记本摄像头发布图像 远程GPU实时处理(无回传&#…...
七.智慧城市数据治理平台架构
一、整体架构概览 智慧城市数据治理平台架构描绘了一个全面的智慧城市数据治理平台,旨在实现城市数据的统一管理、共享和应用,为城市运行、管理和决策提供数据支撑。整体架构呈现出分层、模块化、集约化的特点,并强调数据安全和标准规范。 智…...
UE5从入门到精通之多人游戏编程常用函数
文章目录 前言一、权限与身份判断函数1. 服务器/客户端判断2. 网络角色判断二、网络同步与复制函数1. 变量同步2. RPC调用三、连接与会话管理函数1. 玩家连接控制2. 网络模式判断四、实用工具函数前言 UE5给我们提供了非常强大的多人网路系统,让我们可以很方便的开发多人游戏…...
RK3399 Android7 Ethernet Tether功能实现
在Android机顶盒产品,对于以太网与WiFi间的关系有如下: 1、以太网与WiFi STA均可连接路由器访问外网; 2、WiFi AP功能可以共享以太网访问外网。 而本文档是对于2的变动,实现通过以太网共享WiFi STA访问外网,并在此基础上可以共享4G/5G网络(设备支持情况下),下面是相应…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...


