当前位置: 首页 > 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  加载图和放置图

相关文章:

游戏开发 游戏开始界面

目录 前言 一 游戏初始化界面的分析 二 游戏的大概框架 三 显示界面的开发 四 完整代码 总结 我们可以来看看游戏初始界面是什么样的 勇士游戏样例 前言 这里是开发游戏的初始界面 一 游戏初始化界面的分析 我们需要一个背景图&#xff0c;开始游戏图标&#xff0…...

Python解析 Flink Job 依赖的checkpoint 路径

引言 Apache Flink 是一个强大的分布式处理框架&#xff0c;广泛用于批处理和流处理任务。其 checkpoint 机制是确保容错的关键功能&#xff0c;允许在计算过程中保存状态&#xff0c;以便在故障时从最近的 checkpoint 恢复。本文详细探讨了一个 Python 脚本&#xff0c;该脚本…...

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…...

计算机视觉算法实战——产品分拣(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 领域简介✨✨ 产品分拣是工业自动化和物流领域的核心技术&#xff0c;旨在通过机器视觉系统对传送带上的物品进行快速识别、定位和分类&a…...

汽车软件︱AUTO TECH China 2025 广州国际汽车软件与安全技术展览会:开启汽车科技新时代

在汽车产业智能化与网联化飞速发展的当下&#xff0c;汽车软件与安全技术已然成为行业变革的核心驱动力。2025年11月20 - 22日&#xff0c;AUTO TECH China 2025 广州国际汽车软件与安全技术展览会将在广州保利世贸博览馆盛大开幕&#xff0c;这场展会将汇聚行业前沿成果&#…...

Visual Studio打开文件后,中文变乱码的解决方案

文件加载 使用Unicode&#xff08;UTF-8&#xff09;编码加载文件 C:\WorkSpace\Assets\Scripts\UI\View\ExecuteComplateView.cs时&#xff0c;有些字节已用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后端返回给前端的时间变了(时区问题)

问题&#xff1a;MySQL里的时间例如为2025-01-10 21:19:30&#xff0c;但是返回到前端就变成了2025-01-10 13:19:30&#xff0c;会出现小时不一样或日期变成隔日的问题 一般来说设计字段时会使用datetime字段类型&#xff0c;这是一种用于时间的字段类型&#xff0c;而这个类型…...

计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

前端性能优化面试题及参考答案

目录 如何通过合并文件减少 HTTP 请求次数? 列举 CDN 加速的适用场景与实现原理。 如何利用 HTTP/2 的多路复用特性优化资源加载? 描述 DNS 预解析的实现方式及其对性能的影响。 异步加载脚本时,async 与 defer 属性的区别是什么? 如何优化 AJAX 请求的并发数与优先级…...

【NLP 37、激活函数 ③ relu激活函数】

—— 25.2.23 ReLU广泛应用于卷积神经网络&#xff08;CNN&#xff09;和全连接网络&#xff0c;尤其在图像分类&#xff08;如ImageNet&#xff09;、语音识别等领域表现优异。其高效性和非线性特性使其成为深度学习默认激活函数的首选 一、定义与数学表达式 ReLU&#xff0…...

量子计算的威胁,以及企业可以采取的措施

当谷歌、IBM、Honeywell和微软等科技巨头纷纷投身量子计算领域时&#xff0c;一场技术军备竞赛已然拉开帷幕。 量子计算虽能为全球数字经济带来巨大价值&#xff0c;但也有可能对相互关联的系统、设备和数据造成损害。这一潜在影响在全球网络安全领域引起了强烈关注。也正因如…...

C#初级教程(5)——解锁 C# 变量的更多奥秘:从基础到进阶的深度指南

一、变量类型转换&#xff1a;隐式与显式的门道 &#xff08;一&#xff09;隐式转换&#xff1a;编译器的 “贴心小助手” 隐式转换是编译器自动进行的类型转换&#xff0c;无需开发者手动干预。这种转换通常发生在将取值范围小的数据类型赋值给取值范围大的数据类型时&#…...

Pytorch实现之GIEGAN(生成器信息增强GAN)训练自己的数据集

简介 简介:在训练数据样本之前首先利用VAE来推断潜在空间中不同类的分布,用于后续的训练,并使用它来初始化GAN。与ACGAN和BAGAN不同的是,提出的GIEGAN有一个分类器结构,这个分类器主要判断生成的图像或者样本图像属于哪个类,而鉴别器仅判断图像是来自于生成器还是真实样…...

使用PHP接入纯真IP库:实现IP地址地理位置查询

引言 在日常开发中,我们经常需要根据用户的IP地址获取其地理位置信息,例如国家、省份、城市等。纯真IP库(QQWry)是一个常用的IP地址数据库,提供了丰富的IP地址与地理位置的映射关系。本文将介绍如何使用PHP接入纯真IP库,并通过一个完整的案例演示如何实现IP地址的地理位…...

计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

无人机实战系列(三)本地摄像头+远程GPU转换深度图

这篇文章将结合之前写的两篇文章 无人机实战系列&#xff08;一&#xff09;在局域网内传输数据 和 无人机实战系列&#xff08;二&#xff09;本地摄像头 Depth-Anything V2 实现了以下功能&#xff1a; 本地笔记本摄像头发布图像 远程GPU实时处理&#xff08;无回传&#…...

七.智慧城市数据治理平台架构

一、整体架构概览 智慧城市数据治理平台架构描绘了一个全面的智慧城市数据治理平台&#xff0c;旨在实现城市数据的统一管理、共享和应用&#xff0c;为城市运行、管理和决策提供数据支撑。整体架构呈现出分层、模块化、集约化的特点&#xff0c;并强调数据安全和标准规范。 智…...

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网络(设备支持情况下),下面是相应…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...