当前位置: 首页 > news >正文

【C++】开源:Windows图形库EasyX配置与使用

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍Windows图形库EasyX配置与使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明
      • 窗口绘制圆的示例:
      • 获取鼠标和键盘事件示例:
      • 鼠标操作与绘制示例:
      • 贪吃蛇示例:

😏1. 项目介绍

官网:https://easyx.cn/

EasyX是一个基于Windows的简单图形库,它提供了一个易于使用的图形绘制接口,适用于初学者和爱好者进行图形编程。下面是EasyX库的一些特点和功能:

1.易于学习和使用:EasyX采用了简单的图形绘制接口,使得初学者可以快速上手。它提供了一些基本的绘图函数,如画线、画圆、绘制文本等,使用户能够轻松创建图形界面和动画效果。

2.轻量级和快速:EasyX是一个轻量级的图形库,不需要复杂的安装和配置过程。它使用GDI(图形设备接口)来进行图形绘制,具有较快的绘图速度和相对较低的系统资源占用。

3.图形界面设计:EasyX提供了一些常用的图形界面控件,如按钮、文本框、滚动条等,使用户可以轻松创建交互式的图形界面。

4.动画和游戏开发:EasyX支持实时动画和游戏开发,提供了帧动画、双缓冲技术等功能,使用户能够创建流畅的动画效果和简单的游戏。

5.跨平台:EasyX主要针对Windows平台,支持Windows XP及以上版本。然而,EasyX也可以在部分Linux环境下使用,如Wine模拟器。

😊2. 环境配置

我这里用的Clion + mingw,EasyX的下载地址:https://easyx.cn/download/easyx4mingw_20220901.zip

CMakeLists.txt示例:

cmake_minimum_required(VERSION 3.19)
project(easyx_demo)set(CMAKE_CXX_STANDARD 14)include_directories("D:/develop/easyx4mingw_20220901/include")
link_directories("D:/develop/easyx4mingw_20220901/lib64")add_executable(easyx_demo main.cpp)
target_link_libraries(easyx_demo -leasyx)

😆3. 使用说明

官网也提供了函数使用的文档,并给出了一些示例:https://docs.easyx.cn/zh-cn/char-matrix

窗口绘制圆的示例:

#include <graphics.h>
#include <conio.h>int main()
{initgraph(640, 480);  // 创建一个640x480的绘图窗口circle(320, 240, 100);  // 在窗口中心画一个半径为100的圆getch();  // 等待用户按下任意键closegraph();  // 关闭绘图窗口return 0;
}

获取鼠标和键盘事件示例:

#include <graphics.h>
#include <conio.h>
#include <stdio.h>int main()
{initgraph(640, 480);  // 创建一个640x480的绘图窗口while (true){// 监听键盘事件if (kbhit()){char ch = getch();  // 获取键盘按键if (ch == 'q' || ch == 'Q')break;  // 如果按下了Q键,退出循环}// 监听鼠标事件if (MouseHit()){MOUSEMSG mouseMsg = GetMouseMsg();if (mouseMsg.uMsg == WM_MOUSEMOVE){int x = mouseMsg.x;int y = mouseMsg.y;// 在控制台输出鼠标移动的坐标printf("Mouse move: x = %d, y = %d\n", x, y);}else if (mouseMsg.uMsg == WM_LBUTTONDOWN){int x = mouseMsg.x;int y = mouseMsg.y;// 在控制台输出鼠标左键按下的坐标printf("Left button down: x = %d, y = %d\n", x, y);}else if (mouseMsg.uMsg == WM_LBUTTONUP){int x = mouseMsg.x;int y = mouseMsg.y;// 在控制台输出鼠标左键释放的坐标printf("Left button up: x = %d, y = %d\n", x, y);}}}closegraph();  // 关闭绘图窗口return 0;
}

鼠标操作与绘制示例:

#include <graphics.h>int main()
{// 初始化图形窗口initgraph(640, 480);ExMessage m;		// 定义消息变量while(true){// 获取一条鼠标或按键消息m = getmessage(EX_MOUSE | EX_KEY);switch(m.message){case WM_MOUSEMOVE:// 鼠标移动的时候画红色的小点putpixel(m.x, m.y, RED);break;case WM_LBUTTONDOWN:// 如果点左键的同时按下了 Ctrl 键if (m.ctrl)// 画一个大方块rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);else// 画一个小方块rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);break;case WM_KEYDOWN:if (m.vkcode == VK_ESCAPE)return 0;	// 按 ESC 键退出程序}}// 关闭图形窗口closegraph();return 0;
}

贪吃蛇示例:

#include <graphics.h>
#include <conio.h>
#include <time.h>const int CELL_SIZE = 20;  // 每个单元格的尺寸
const int WIDTH = 800;  // 窗口宽度
const int HEIGHT = 600;  // 窗口高度
const int ROWS = HEIGHT / CELL_SIZE;  // 行数
const int COLS = WIDTH / CELL_SIZE;  // 列数struct Point  // 坐标点结构体
{int x, y;
};enum Direction  // 移动方向枚举
{UP,DOWN,LEFT,RIGHT
};void DrawCell(int x, int y, COLORREF color)
{setfillcolor(color);setlinecolor(color);fillrectangle(x * CELL_SIZE, y * CELL_SIZE, (x + 1) * CELL_SIZE, (y + 1) * CELL_SIZE);
}void DrawSnake(Point* snake, int length)
{for (int i = 0; i < length; i++){if (i == 0)DrawCell(snake[i].x, snake[i].y, RGB(0, 255, 0));  // 绘制蛇头elseDrawCell(snake[i].x, snake[i].y, RGB(0, 200, 0));  // 绘制蛇身}
}void GenerateFood(Point* snake, int length, Point& food)
{while (true){food.x = rand() % COLS;food.y = rand() % ROWS;bool overlap = false;for (int i = 0; i < length; i++){if (snake[i].x == food.x && snake[i].y == food.y){overlap = true;break;}}if (!overlap)break;}DrawCell(food.x, food.y, RGB(255, 0, 0));  // 绘制食物
}void UpdateSnake(Point* snake, int& length, Direction direction, bool& gameOver)
{Point head = snake[0];Point newHead = head;switch (direction){case UP:newHead.y--;break;case DOWN:newHead.y++;break;case LEFT:newHead.x--;break;case RIGHT:newHead.x++;break;}if (newHead.x < 0 || newHead.x >= COLS || newHead.y < 0 || newHead.y >= ROWS){gameOver = true;  // 越界,游戏结束return;}for (int i = length - 1; i > 0; i--){snake[i] = snake[i - 1];}snake[0] = newHead;for (int i = 1; i < length; i++){if (snake[i].x == newHead.x && snake[i].y == newHead.y){gameOver = true;  // 撞到自己,游戏结束return;}}
}int main()
{initgraph(WIDTH, HEIGHT);  // 创建一个指定宽高的绘图窗口srand(static_cast<unsigned int>(time(nullptr)));  // 初始化随机数种子Point* snake = new Point[ROWS * COLS];  // 蛇的坐标数组int length = 1;  // 蛇的初始长度Direction direction = RIGHT;  // 蛇的初始移动方向bool gameOver = false;  // 游戏是否结束// 初始化蛇的初始位置snake[0].x = COLS / 2;snake[0].y = ROWS / 2;Point food;  // 食物的坐标GenerateFood(snake, length, food);  // 生成食物while (!gameOver){// 监听键盘事件if (kbhit()){char ch = getch();switch (ch){case 'W':case 'w':if(direction != DOWN)direction = UP;break;case 'S':case 's':if (direction != UP)direction = DOWN;break;case 'A':case 'a':if (direction != RIGHT)direction = LEFT;break;case 'D':case 'd':if (direction != LEFT)direction = RIGHT;break;}}cleardevice();  // 清空绘图窗口UpdateSnake(snake, length, direction, gameOver);  // 更新蛇的位置if (snake[0].x == food.x && snake[0].y == food.y){length++;  // 蛇吃到食物,长度增加GenerateFood(snake, length, food);  // 生成新的食物}DrawSnake(snake, length);  // 绘制蛇DrawCell(food.x, food.y, RGB(255, 0, 0));  // 绘制食物Sleep(100);}delete[] snake;  // 释放内存closegraph();  // 关闭绘图窗口return 0;
}

在这里插入图片描述

以上。

相关文章:

【C++】开源:Windows图形库EasyX配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Windows图形库EasyX配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#…...

微信小程序 全局变量键值对map对象

在微信小程序中&#xff0c;键值对的map对象通常用于存储和操作键值对的集合。以下是一些常见的操作&#xff1a; 创建map对象 在JavaScript中&#xff0c;可以通过对象字面量语法或者使用new Map()来创建map对象 // 使用对象字面量 var map {key1: value1,key2: value2 };…...

20240131在WIN10下配置whisper

20240131在WIN10下配置whisper 2024/1/31 18:25 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】800&#xffe5; 2、请正确安装好NVIDIA最新的545版本的驱动程序和CUDA。 2、安装Torch 3、配置whisper http…...

3338 蓝桥杯 wyz的数组IV 简单

3338 蓝桥杯 wyz的数组IV 简单 //C风格解法1&#xff0c;通过率50% #include<bits/stdc.h>int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int n; std::cin >> n;int ans 0;std::vector<int>a(n);for(auto &am…...

git Filename too long

git Filename too long 原因&#xff1a; 文件名限制260长度 解决&#xff1a;全局配置git git config --system core.longpaths true查看&#xff1a; git config --get core.longpaths...

MySQL数据库-理论基础

1.1 什么是数据库 数据&#xff1a; 描述事物的符号记录&#xff0c; 可以是数字、 文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 数据库&#xff1a; 存储数据的仓库&#xff0c;是长期存放在计算机内、有组织…...

立体边界,让arcgis出图更酷炫一些

就是这样子的那个图—— 本期我们还是用长沙市为例&#xff0c; 来手把手的演示制作立体边界&#xff0c; 就是这个样子的边界—— 第一步—准备底图 其实你准备什么底图都可以哈&#xff0c;例如调用天地图、下载个影像图&#xff0c;或者用其他什么的底图&#xff0c;都是…...

【C++】 C++入门—内联函数

C入门 1 内联函数1.1 定义1.2 查看方式1.3 注意 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 1 内联函数 1.1 定义 程序在执行一个函数前需要做准备工作&#xff1a;要将实参、局部变量、返回地址以及若干寄存…...

软件工程知识梳理2-需求分析

需求分析时软件定义的最后一个阶段&#xff0c;它的基本任务时准确回答系统必须做什么的问题。 输出&#xff1a;本阶段必须的输出时软件需求规格说明书。 角色&#xff1a;需求分析员 参与者&#xff1a;用户、需求分析员 需求分析遵循的准则&#xff1a; 必须理解并描述问…...

mac裁剪图片

今天第一次用mac裁剪图片&#xff0c;记录一下过程&#xff0c;差点我还以为我要下载photoshop了&#xff0c; 首先准备好图片 裁剪的目的是把图片的标题给去掉&#xff0c;但是不能降低分辨率&#xff0c;否则直接截图就可以了 解决办法 打开原始图片(不要使用预览&#xf…...

Compose | UI组件(十) | Box,Surface - 帧布局

文章目录 前言Box 组件的参数说明Box 组件的使用Surface 的参数说明Surface 的使用 总结 前言 Box组件是 按子组件依次叠加 的布局组件&#xff0c;相当传统View中的 FrameLayout Box 组件的参数说明 Composable inline fun Box(modifier: Modifier Modifier, …...

种草日记|林曦老师的冬日好物分享

冬天将尽春天就要来了&#xff0c;换季的时候最容易引起皮肤干燥、头发毛躁不舒服的问题&#xff0c;今天就来说说林曦老师推荐的冬日护理爱用好物。大家都要“如婴儿乎”&#xff0c;照顾好自己哦&#xff5e;      1、Aco甘油保湿霜    Aco甘油保湿霜好大一罐&#x…...

【算法与数据结构】139、LeetCode单词拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以看做一个动态规划问题。其中&#xff0c;字符串s是背包&#xff0c;而字典中的单词就是物品。…...

NLP任务之Named Entity Recognition

深度学习的实现方法&#xff1a; 双向长短期记忆网络&#xff08;BiLSTM&#xff09;: BiLSTM是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;能够捕捉序列数据中的长期依赖关系。在NER任务中&#xff0c;BiLSTM能有效地处理文本序列&#xff0c;捕捉前后文本…...

NUXT3项目实践总结

目录 一、NUXT3实现黑夜白天模式切换 需求 实现 效果 二、scrollreveal插件实现动画效果 需求 实现 封装 使用 文档 效果 三、useSeoMeta的使用 作用 使用 效果 四、NUXT3开启代理 使用 注意 五、$fetch、useFetch 、useAsyncData的区别 六、错误页面处理 …...

中科星图——2020年全球30米地表覆盖精细分类产品V1.0(29个地表覆盖类型)

数据名称&#xff1a; 2020年全球30米地表覆盖精细分类产品V1.0 GLC_FCS30 长时序 地表覆盖 动态监测 全球 数据来源&#xff1a; 中国科学院空天信息创新研究院 时空范围&#xff1a; 2015-2020年 空间范围&#xff1a; 全球 数据简介&#xff1a; 地表覆盖分布…...

Tomcat 部署项目时 war 和 war exploded区别

在 Tomcat 调试部署的时候&#xff0c;我们通常会看到有下面 2 个选项。 是选择war还是war exploded 这里首先看一下他们两个的区别&#xff1a; war 模式&#xff1a;将WEB工程以包的形式上传到服务器 &#xff1b;war exploded 模式&#xff1a;将WEB工程以当前文件夹的位置…...

【开源】SpringBoot框架开发天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…...

go数据操作-MySQL

1.快速入门 下载依赖 go get -u github.com/go-sql-driver/mysql使用MySQL驱动 func Open(driverName, dataSourceName string) (*DB, error)Open打开一个dirverName指定的数据库&#xff0c;dataSourceName指定数据源&#xff0c;一般至少包括数据库文件名和其它连接必要的…...

基于node.js和Vue3的医院挂号就诊住院信息管理系统

摘要&#xff1a; 随着信息技术的快速发展&#xff0c;医院挂号就诊住院信息管理系统的构建变得尤为重要。该系统旨在提供一个高效、便捷的医疗服务平台&#xff0c;以改善患者就医体验和提高医院工作效率。本系统基于Node.js后端技术和Vue3前端框架进行开发&#xff0c;利用其…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...