用Devc++与easyx一步一步做游戏[启动界面部分]-解决hover闪烁问题及优化
在之前的博文中《用Devc++与easyx一步一步做游戏[启动界面部分]-之按钮制作》,我们利用Devc++和easyx完成了游戏启动界面按钮的基本制作,实现了按钮的绘制以及鼠标悬停时的信息提示功能。然而,目前还存在一个问题,即鼠标移动时,提示文字会出现闪烁现象,有很多童鞋在阅读后都表示出了兴趣。这篇博文我们就来解决这个问题并对代码进行优化。
文章目录
- 一、解决闪烁问题
- 1. 问题分析
- 2. 解决方案
- 二、代码优化
- 1. 坐标和尺寸管理
- 2. 代码结构优化
一、解决闪烁问题
1. 问题分析
提示文字闪烁的原因在于,每次鼠标移动触发WM_MOUSEMOVE消息时,都会频繁地清除矩形区域并重新绘制文字。这导致画面不断刷新,从而产生闪烁感。为了解决这个问题,我们需要减少不必要的绘制操作。
2. 解决方案
我们可以通过记录当前鼠标悬停的按钮状态来判断是否需要更新提示文字。如果鼠标仍然悬停在同一个按钮上,就不需要重复清除和绘制。只有当鼠标从一个按钮移到另一个按钮时,才进行相应的操作。
在代码中,我们定义一个全局变量currentButtonIndex来记录当前鼠标悬停的按钮索引,初始值设为 -1,表示没有悬停在任何按钮上。
int currentButtonIndex = -1;
然后,修改消息循环中的WM_MOUSEMOVE处理逻辑:
ExMessage msg;
while (true) {if (peekmessage(&msg, EM_MOUSE)) {switch (msg.message) {case WM_LBUTTONDOWN:break; case WM_MOUSEMOVE:int newButtonIndex = -1;if (msg.x >= 220 && msg.x <= 220 + 170 && msg.y >= 50 && msg.y <= 50 + 50)newButtonIndex = 0;else if (msg.x >= 220 && msg.x <= 220 + 170 && msg.y >= 140 && msg.y <= 140 + 50)newButtonIndex = 1;else if (msg.x >= 220 && msg.x <= 220 + 170 && msg.y >= 230 && msg.y <= 230 + 50)newButtonIndex = 2;else if (msg.x >= 220 && msg.x <= 220 + 170 && msg.y >= 320 && msg.y <= 320 + 50)newButtonIndex = 3;if (newButtonIndex != currentButtonIndex) {// 清除之前的提示文字if (currentButtonIndex != -1) {RECT prevRect = {220, 420, 220 + 170, 420 + 30}; // 根据文字大小调整矩形区域clearrectangle(prevRect.left, prevRect.top, prevRect.right, prevRect.bottom);}currentButtonIndex = newButtonIndex;if (currentButtonIndex != -1) {tipInfo(tipInfoRect, title[currentButtonIndex]);}}break; default:break;}}
}
通过上述代码,只有当鼠标悬停的按钮发生变化时,才会清除之前的提示文字并绘制新的提示文字,有效地解决了闪烁问题。
二、代码优化
1. 坐标和尺寸管理
之前的代码中,按钮的坐标和尺寸都是直接写在代码里,这样不利于修改和维护。我们可以将这些参数定义为常量或者结构体,方便统一管理。
// 定义按钮相关常量
const int BUTTON_WIDTH = 170;
const int BUTTON_HEIGHT = 50;
const int BUTTON_GAP = 40;
const int START_Y = 50;
const int TIP_X = 220;
const int TIP_Y = 420;
然后在绘制按钮和判断鼠标位置时使用这些常量:
// 绘制按钮
for(int i = 0; i < 4; i++) {int x = 220;int y = START_Y + i * (BUTTON_HEIGHT + BUTTON_GAP);button(x, y, title[i]);
}// 判断鼠标位置
if (msg.x >= TIP_X && msg.x <= TIP_X + BUTTON_WIDTH && msg.y >= START_Y && msg.y <= START_Y + BUTTON_HEIGHT)newButtonIndex = 0;
// 其他按钮判断类似,修改对应y坐标即可
2. 代码结构优化
随着功能的增加,代码逐渐变得复杂,我们可以进一步优化代码结构,将不同功能的代码封装到独立的函数中。例如,将消息循环部分封装到一个函数handleMouseMessages中:
void handleMouseMessages() {ExMessage msg; while (true) {if (peekmessage(&msg, EM_MOUSE)) {switch (msg.message) {case WM_LBUTTONDOWN:break; case WM_MOUSEMOVE:int newButtonIndex = -1;// 判断鼠标位置逻辑不变//...if (newButtonIndex != currentButtonIndex) {// 清除和绘制逻辑不变//...}break; default:break;}}}
}
在main函数中调用这个函数:
int main(int argc, char** argv) {initgraph(640, 480); setbkcolor(0x3B0000);cleardevice();// 绘制按钮for(int i = 0; i < 4; i++) {int x = 220;int y = START_Y + i * (BUTTON_HEIGHT + BUTTON_GAP);button(x, y, title[i]);}handleMouseMessages();getchar();closegraph();return 0;
}
通过上述优化,代码的可读性和可维护性都得到了显著提升。
到这里,游戏启动界面按钮的制作已经基本完成,解决了闪烁问题并对代码进行了优化。后续我们可以继续完善游戏启动界面的其他功能,如按钮点击事件的处理等。希望这篇博文能帮助大家更好地理解和运用Devc++与easyx进行游戏开发。
相关文章:
用Devc++与easyx一步一步做游戏[启动界面部分]-解决hover闪烁问题及优化
在之前的博文中《用Devc与easyx一步一步做游戏[启动界面部分]-之按钮制作》,我们利用Devc和easyx完成了游戏启动界面按钮的基本制作,实现了按钮的绘制以及鼠标悬停时的信息提示功能。然而,目前还存在一个问题,即鼠标移动时&#x…...
非根目录部署 nextjs 项目,资源文件 请求404 的问题
最近在学习next项目编写的代码放到服务器上静态资源404 先分析问题 到服务器上查看是有资源目录的是不是项目配置有问题是不是nginx配置有问题 经过排查1和2是没有问题的目前来看只有3 检查一下nginx配置 尝试着把静态资源的配置禁用 问题解决 我的next项目用的是pm2管理…...
Kafka常见问题之 `javax.management.InstanceAlreadyExistsException`
文章目录 Kafka常见问题之 javax.management.InstanceAlreadyExistsException1. 概述2. 常见原因3. 具体异常示例4. 解决方案4.1 确保单一 Kafka Producer 实例4.2 配置 Kafka Broker 和 Producer 使用唯一的 JMX 名称(对于Producer重点检查 client.id)4…...
mysql 学习5 mysql图形化界面DataGrip下载 安装 使用
一、下载和安装 下载: 其他版本 - DataGrip PS:安装目录最好不要有中文。 C:\Program Files\JetBrains\DataGrip 2023.3.4 二、 夸克网盘分享 当前电脑是下载到 :D:\Ctool\mysql\datagrip2023_3_4\datagrip2024\jetbra-datagrip\scripts …...
读写和解析简单的 nc 文件
NetCDF 文件格式在气象数据工程领域占据着举足轻重的地位,其结构灵活、强兼容性等优势使其成为该领域的一个标准。无论是从事学术研究还是工程实践,掌握这种数据格式变得越发重要。其次,我注意到目前社区中气象编程大多数课程都聚焦于某个特定…...
LLM:BERT or BART 之BERT
文章目录 前言一、BERT1. Decoder-only2. Encoder-only3. Use of Bidirectional Context4. Masked Language Model (MLM)5. Next Sentence Prediction (NSP)6. Fine-tune1、情感分析2、句对分析3、命名实体识别(NER) 7. BERT总结 总结 前言 NLP选手对这…...
【力扣:新动计划,编程入门 —— 题解 ③】
—— 25.1.26 231. 2 的幂 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入:…...
数据库基础:从概念到 MySQL 实战
数据库基础:从概念到 MySQL 实战 在当今数字化时代,数据的重要性不言而喻,而数据库作为数据管理的核心工具,发挥着关键作用。对于技术爱好者和开发者来说,深入了解数据库知识是必不可少的。今天,就让我们一…...
Nacos统一配置管理
Nacos 统一配置管理 将一部分配置信息写到Nacos配置文件中,可以统一管理,并且这个文件支持热加载。 新建配置步骤:配置管理 -> 配置列表 -> 新建配置 Data ID(配置文件名id) 命名规范:服务名称-de…...
Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理
Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理 安装php8安装ImageMagick1、下载ImageMagick2、解压并安装3、查看是否安装成功 安装imagick扩展包 安装php8 点我安装php8 安装ImageMagick 1、下载ImageMagick wget https://www.imagemagick.org/download/ImageMa…...
android的gradle
Gradle User Manual gradle官网 这里有个gradlew很有用,因为这个可以在窗口中运行gradlew脚本 gradlew 和 gradlew.bat 都是 Gradle Wrapper(Gradle 包装器) 的一部分,它们的作用是让项目可以使用 Gradle 而无需提前在系统中…...
2025美赛MCM数学建模A题:《石头台阶的“记忆”:如何用数学揭开历史的足迹》(全网最全思路+模型)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ 《石头台阶的“记忆”:如何用数学揭开历史的足迹》 目录 《石头台阶的“记忆”:如何用数学揭开历史的足迹》 ✨摘要✨ ✨引言✨ 1. 引言的结构 2. 撰写步骤 (1)研究背景 &#…...
Python3 【高阶函数】项目实战:5 个学习案例
Python3 【高阶函数】项目实战:5 个学习案例 本文包含 5 个关于“高阶函数”的综合应用项目,每个项目都包含完整的程序代码、测试案例和执行结果。具体项目是: 成绩统计分析单词统计工具简易计算器工厂任务调度器数据管道处理 项目 1&#…...
ES6 类语法:JavaScript 的现代化面向对象编程
Hi,我是布兰妮甜 !ECMAScript 2015,通常被称为 ES6 或 ES2015,是 JavaScript 语言的一次重大更新。它引入了许多新特性,其中最引人注目的就是类(class)语法。尽管 JavaScript 一直以来都支持基于…...
【S32K3 RTD LLD篇7】K344中心对齐PWM中心点触发ADC BCTU采样
【S32K3 RTD LLD篇7】K344中心对齐PWM中心点触发ADC BCTU采样 一,文档简介二,中心对齐PWM中心点触发ADC原理2.1 如何生成中心对齐的PWM2.2 如何生成PWM中心点触发标志 三, 软件配置与实现3.1 Demo CT 模块配置3.1.1 引脚配置3.1.2 时钟配置3.…...
解决日志中 `NOT NULL constraint failed` 异常的完整指南
在开发和运维过程中,日志是我们排查问题的重要工具。然而,当日志中出现类似 NOT NULL constraint failed 的异常时,往往意味着数据库约束与代码逻辑不匹配。本文将详细分析此类问题的原因,并提供完整的解决方案。 © ivwdcwso (ID: u012172506) 问题描述 在同步 AWS …...
14-6-3C++STL的list
(一)list的插入 1.list.insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置 #include <iostream> #include <list> using namespace std; int main() { list<int> lst; lst.push_back(10); l…...
协助工具-任意门导航
任意门导航网址:随意门导航-最全的实用导航网站,好用简洁宝藏网址神器...
优化使用 Flask 构建视频转 GIF 工具
优化使用 Flask 构建视频转 GIF 工具 优化后的项目概述 在优化后的版本中,我们将实现以下功能: 可设置每个 GIF 的帧率和大小:用户可以选择 GIF 的帧率和输出大小。改进的用户界面:使用更现代的设计使界面更美观、整洁。自定义…...
unity学习20:time相关基础 Time.time 和 Time.deltaTime
目录 1 unity里的几种基本时间 1.1 time 相关测试脚本 1.2 游戏开始到现在所用的时间 Time.time 1.3 时间缩放值 Time.timeScale 1.4 固定时间间隔 Time.fixedDeltaTime 1.5 两次响应时间之间的间隔:Time.deltaTime 1.6 对应测试代码 1.7 需要关注的2个基本…...
【趋势】《2024—2026金融科技十大趋势预测》一览
本白皮书基于新华三在金融行业的前沿实践和IDC的全球研究成果,深入分析了金融科技领域的十大关键趋势,旨在为金融机构提供前瞻性的战略指导和业务创新的参考。 导言 当前,在地缘政治冲突加剧、商业经济市场环境高度不确定、数字化业务加速发展的背景下,金融行业处于深度变…...
Qt调用ffmpeg库录屏并进行UDP组播推流
基于以下参考链接,采用其界面和程序框架,实现实时推送UDP组播视频流,替换原拉流功能 https://blog.csdn.net/u012532263/article/details/102736700 源码在windows(qt-opensource-windows-x86-5.12.9.exe)、ubuntu20.…...
HarmonyOS:创建应用静态快捷方式
一、前言 静态快捷方式是一种在系统中创建的可以快速访问应用程序或特定功能的链接。它通常可以在长按应用图标,以图标和相应的文字出现在应用图标的上方,用户可以迅速启动对应应用程序的组件。使用快捷方式,可以提高效率,节省了查…...
mysql 学习6 DQL语句,对数据库中的表进行 查询 操作
前期准备数据 重新create 一张表 create table emp(id int comment 编号,workno varchar(10) comment 工号,name varchar(10) comment 姓名,gender char comment 性别,ager tinyint unsigned comment 年龄,idcard char(18) comment 身份证号,workaddress varchar(10) c…...
【ES实战】治理项之索引模板相关治理
索引模板治理 文章目录 索引模板治理问题现象分析思路操作步骤问题程序化方案索引与索引模板增加分片数校验管理 彩蛋如何查询Flink on Yarn 模式下的Task Manager日志相关配置查询已停止的Flink任务查询未停止的Flink任务 问题现象 在集群索引新建时,索引的分片比…...
springboot3 集成 knife4j(接口文档)
提示:文章是集成 knife4j,而非 swagger2 或者 swagger3,效果如图 文章目录 前言一、添加依赖二、如何集成1.配置文件2.注解部分1.Tag2.Operation3.Parameter4.Schema 3.使用 总结 前言 提示::大家在开发阶段ÿ…...
51单片机开发:独立键盘实验
实验目的:按下键盘1时,点亮LED灯1。 键盘原理图如下图所示,可见,由于接GND,当键盘按下时,P3相应的端口为低电平。 键盘按下时会出现抖动,时间通常为5-10ms,代码中通过延时函数delay…...
Flutter_学习记录_Tab的简单Demo~真的很简单
1. Tab的简单使用了解 要实现tab(选项卡或者标签视图)需要用到三个组件: TabBarTabBarViewTabController 这一块,我也不知道怎么整理了,直接提供代码吧: import package:flutter/material.dart;void main() {runApp(MyApp());…...
GESP2024年3月认证C++六级( 第三部分编程题(1)游戏)
参考程序: #include <cstdio> using namespace std; const int N 2e5 5; const int mod 1e9 7; int n, a, b, c; int f[N << 1]; int ans; int main() {scanf("%d%d%d%d", &n, &a, &b, &c);f[N n] 1;for (int i n; i…...
数据结构测试题2
一、单选题(每题 2 分,共20分) 1. 栈和队列的共同特点是( A )。 A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2. 用链接方式存储的队列,在进行插入运算时( C ) A. 仅修改头指针 B. 头…...
