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

news2025/2/25 5:09:56

来自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.coloradmin.cn/o/1837530.html

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

相关文章

AI搜索工具,提升你的工作效率

当我们需要查询某个内容的时候&#xff0c;除了可以通过搜索引擎来查找&#xff0c;还可以通过AI搜索工具来查找。AI搜索工具会智能的从网络信息中查找答案并整理后给我们结果。除了搜索结果&#xff0c;AI搜索工具还可以用来帮我们创作内容&#xff0c;比如你需要写一篇文章&a…

【博弈】843. 猜猜这个单词

本题涉及知识点 博弈 LeetCode843. 猜猜这个单词 给你一个由 不同 字符串组成的单词列表 words &#xff0c;其中 words[i] 长度均为 6 。words 中的一个单词将被选作秘密单词 secret 。 另给你一个辅助对象 Master &#xff0c;你可以调用 Master.guess(word) 来猜单词&…

Harbor本地仓库搭建003_Harbor常见错误解决_以及各功能使用介绍_镜像推送和拉取---分布式云原生部署架构搭建003

首先我们去登录一下harbor,但是可以看到,用户名密码没有错,但是登录不上去 是因为,我们用了负债均衡,nginx会把,负载均衡进行,随机分配,访问的 是harbora,还是harborb机器. loadbalancer中 解决方案,去loadbalance那个机器中,然后 这里就是25机器,我们登录25机器 然后去配置…

CentOS 7x 使用Docker 安装oracle11g完整方法

1.安装docker-ce 安装依赖的软件包 yum install -y yum-utils device-mapper-persistent-data lvm2添加Docker的阿里云yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo更新软件包索引 yum makecache fast查看docker…

MacOS - command not found: brew

问题描述 command not found: brew 原因分析 没有安装 Homebrew&#xff0c;安装后即可使用~ 解决方案 打开终端&#xff0c;输入&#xff1a;/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"&#xff0c;点击回车 在弹出…

FlinkCDC介绍及使用

CDC简介 什么是CDC&#xff1f; cdc是Change Data Capture(变更数据获取)的简称。核心思想是&#xff0c;监测并捕获数据库的 变动(包括数据或数据表的插入&#xff0c;更新以及删除等)&#xff0c;将这些变更按发生的顺序完整记录下来&#xff0c;写入到消息中间件以供其它服…

归并排序 (递归实+非递归)

前言 归并排序是一种逻辑很简单&#xff0c;但是实现有点难度的排序&#xff0c;尤其是非递归&#xff0c;对于区间的把握更是需要一点逻辑的推导&#xff0c;但是没有关系&#xff0c;轻松拿捏 归并排序gif 归并排序单趟实现 1&#xff0c;创建tmp数组&#xff0c; 2&#xff…

《Windows API每日一练》4.6 矩形、区域和裁剪

在前面的4.3节中我们讲述了绘制矩形的API函数Rectangle和RoundRect。本节我们将介绍另外一组使用RECT矩形结构和区域的绘图函数。 本节必须掌握的知识点&#xff1a; 矩形 第28练&#xff1a;绘制随机矩形 矩形与区域的裁剪 第29练&#xff1a;区域裁剪 4.6.1 矩形 ■FillRe…

HarmonyOS开发知识 :扩展修饰器,实现节流、防抖、权限申请

引言 防重复点击&#xff0c;利用装饰器面向切面&#xff08;AOP&#xff09;的特性结合闭包&#xff0c;实现节流、防抖和封装权限申请。 节流 节流是忽略操作&#xff0c;在触发事件时&#xff0c;立即执行目标操作&#xff0c;如果在指定的时间区间内再次触发了事件&…

C语言中的内存动态管理

1.为什么有动态内存管理 int a20;//开辟4个字节 int arr[10]{0};//开辟40个字节 上述的代码有两个特点 1.开辟空间的大小是固定的。 2.数组在申明的时候已经固定了大小&#xff0c;无法更改。 这样写代码不够灵活&#xff0c;所以c语言中引入了动态内存管理&#xff0c;让程序…

Java | Leetcode Java题解之第165题比较版本号

题目&#xff1a; 题解&#xff1a; class Solution {public int compareVersion(String version1, String version2) {int n version1.length(), m version2.length();int i 0, j 0;while (i < n || j < m) {int x 0;for (; i < n && version1.charAt(…

Flat Ads:全球领先的移动广告营销平台

Flat Ads是全球领先的移动广告营销平台,凭借独家开发者矩阵网络和程序化广告交易平台,帮助广告主在全球范围内精准获取目标用户,提升品牌知名度,实现业务增长目标。同时,Flat Ads也致力于为全球开发者提供高效变现、最大化收益的一站式解决方案,助力开发者实现商业价值最大化。…

怎么给软件做数字证书签名?

要想让软件获得身份并让计算机识别软件发布者就需要申请数字证书&#xff0c;CA机构严格实名认证后签发的数字证书就可以对指定的软件签名使用。 代码签名是使用数字证书对软件、固件、脚本和可执行文件进行签名的过程&#xff0c;旨在向最终用户和客户保证代码的完整性和真实…

【论文阅读】-- Attribute-Aware RBFs:使用 RT Core 范围查询交互式可视化时间序列颗粒体积

Attribute-Aware RBFs: Interactive Visualization of Time Series Particle Volumes Using RT Core Range Queries 1 引言2 相关工作2.1 粒子体渲染2.2 RT核心方法 3 渲染彩色时间序列粒子体积3.1 场重构3.1.1 密度场 Φ3.1.2 属性字段 θ3.1.3 优化场重建 3.2 树结构构建与调…

最新ios苹果手机版植物大战僵尸杂交版下载安装2024六月最新

嘿&#xff0c;亲爱的小可爱们~ &#x1f31f; 今天给你们带来一款超炫的游戏——植物大战僵尸杂交版2024&#xff01;这可不是普通的植物大战僵尸哦&#xff0c;它融合了最新的科技元素和创新玩法&#xff0c;让你在打僵尸的战场上大呼过瘾。快跟着我一起探索这个神奇的游戏世…

在PHP项目中使用阿里云消息队列MQ集成RabbitMQ的完整指南与问题解决

在现代Web应用程序中&#xff0c;消息队列系统扮演着至关重要的角色&#xff0c;帮助开发者实现异步处理、削峰填谷、任务调度等功能。阿里云消息队列MQ作为一种高可用、可伸缩的消息队列服务&#xff0c;为开发者提供了可靠的消息投递和处理能力。而RabbitMQ则是一种广泛使用的…

yolov9-pytorch 深度学习目标检测算法模型

YOLOv9 论文 https://arxiv.org/abs/2402.13616 模型结构 YOLOv9将可编程梯度信息 (PGI) 概念与通用 ELAN (GELAN)架构相结合而开发&#xff0c;代表了准确性、速度和效率方面的重大飞跃。 算法原理 Yolov9将可编程梯度信息&#xff08;PGI&#xff09;和GLEAN&#xff08…

时隔一年,SSD大涨价?

同样产品&#xff0c;2T&#xff0c;去年400多到手&#xff0c;今年700。 去年 今年

comfyui虚拟试衣、ai换装、电商换装源码

一、AI换装技术博客 1. 项目介绍 IDM-VTON 是一个虚拟试衣模型&#xff0c;可以在 ComfyUI 中进行部署。相比于其他虚拟试衣模型&#xff0c;如 OOTDiffusion&#xff0c;IDM-VTON 提升了图像保真度和细节保留&#xff0c;更强调真实感,而且就算是侧面的模特或者背面的模特都…

数据库:与红黑树不同的延迟序列

在内存里维护一个序列&#xff0c;可能第一个想到的就是红黑树。但是&#xff0c;红黑树算法复杂&#xff0c;这还不是主要的&#xff0c;主要的问题是&#xff1a;红黑树的空间利用率低。 红黑树的空间利用率 一个红黑树的节点&#xff0c;包括父节点指针、两个子节点指针、…