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

论“graphics.h”库,easyx

前言

别人十步我则百,别人百步我则千

你是否有这样的想法,把图片到入进c++里,亦或者能实时根据你发出的信息而做出回应的程序,graphics.h这个库完美满足了你的需求,那今天作者就给大家介绍一下这个库,并做一些运用。

何为graphics.h?

graphics.h是一个库,但一般的c++编译器中不含有,想要下载需要去easyx.

graphics.h基础语法

此库中含有的内容众多,此下分开介绍

绘图相关

绘图窗口

想要在graphics.h大显身手,一个输出工具是必须的,不同于只会输出字符的终端,绘图窗口顾名思义可以进行绘图,下面介绍两个函数关于绘图窗口:

initgraph

此函数可以新建一个绘图窗口,具体格式以下代码

HWND initgraph(int width,int height,int flag = NULL//可省
);

width
绘图窗口的宽度。

height
绘图窗口的高度。

flag对于初学者来说不太能用上,这里不在赘述。

示例:

initgraph(114,514);
//此代码创建出了一个宽为114,高为514的绘图窗口
cleardevice

此函数的功能类似于清空当前绘图窗口,具体格式如下:

void cleardeice();

示例:

cleardeice();
//清空

图形绘制

接下来会给一张表,为重要的函数

函数描述
circle画无填充的圆
ellipse画无填充的椭圆
line画直线
pie画无填充的扇形
rectangle画无填充的矩形
soildcircle画填充圆
solidellipse画填充椭圆
solidpie画填充扇形
solidrectangle画填充矩形
solid/circle

格式:

void circle(int x,int y,int radius
);

x
圆心的x坐标。

y
圆心的y坐标。

radius
圆的半径

solid/ellipse

格式:

void ellipse(int left,int top,int right,int bottom
);

left
椭圆外切矩形的左上角 x 坐标。

top
椭圆外切矩形的左上角 y 坐标。

right
椭圆外切矩形的右下角 x 坐标。

bottom
椭圆外切矩形的右下角 y 坐标。

line

格式:

void line(int x1,int y1,int x2,int y2
);

x1
直线的起始点的 x 坐标。

y1
直线的起始点的 y 坐标。

x2
直线的终止点的 x 坐标。

y2
直线的终止点的 y 坐标。

solid/rectangle

格式

void rectangle(int left,int top,int right,int bottom
);

left
矩形左部 x 坐标。

top
矩形顶部 y 坐标。

right
矩形右部 x 坐标。

bottom
矩形底部 y 坐标。

soild/pie

格式:

void pie(int left,int top,int right,int bottom,double stangle,double endangle
);

left
扇形所在椭圆的外切矩形的左上角 x 坐标。

top
扇形所在椭圆的外切矩形的左上角 y 坐标。

right
扇形所在椭圆的外切矩形的右下角 x 坐标。

bottom
扇形所在椭圆的外切矩形的右下角 y 坐标。

stangle
扇形的起始角的弧度。

endangle
扇形的终止角的弧度。

图片处理

图片处理是这个库中的重头戏,也正是他十分出名的原因,接下来我来为大家介绍

IMAGE

在c++中有许多数据类型,证书有int,long long,等等,浮点数有float,double,字符有char,布尔有bool,图片当然也要有他的数据类型,那就是IMAGE,注意不要忘记大写

格式:

class IMAGE(int width = 0, int height = 0);

int getwidth();
返回 IMAGE 对象的宽度,以像素为单位。

int getheight();
返回 IMAGE 对象的高度,以像素为单位。

loadimage

有了定义,没有输入怎么行呢,此函数的功能就类似于此,但不需要自己手动输入,而是输入文件地址,自动加载

格式:

void loadimage(IMAGE* pDstImg,			// 保存图像的 IMAGE 对象指针LPCTSTR pImgFile,		// 图片文件名int nWidth = 0,			// 图片的拉伸宽度,可省int nHeight = 0,		// 图片的拉伸高度,可省bool bResize = false	// 是否调整 IMAGE 的大小以适应图片,可省
);

pDstImg
保存图像的 IMAGE 对象指针。如果为 NULL,表示图片将读取至绘图窗口。

pImgFile
图片文件名。支持 bmp / gif / jpg / png / tif / emf / wmf / ico 格式的图片。
nWidth
图片的拉伸宽度。加载图片后,会拉伸至该宽度。如果为 0,表示使用原图的宽度。

nHeight
图片的拉伸高度。加载图片后,会拉伸至该高度。如果为 0,表示使用原图的高度。

bResize
是否调整 IMAGE 的大小以适应图片。

举个例子:

IMAGE img1;
loadimage(&img1, _T("test.jpg"));

这是定义完后,从test.jpg加载图片

putimage

有了输入,没有输出怎么能行呢?

格式:

void putimage(int dstX,				// 绘制位置的 x 坐标int dstY,				// 绘制位置的 y 坐标IMAGE *pSrcImg,			// 要绘制的 IMAGE 对象指针DWORD dwRop = SRCCOPY	// 三元光栅操作码,可省
);

举个例子

initgraph(500,500);
IMAGE img1;
loadimage(&img1, _T("test.jpg"));
putimage(300,300,&img);

这是创建窗口后,进行加载图片后,又将图片输出在300,300位置

消息处理

你有没有想过用代码编写一个小游戏,但苦于不能动态接受信息,这个模块将完美解决你的问题

ExMessage

这个类跟int一样是一个数据结构用来存储消息,例如鼠标的敲击或移动

格式:

struct ExMessage
{USHORT message;					// 消息标识union{// 鼠标消息的数据struct{bool ctrl		:1;		// Ctrl 键是否按下bool shift		:1;		// Shift 键是否按下bool lbutton	:1;		// 鼠标左键是否按下bool mbutton	:1;		// 鼠标中键是否按下bool rbutton	:1;		// 鼠标右键short x;				// 鼠标的 x 坐标short y;				// 鼠标的 y 坐标short wheel;			// 鼠标滚轮滚动值,为 120 的倍数};// 按键消息的数据struct{BYTE vkcode;			// 按键的虚拟键码BYTE scancode;			// 按键的扫描码(依赖于 OEM)bool extended	:1;		// 按键是否是扩展键bool prevdown	:1;		// 按键的前一个状态是否按下};// 字符消息的数据TCHAR ch;// 窗口消息的数据struct{WPARAM wParam;LPARAM lParam;};};
};

大家不要害怕有一大堆,其实真正用到的没几个(喜)

peekmessage

此函数的作用类似cin,但是他是类似动态的输入消息

bool peekmessage(ExMessage *msg, BYTE filter = -1//可省, bool removemsg = true//可省);

msg
指向消息结构体 ExMessage 的指针,用来保存获取到的消息。

filter
指定要获取的消息范围,默认 -1 获取所有类别的消息。可以用以下值或值的组合获取指定类别的消息:

EX_MOUSE 鼠标消息。
EX_KEY 按键消息。
EX_CHAR 字符消息。
EX_WINDOW 窗口消息。

removemsg
在 peekmessage 处理完消息后,是否将其从消息队列中移除。

举个例子

ExMessage msg;
while (peekmessage(&msg))//获得消息
{if (msg.message == WM_KEYDOWN)//判断消息是否是由键盘发出{switch (msg.vkcode)//如果是方向键{case VK_UP://上//具体行动case VK_DOWN://下//具体行动case VK_LEFT://左//具体行动case VK_RIGHT://右//具体行动}}
}

此代码实现了一个简单的小程序,通过动态输入而做出具体行动。

自己做的小游戏

经历了上述教程后,我们终于可以实现最初的目标,接下来贴出我的程序

很简陋,只能进行基础的移动,但经历了很多的优化

#include <graphics.h>
#include <Windows.h>
#include <string>
#include <iostream>const int player_zs = 3;
const int player_vis = 3;
int dqzsy = 0;IMAGE player_right[player_zs];POINT player_pos = { 500,500 };#pragma comment(lib,"MSIMG32.LIB")inline void putimgage_alpha(int x, int y, IMAGE* img)
{int w = img->getwidth();int h = img->getheight();AlphaBlend(GetImageHDC(NULL), x, y, w, h,GetImageHDC(img), 0, 0, w, h, { AC_SRC_OVER,0,255,AC_SRC_ALPHA });
}void loadimg()
{for (size_t i = 0; i < player_zs; i++){std::wstring path = L"img/player_right_" + std::to_wstring(i) + L".png";loadimage(&player_right[i], path.c_str());}
}
int main()
{std::cout << "由aqzjklo制作的小游戏" << std::endl;system("pause");std::cout << "感谢游玩,祝你有一个美好的一天";initgraph(1280, 720);bool running = true;ExMessage msg;IMAGE background;bool moveup = 0, movedown = 0, moveright = 0, moveleft = 0;loadimage(&background, _T("img/background.png"));loadimg();BeginBatchDraw();while (running){DWORD start_time = GetTickCount();while (peekmessage(&msg)){if (msg.message == WM_KEYDOWN){switch (msg.vkcode){case VK_UP:moveup = 1;break;case VK_DOWN:movedown = 1;break;case VK_LEFT:moveleft = 1;break;case VK_RIGHT:moveright = 1;break;}}else if (msg.message == WM_KEYUP){switch (msg.vkcode){case VK_UP:moveup = 0;break;case VK_DOWN:movedown = 0;break;case VK_LEFT:moveleft = 0;break;case VK_RIGHT:moveright = 0;break;}}}if (moveup){player_pos.y -= player_vis;}if (movedown){player_pos.y += player_vis;}if (moveleft){player_pos.x -= player_vis;}if (moveright){player_pos.x += player_vis;}static int counter = 0;if (++counter % (player_zs-1) == 0){dqzsy++;}dqzsy = dqzsy % player_zs;cleardevice();putimage(0, 0, &background);putimgage_alpha(player_pos.x, player_pos.y, &player_right[dqzsy]);FlushBatchDraw();DWORD end_time = GetTickCount() - start_time;if (end_time < 1000 / 60) Sleep(1000 / 60 - end_time);}EndBatchDraw();
}

后记

一千个人里有一千个哈姆雷特,每个人的代码和思路都是独特的,期待你的程序在历史上留下浓墨重彩的一笔!

最后希望此帖子能对大家有一些帮助,谢谢

相关文章:

论“graphics.h”库,easyx

前言 别人十步我则百&#xff0c;别人百步我则千 你是否有这样的想法&#xff0c;把图片到入进c里&#xff0c;亦或者能实时根据你发出的信息而做出回应的程序&#xff0c;graphics.h这个库完美满足了你的需求&#xff0c;那今天作者就给大家介绍一下这个库&#xff0c;并做一些…...

如何在寂静中用电脑找回失踪的手机?远程控制了解一下

经过一番努力&#xff0c;我终于成功地将孩子哄睡了。夜深人静&#xff0c;好不容易有了一点自己的时间&#xff0c;就想刷手机放松放松&#xff0c;顺便看看有没有重要信息。但刚才专心哄孩子去了&#xff0c;一时就忘记哄孩子之前&#xff0c;顺手把手机放哪里去了。 但找过手…...

Android 实现动态换行显示的 TextView 列表

在开发 Android 应用程序时&#xff0c;我们经常需要在标题栏中显示多个 TextView&#xff0c;而这些 TextView 的内容长度可能不一致。如果一行内容过长&#xff0c;我们希望它们能自动换行&#xff1b;如果一行占不满屏幕宽度&#xff0c;则保持在一行内。本文将带我们一步步…...

Golang | Leetcode Golang题解之第352题将数据流变为多个不相交区间

题目&#xff1a; 题解&#xff1a; type SummaryRanges struct {*redblacktree.Tree }func Constructor() SummaryRanges {return SummaryRanges{redblacktree.NewWithIntComparator()} }func (ranges *SummaryRanges) AddNum(val int) {// 找到 l0 最大的且满足 l0 < val…...

Ubuntu安装mysql 以及远程连接mysql Windows—适合初学者的讲解(详细)

目录 准备工作 一.Xshell中操作 &#xff08;1&#xff09;在虚拟机中安装mysql &#xff08;2&#xff09;连接Windows数据库 &#xff08;3&#xff09;进入linux数据库。 &#xff08;4&#xff09;修改mysql配置文件 二.Windows命令窗口操作 需要软件虚拟机&#xff0c;Xsh…...

【数学建模】MATLAB快速入门

文章目录 1. MATLAB界面与基本操作1.1 MATLAB的基本操作 2. MATLAB字符串和文本2.1 string变量2.2 char变量 3. MATLAB的矩阵运算 1. MATLAB界面与基本操作 初始界面&#xff1a; 刚开始的界面只要一个命令行窗口&#xff0c;为了使编辑界面出现我们需要新建一个文件&#xff…...

【ubuntu24.04】k8s 部署5:配置calico 镜像拉取

kubeadm - 中国大陆版建议:初始化Kubeadm –apiserver-advertise-address 这个地址是本地用于和其他节点通信的IP地址 –pod-network-cidr pod network 地址空间 sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-add…...

Elasticsearch 的数据备份与恢复

在生产环境中&#xff0c;数据的安全性和可靠性至关重要。对于基于 Elasticsearch 的系统而言&#xff0c;数据备份与恢复是确保数据完整性、应对灾难恢复的关键操作。本文将详细介绍 Elasticsearch 中如何进行数据备份与恢复&#xff0c;帮助管理员构建一个可靠的数据保护策略…...

Ps:首选项 - 暂存盘

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“暂存盘” Scratch Disks选项卡通过合理配置和管理暂存盘&#xff0c;可以显著提高 Photoshop 的运行性能&#xff0c;特别是在处理复杂的设计项目或大型图像文件时。选择合适…...

力扣217题详解:存在重复元素的多种解法与复杂度分析

在本篇文章中&#xff0c;我们将详细解读力扣第217题“存在重复元素”。通过学习本篇文章&#xff0c;读者将掌握如何使用多种方法来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力扣第217…...

享元模式:轻量级对象共享,高效利用内存

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;用于减少对象数量、降低内存消耗和提高系统性能。它通过共享相似对象的内部状态&#xff0c;减少重复创建的对象。下面将具体介绍享元模式的各个方面&#xff1a; 组成 抽象享元&#xff0…...

人工智能-自然语言处理(NLP)

人工智能-自然语言处理&#xff08;NLP&#xff09; 1. NLP的基础理论1.1 语言模型&#xff08;Language Models&#xff09;1.1.1 N-gram模型1.1.2 词嵌入&#xff08;Word Embeddings&#xff09;1.1.2.1 词袋模型&#xff08;Bag of Words, BoW&#xff09;1.1.2.2 TF-IDF&a…...

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(三)---创建自定义激光雷达Componet组件

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础&#xff0c;Nav2相关的学习教程可以参考本人的其他博…...

C++ 设计模式——策略模式

策略模式 策略模式主要组成部分例一&#xff1a;逐步重构并引入策略模式第一步&#xff1a;初始实现第二步&#xff1a;提取共性并实现策略接口第三步&#xff1a;实现具体策略类第四步&#xff1a;实现上下文类策略模式 UML 图策略模式的 UML 图解析 例二&#xff1a;逐步重构…...

【书生大模型实战营(暑假场)闯关材料】基础岛:第3关 浦语提示词工程实践

1.配置环境时遇到的问题 注意要使用terminal&#xff0c;而不是jupyter。 否则退出TMUX会话时&#xff0c;会出问题。 退出TMUX会话命令如下&#xff1a; ctrlB D # 先按CTRLB 随后按D另外一个是&#xff0c;端口转发命令 ssh -p XXXX rootssh.intern-ai.org.cn -CNg -L …...

C++ | Leetcode C++题解之第350题两个数组的交集II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int length1 nums1.size(), length2 nums2…...

遗传算法原理与实战(python、matlab)

遗传算法 1.什么是遗传算法 遗传算法&#xff08;Genetic Algorithm&#xff0c;简称GA&#xff09;是一种基于生物进化论和遗传学原理的全局优化搜索算法。它通过模拟自然界中生物种群的遗传机制和进化过程来解决复杂问题&#xff0c;如函数优化、组合优化、机器学习等。遗传…...

《黑神话:悟空》媒体评分解禁 M站均分82

《黑神话&#xff1a;悟空》媒体评分现已解禁&#xff0c;截止发稿时&#xff0c;M站共有43家媒体评测&#xff0c;均分为82分。 部分媒体评测&#xff1a; God is a Geek 100&#xff1a; 毫无疑问&#xff0c;《黑神话&#xff1a;悟空》是今年最好的动作游戏之一&#xff…...

安卓中携程和线程的区别。携程是指什么?

在安卓和其他编程环境中&#xff0c;协程&#xff08;Coroutine&#xff09;和线程&#xff08;Thread&#xff09;是两种不同的并发处理机制。它们各自有独特的特点和适用场景&#xff1a; 线程&#xff08;Thread&#xff09;&#xff1a; 线程是操作系统能够进行运算调度的最…...

部署flannel网络(master服务器执行)遇到错误

出现错误 “The connection to the server 192.168.0.23:6443 was refused - did you specify the right host or port?” 的原因通常是因为 Kubernetes API 服务器未能启动或无法访问。以下是一些可能的原因和解决方案&#xff1a; 解决方案 确认 Kubernetes API 服务器的状…...

RTL8188EU USB WiFi模块AP模式配置避坑指南

RTL8188EU USB WiFi模块AP模式配置实战&#xff1a;从编译到避坑全解析 在物联网和嵌入式开发领域&#xff0c;RTL8188EU USB WiFi模块因其低成本和高兼容性被广泛使用。但当你尝试将其配置为AP模式时&#xff0c;官方hostapd的兼容性问题往往会让开发者陷入数天的调试泥潭。我…...

用51单片机+Proteus仿真,从零到一复刻一个数码管电子钟(附完整代码和电路图)

从零构建51单片机数码管电子钟&#xff1a;Proteus仿真与实战全解析 数码管电子钟作为单片机入门经典项目&#xff0c;能系统训练定时器、中断、数码管驱动等核心技能。但很多初学者在独立实现时&#xff0c;常遇到仿真效果不稳定、显示闪烁或计时不准等问题。本文将用保姆级教…...

Windows加域必看:如何用PowerShell一键指定OU路径(附完整代码)

Windows域管理自动化&#xff1a;PowerShell指定OU路径的终极指南 在大型企业IT环境中&#xff0c;计算机加域操作从来不是单次事件&#xff0c;而是需要批量执行的常规运维任务。传统手动操作不仅效率低下&#xff0c;还容易因人为失误导致计算机被放入错误的组织单元(OU)。想…...

免费窗口调整工具:3分钟学会强制修改任意窗口大小

免费窗口调整工具&#xff1a;3分钟学会强制修改任意窗口大小 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些无法拖拽、尺寸固定的应用程序窗口而烦恼吗&#xff1f;Wi…...

Flutter文件操作实战:File_selector跨平台文件处理从入门到精通

1. 为什么Flutter开发者都需要掌握File_selector&#xff1f; 在移动应用和桌面应用开发中&#xff0c;文件操作就像我们日常生活中的"文件柜"——你需要存放、查找、整理各种文档。而Flutter作为跨平台框架&#xff0c;最大的挑战就是如何在不同操作系统上实现统一的…...

低代码组件“看似简单,上线即崩”?20年专家拆解5个被90%团队忽略的线程安全与事务传播陷阱

第一章&#xff1a;低代码组件“看似简单&#xff0c;上线即崩”的真相低代码平台承诺“拖拽即交付”&#xff0c;但真实生产环境中&#xff0c;大量业务系统在上线后数小时内便出现表单提交失败、数据丢失、权限错乱或页面白屏等问题。这些故障并非源于复杂逻辑&#xff0c;而…...

Tetrazine-amine HCl salt,CAS:1416711-59-5,四嗪-氨基盐酸盐的描述

Tetrazine-amine HCl salt&#xff08;四嗪-氨基盐酸盐&#xff09;是一种结合了四嗪基团和氨基盐酸盐结构的化合物&#xff0c;在化学、生物医药和材料科学等领域具有广泛应用。一、基本信息中文名称&#xff1a;四嗪-氨基盐酸盐英文名称&#xff1a;Tetrazine-amine HCl salt…...

如何将笔记从 iCloud 传输到 iPhone:分步指南

iPhone 上的“备忘录”应用是一款便捷的工具&#xff0c;可以用来记录待办事项、日记、想法等等。它能帮助我们追踪需要完成的事情。借助 iCloud 的自动同步功能&#xff0c;你的备忘录可以安全地存储在云端&#xff0c;并可通过任何 Apple 设备甚至电脑访问。将笔记从 iPhone …...

像素剧本圣殿一文详解:复古未来像素美学×专业剧本格式输出规范

像素剧本圣殿一文详解&#xff1a;复古未来像素美学专业剧本格式输出规范 1. 工具概览与核心价值 像素剧本圣殿&#xff08;Pixel Script Temple&#xff09;是一款专为影视、游戏编剧设计的AI创作工具。基于Qwen2.5-14B-Instruct大模型深度微调&#xff0c;它巧妙融合了8-Bi…...

C语言调用Omni-Vision Sanctuary轻量级推理接口(C API)教程

C语言调用Omni-Vision Sanctuary轻量级推理接口&#xff08;C API&#xff09;教程 1. 引言&#xff1a;为什么选择C API&#xff1f; 在嵌入式设备和资源受限的环境中&#xff0c;Python运行时往往显得过于臃肿。Omni-Vision Sanctuary提供的C语言接口&#xff08;C API&…...