无引擎游戏开发(1):EasyX图形库引入 + 跟随鼠标移动的小球

来自bilibili up主的Voidmatrix的视频教程:【从零开始的C++游戏开发】

一、图形库引入

EasyX在国内文档最多,而且功能函数齐全,最适合入门。

环境配置:vs2022 (官网下载免费版)+ 百度搜EasyX官方(如下图所示):

勾选右上角“下载”:

选择2023大暑版;

拉到最下面:

点击下载,完成后打开文件 -> 下一步 -> 选择安装位置(vs2022)即可,傻瓜式非常方便(太喜欢)

光速安装,惊呆了(点一下立即弹出安装成功):

打开vs2022建立空项目,在源代码处鼠标右击按下方勾选:

选c++文件,点‘添加’:

创建完成后输入如下代码测试环境:

#include<graphics.h>
#include<iostream>int main(){printf("%ws", GetEasyxVer());//获取EasyX版本号return 0;
}

弹窗显示2023则安装成功。

二、创建跟随鼠标移动的小球

2.1如何使用EasyX创建窗口

进入文档-绘图设备相关函数:

发现initgraph函数可以初始化绘图窗口,传入width、height参数即可。第三个flag参数定义窗口是否可被关闭,这里保持默认。

初始化一个1280 * 720大小窗口代码如下:

#include<graphics.h>int main(){initgraph(1280, 720);return 0;
}

运行发现窗口一闪而过,这是因为主程序在创建完窗口就结束了,所以需要利用死循环来卡住窗口

#include<graphics.h>int main(){initgraph(1280, 720);while(1){}return 0;
}

这是一个通用的游戏框架:所有的游戏都依赖一个循环来不断更新画面、读入玩家操作事件,而这个循环被称为游戏的“主循环”。

现在运行程序窗口就不会关闭了。

2.2在窗口中绘制小球(这里用实心圆代替)

进入文档-图形绘制相关参数-solicircle函数

solidcircle函数需要传入三个参数,分别为圆心坐标(x,y)与圆的半径,输入以下代码创建圆:

#include<graphics.h>int main(){initgraph(1280, 720);while(1){solidcircle(300, 300, 100);}return 0;
}

看到成功创建圆:

2.3对鼠标移动事件进行处理让小球跟随鼠标动起来

进入文档-消息处理相关函数-peekmessage函数

这个函数用于获取一个”消息“并立即返回,在EasyX中,鼠标的移动、点击或者是键盘的按键操作都被称作”消息“,当我们触发这些消息时EasyX会将其放置到自己的消息队列中,每当我们调用peekmessage函数时便尝试从消息队列中拉取一个消息,如果拉取成功函数便返回true,反之没有消息可拉取的话则返回false,

这样,我们可以使用另一个循环来从队列中拉取已有的消息进行处理,直到事件队列没有消息为止:

具体框架为:

#include<graphics.h>int main(){initgraph(1280, 720);while(1){ExMessage msg;//存消息用的while(peekmessage(&msg)){//在这里执行消息处理逻辑}solidcircle(300, 300, 100);}return 0;
}

了解基本概念后,我们现在需要对存储消息的结构体进行分析——ExMessage

这个结构体用以保存鼠标消息,有一个叫meesage的字段用来标识当前的消息类型:

表格中发现鼠标移动的消息标识是WM_MOUSEMOVE

于是写出代码如下:

#include<graphics.h>int main(){initgraph(1280, 720);int x,y;while(1){ExMessage msg;while(peekmessage(&msg)){if(msg.message == WM_MOUSEMOVE){x = msg.x;y = msg.y;}solidcircle(x, y, 100);//输入变量本身而不是具体值来用于捕捉即时消息}return 0;
}

结果却不尽人意:

随着鼠标移动窗口中的圆越来越多,这是因为在绘制新的圆是没有对原来位置的圆进行擦除操作

所以在绘制下一个圆之前先对整个窗口进行清空(cleardevice()):

#include<graphics.h>int main(){initgraph(1280, 720);int x,y;while(1){ExMessage msg;while(peekmessage(&msg)){if(msg.message == WM_MOUSEMOVE){x = msg.x;y = msg.y;}cleardevice();//清空窗口solidcircle(x, y, 100);}return 0;
}

运行后发现有一个跟随鼠标移动的圆了,但是圆在不断闪烁,这是因为没有使用双缓冲对绘图进行优化处理,这里只需要添加这三行代码即可:

#include<graphics.h>int main() {//initgraph(1280, 720);//int x, y;BeginBatchDraw();//while (1) {//ExMessage msg;//while (peekmessage(&msg)) {//if (msg.message == WM_MOUSEMOVE) {//x = msg.x;//y = msg.y;//}//}//cleardevice();//solidcircle(x, y, 100);FlushBatchDraw();//}EndBatchDraw();//return 0;}

运行程序,我们终于得到了一个丝滑的圆!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后方穿行预警系统技术规范(简化版)

后方穿行预警系统技术规范(简化版) 1 系统概述2 预警区域3 预警目标4 预警条件5 指标需求1 系统概述 RCTA后方穿行预警系统工作在驾驶员有倒车意向的时候。在倒车过程中当驾驶员视线因周围障碍物被遮挡而产生碰撞风险时,系统通过光学信号对驾驶员进行提醒。 2 预警区域 RCT…

前端入门篇(五十二)练习6:transition过渡小动画

所以应该先找到第n个li&#xff0c;找到li再找img&#xff0c;li没有找错&#xff0c;底下又各自只有一个img&#xff0c;解决 ul li:nth-child(1) img { } 描述文字从下往上&#xff1a; 一开始描述也在框框下面&#xff0c;当hover时&#xff0c;translateY(0)&#xff0…

【JS重点18】原型链(面试重点)

一&#xff1a;原型链底层原理 以下面一段代码为例&#xff0c;基于原型对象&#xff08;Star构造函数的原型对象&#xff09;的继承使得不同构造函数的原型对象关联在一起&#xff08;此处是最大的构造函数Object原型对象&#xff09;&#xff0c;并且这种关联的关系是一种链…

CleanShot X for Mac v4.7 屏幕滚动长截图录像工具(保姆级教程,小白轻松上手,简单易学)

Mac分享吧 文章目录 一、下载软件二、部分特有功能效果1、截图软件的普遍常用功能&#xff08;画框、箭头、加文字等&#xff09;都具备&#xff0c;不再详细介绍2、ABCD、1234等信息标注&#xff08;每按一下鼠标&#xff0c;即各是A、B、C、D...等&#xff09;3、截图更换背…

SQL注入-下篇

HTTP注入 一、Referer注入 概述 当你访问一个网站的时候&#xff0c;你的浏览器需要告诉服务器你是从哪个地方访问服务器的。如直接在浏览器器的URL栏输入网址访问网站是没有referer的&#xff0c;需要在一个打开的网站中&#xff0c;点击链接跳转到另一个页面。 Less-19 判…

第29讲:Ceph集群使用RBD块存储设备与K8S的PV集成

文章目录 1.Ceph集群使用RBD块存储与K8S集成简介2.Ceph集群RBD块存储与K8S PV存储卷集成2.1.创建K8S集群PV使用的块存储2.2.创建K8S集群访问RBD块存储设备的认证用户2.3.将认证用户的Key存储在K8S Secret资源中2.4.在K8S集群的所有节点中安装Ceph命令2.5.创建PV及PVC资源使用RB…

C#开发-集合使用和技巧(八)集合中的排序Sort、OrderBy、OrderByDescending

C#开发-集合使用和技巧&#xff08;八&#xff09;集合中的排序Sort、OrderBy、OrderByDescending List<T>.Sort()IEnumerable<T>.OrderBy()Enumerable<T>.OrderByDescending() 在C#中&#xff0c;List<T> 类提供了多种方法来进行排序&#xff0c;最常…

jax.nn.initializers.glorot_normal()

import jax import jax.numpy as jnp from jax import random import jax.nn.initializers as init# 设置随机数种子 key random.PRNGKey(42)# 定义权重的形状 shape (in_dim, out_dim)# 获取 Glorot 正态初始化函数 glorot_normal_init init.glorot_normal()# 初始化权重 w…

QT基础 - QMainWindow主窗口

目录 零. 简介 一. 菜单栏 二. 工具栏 三. 状态栏 四. 可停靠区域 五. 总结 零. 简介 QMainWindow 是 Qt 中用于构建主窗口的类。 它通常包含以下几个主要部分&#xff1a; 菜单栏&#xff1a;用于提供各种操作选项。工具栏&#xff1a;放置常用的操作按钮。中心区域&…

搭建Vue的环境

目录 # 开篇 步骤一&#xff0c;准备Vue 的环境 步骤二&#xff0c;下载Vue.js的包 步骤三&#xff0c;创建并打开写前端代码的文件夹 步骤四&#xff0c;在VSCode中引入Vue.js的包 步骤五&#xff0c;创建第一个vue.html Vue其他知识 Vue.config命令 # 开篇 介绍&…

详细分析Element Plus的el-pagination基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 需求&#xff1a;从无到有做一个分页并且附带分页的导入导出增删改查等功能 前提一定是要先有分页&#xff0c;作为全栈玩家&#xff0c;先在前端部署一个分页的列表 相关后续的功能&#xff0c;是Java&#xff0c;推荐阅读&#x…

数据结构:4.1.2二叉搜索树的插入

整个框架和FInd函数的实现是一样的&#xff0c;但是也有不同&#xff08;注意&#xff09; 35>30 向30的右子树 35<41 向41的左子树 35>33 向33的右子树&#xff0c;但33右边为空&#xff0c;所以35就挂在33的右边 因为要把35挂在33的右边&#xff0c;所以要把33的…

Solkane 冷媒性能计算软件-管路计算

下载 制冷管道设计 制冷管路的压降会降低制冷量&#xff0c;增大功耗。但不同部分的管路允许的压降的数量级是不同的。 制冷管路的压降不是唯一的考虑因素&#xff0c;制冷剂的流速往往比压降更重要。 制冷系统中&#xff0c;压缩机、阀、汽液分离器或其他附件上的连接件的尺…

VSCode 安装NeoVim扩展(详细)

目录 1、安装NeoVim扩展 2、windows安装Neovim软件 3、优化操作相关的配置&#xff1a; 5、Neovim最好的兼容性配置 6、技巧和特点 6.1 故障排除 6.2、Neovim 插件组合键设置 6.3、跳转列表 1、安装NeoVim扩展 在扩展商店搜索NeoVim&#xff0c;安装扩展 2、windows安装…

重学java 77.JDK新特性 ③ Stream流

The road is long,it can be really hard.Whatever you do,you hold on to that foolishly hopeful smile —— 24.6.19 Stream流 stream流中的"流"不是特指"IO流",它是一种"流式编程"(编程方式),可以看做是"流水线 package S109Stream;im…

【Python机器学习实战】 | Lasso回归和弹性网回归详细分析研究

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

react使用OpenLayers实现类似船某网在地图放大时展示具体船舶符号缩小时显示聚合小点效果

一、效果 如图所示&#xff0c;地图缩小&#xff08;即比例尺放大&#xff09;时&#xff0c;显示聚合小绿点&#xff1b; 地图放大&#xff08;比例尺缩小&#xff09;时&#xff0c;展示具体船舶符号&#xff1a; 二、思路 1&#xff09;设置2个图层&#xff0c;一个展示…

计网重点面试题-TCP三次握手四次挥手

三次握手 第一次握手(syn1) 客户端会随机初始化序号&#xff08;client_isn&#xff09;&#xff0c;将此序号置于 TCP 首部的「序列号」字段中&#xff0c;同时把 SYN 标志位置为 1&#xff0c;表示 SYN 报文。接着把第一个 SYN 报文发送给服务端&#xff0c;表示向服务端发…

Microsoft Edge 查看已保存账号的密码

1、打开更多菜单选项 打开浏览器右上角的“...”设置及其他&#xff0c;快捷键&#xff1a;ALTF。 2、打开设置选项 选择“设置”&#xff0c;快捷键&#xff1a;g 3、点击密码 在“个人资料”选项中找到密码选项 4、电子钱包 电子钱包会显示“站点和应用”所保存的账户信息…

JAVAEE之网络原理(2)_传输控制协议(TCP)的连接管理机制,三次握手、四次挥手,及常见面试题

前言 在上一节中&#xff0c;我们简单介绍了 TCP 协议的相关概念和格式&#xff0c;而且还介绍了TCP 协议原理中的 确认应答机制、超时重传机制&#xff0c;在本节中我们将会继续介绍 TCP协议原理中的其他机制。 连接管理机制&#xff08;安全机制&#xff09; 在正常情况下&…