easyx保姆级教程---->从游戏玩家到游戏制作者

news2025/1/16 2:41:31

在这里插入图片描述
请点击这里:安装教程

1.头文件

#include<easyx.h>    //这个是只包含最新的API(函数接口)
#include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数

2.窗口

1.初始化绘制窗口

initgraph(width,height,flag);   //窗口宽度,高度,样式
//窗口样式
//1.在绘图窗口支持鼠标双击事件
EX_DBLCKS
//2.禁用绘图窗口的关闭按钮
EX_NOCLOSE
//3.禁用绘图窗口的最小化按钮
EX_NOMINIMIZE
//4.显示控制台窗口
EX_SHOWCONSOLE

注:窗口事件可以通过按位或( | )连接使用

2.设置窗口的背景颜色

setbkcolor();//可以用RGB(),也可以使用英文大写

3.用设置的背景颜色填充整个窗口—>清屏

cleardevice();

4.窗口的坐标体系

窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏

3.绘制

1.点

putpixel(x,y,color);

2.线

line(x1,y1,x2,y2); //起始坐标,终止坐标
//可以使用getwidth() gethight()
//获取窗口的宽度和高度

//设置线条颜色
setlinecplor();

//样式
setlinestyle(样式,宽度);

样式

在这里插入图片描述

3.正矩形

rectangle(x1,y1,x2,y2);   //左上角坐标,右下角坐标---->无填充矩形
fillrectangle();          //填充矩形
solidrectangle();         //无边框填充矩形
setfillcolor();           //颜色填充

4.圆角矩形

roundrect(x1,y1,x2,y2,宽度,高度);
//也有
fillroundrect()和solidroundrect()

宽度、高度讲解

在这里插入图片描述

5.圆形

circle(x,y,r);  //圆心坐标和半径
//当然也有
fillcircle()solidcircle()

6.椭圆

ellipse(x1,y1,x2,y2);         //矩形左上角和右下角坐标,椭圆就是该矩形的内切
//也有
fillellipse()solidellipse()

4.文字

1.绘制文字

outtextxy(x,y,文字)

文字乱码、不显示问题:

  1. 原因:编码格式不同
  2. 三种解决方案:
  • 在字符串前面加上L进行转换(强制转换)
  • 用带参宏(_T() 或者 _TEXT())把字符串包起来,自适应转换
  • 设置:菜单栏 – 属性 – 高级 – 字符集 – Unicode改为多字节

2.设置文字大小

settextstyle(高度,宽度,字体);     //宽度为0表示自适应

3.设置颜色

settextcolor();

4.设置背景模式

setbkmode(TRANSPARENT);  //透明
//如果不设置,那么文字会带有背景颜色

5.练习

题目:现有一个int类型的分数,需要输出到图形界面上

int score=88;
char str[50]="";
sprintf(str,"%d",score);
outtextxy(x,y,str);
//必须要把score格式化到str中,否则输出的讲是score的ASCII码值

6.文字居中显示在指定的区域

	int rx = 300, ry = 200, rw = 50, rh = 50;
	rectangle(300, 200, 350, 250);
	settextcolor(YELLOW);
	char str[] = "Center Text!";
	int hSpace = (rw - textwidth(str)) / 2;
	int vSpace = (rh - textheight(str)) / 2;
	outtextxy(rx + hSpace, ry + vSpace, str);

思路就是把大矩形中间放一个小矩形,然后求出大矩形边到小矩形边的距离,得出小矩形坐标,把文字写在小矩形位置,来个图例解释:
在这里插入图片描述

5.消息处理—–>鼠标消息

#include<stdio.h>
#include<easyx.h>
int main()
{
	initgraph(800, 800, EX_SHOWCONSOLE | EX_DBLCLKS); 
    //如果要使用双击事件,必须加上EX_DBLCLKS
    
	//定义消息结构体变量
	ExMessage msg = { 0 };
	while (true)
	{
		//获取消息
		if (peekmessage(&msg, EX_MOUSE))        //返回bool类型
		{
			switch (msg.message)
			{
			case WM_LBUTTONDOWN:               //左键按下
				printf("%d %d左键按下!\n",msg.x,msg.y);   //获取坐标
				break;
			case WM_RBUTTONDOWN:               //右键按下
				printf("右键按下!\n");
				break;
			case WM_MBUTTONDOWN:               //中键按下
				printf("中键按下\n");
				break; 
			case WM_MOUSEWHEEL:                //滚轮滑动
				printf("%d滚轮滑动\n",msg.wheel);   
                 //获取滚轮滑动方向,正朝屏幕,负朝自己
				break;
			case WM_LBUTTONDBLCLK:            //左键双击
				printf("左键双击\n");
				break;
			case WM_MOUSEMOVE:                //鼠标移动
				printf("鼠标移动\n");
				break;
			}
		}
	}
	return 0;
}

6.消息处理——->按钮

#include<stdio.h>
#include<easyx.h>
bool inArea(int mx, int my, int x, int y, int w, int h);
bool button(int x, int y, int w, int h, const char* text);
ExMessage msg = { 0 };
int main()
{
	initgraph(640, 640, EX_SHOWCONSOLE);
	setbkcolor(RED);
	cleardevice();
	while (true)
	{
		//获取消息
		if(peekmessage(&msg,EX_MOUSE)){}
		//双缓冲绘图:所有的绘图代码必须放在begin和end之间
		BeginBatchDraw();
		cleardevice();
		if(button(20,20,150,35,"Start Game"))
		{
			printf("Start Game!\n");
		}
		if (button(300, 20, 150, 35, "End Game")) 
		{
			printf("End Game!\n");
		}
		EndBatchDraw();
        //一轮循环消息需要为零,否则点一次出现多次效果
		msg.message = 0;
	}
	return 0;
}

//判断鼠标是否在按钮区域内
bool inArea(int mx, int my, int x, int y, int w, int h)
{
	if (mx > x && mx<x + w && my>y && my < y + h) 
	{
		return true;
	}
	return false;
}

bool button(int x, int y, int w, int h, const char* text)
{
    //鼠标在按钮区域内按钮变色
	if (inArea(msg.x, msg.y, x, y, w, h))
	{
		setfillcolor(RGB(210, 226, 128));
	}
	else
	{
		setfillcolor(RGB(255, 255, 255));
	}
    
	//绘制按钮
	fillroundrect(x, y, x + w, y + h, 5, 5);
    
	//绘制按钮文本
	int hSpace = (w - textwidth(text)) / 2;
	int vSpace = (h - textheight(text)) / 2;
	settextcolor(BLACK);
	setbkmode(TRANSPARENT);
	outtextxy(x + hSpace, y + vSpace, text);
    
	//判断按钮是否被点击
	if (msg.message == WM_LBUTTONDOWN && inArea(msg.x, msg.y, x, y, w, h))
	{
		return true;
	}
	return false;
}

7.消息处理——>按键消息

下面以小球移动为案例讲解

#include<stdio.h>
#include<easyx.h>
#include<time.h>
int main()
{
	initgraph(800, 640, EX_SHOWCONSOLE);
	setbkcolor(RGB(209, 226, 122));
	cleardevice();
	ExMessage msg = { 0 };
	int x = 80, y = 80, vx = 0, vy = 0, speed = 5; //vx,vy代表方向
	clock_t Fps = 1000 / 60;              //1s/60f=16.6每一帧应该花费的时间
	int startTime = 0;
	int freamTime = 0;
	while (true)
	{
		startTime = clock();    //开始时间
		BeginBatchDraw();
		cleardevice();
		setfillcolor(RED);
		fillcircle(x, y, 25);
		EndBatchDraw();
		if(peekmessage(&msg,EX_MOUSE|EX_KEY)){}  //EX_KEY获取按键消息
		if (msg.message == WM_KEYDOWN) 
		{
			switch (msg.vkcode)
			{
			case VK_UP:
				vy = -1;
				break;
			case VK_DOWN:
				vy = 1;
				break;
			case VK_LEFT:
				vx = -1;
				break;
			case VK_RIGHT:
				vx = 1;
				break;
			}
		}
		else if(msg.message==WM_KEYUP)
		{
			switch (msg.vkcode)
			{
			case VK_UP:
				vy = 0;
				break;
			case VK_DOWN:
				vy = 0;
				break;
			case VK_LEFT:
				vx = 0;
				break;
			case VK_RIGHT:
				vx = 0;
				break;
			}
		}
		x += vx * speed;                   //坐标变化
		y += vy * speed;
		freamTime = clock() - startTime;    //运行时间
		if (freamTime < 16)
		{
			Sleep(Fps - freamTime);
		}
		msg.message = 0;
	}
	return 0;
}

8.图片加载输出

1.定义图片变量

IMAGE img_king;

2.加载路径

loadimage(&img_king,"图片路径",nwidth,nheight);
//图片路径有两种:1.绝对路径:带盘符的路径   2.相对路径:该文件位置下的图片
//后面两个参数为把图片缩放的宽度高度

3.输出图片

putimage(x,y,&img_king);

9.图片透明贴图

IMGAGE img_king[2];
loadimage(img_king+0,"");
loadimage(img_king+1,"");
putimage(20,20,img_king+0,NOTSRCERASE);   //先绘制掩码图,必须加上最后一个参数
putimage(20,20,img_king+1,SRCINVERT);     //再绘制原图,最后一个参数必须加上
//PNG图片为透明---->没有背景颜色,但是eaxyz不支持

10、单帧多图动画

#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include"tools.hpp"
int main()
{
	initgraph(700, 700, EX_SHOWCONSOLE);
	setbkcolor(RGB(208, 225, 123));
	IMAGE img_king[4];
	char path[100] = { 0 };
	for (int i = 0; i < 4; i++)
	{
		sprintf(path, "./asset/king%d.jpeg", i + 1);
		loadimage(img_king + i, path,700,700);
	}
	const int frameDelay = 1000 / 60;
	int frameStart = 0, frameTime = 0, index = 0, speed = 1000;
	while (true)
	{
		frameStart = clock();
		BeginBatchDraw();
		cleardevice();
		drawImg(0, 0, img_king + index);
		EndBatchDraw();
		index = (clock() / speed) % 4;
		frameTime = clock() - frameStart;
		if (frameTime<16)
		{
			Sleep(frameDelay - frameTime);
		}
	}
	return 0;
}

11.精灵表动画

所谓精灵表动化就是把一张图中的小图片当成动画播放,以下面这张图为例子讲解:

在这里插入图片描述

#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include"tools.hpp"
int main()
{
	initgraph(900, 700, EX_SHOWCONSOLE);
	setbkcolor(RGB(208, 225, 123));
	IMAGE img_king;
	loadimage(&img_king, "./asset/king0.jpeg");
	int imgwSize = 240, imghSize = 190;  ///小图片尺寸
	const int frameDelay = 1000 / 60;
	int frameStart = 0, frameTime = 0, index = 0, speed = 1000;
	int i = 0;
	while (true)
	{
		frameStart = clock();
		BeginBatchDraw();
		cleardevice();
		drawImg(50,50,imgwSize,imghSize,&img_king,index*imgwSize,i);
        //后面两个参数为小图片相对于大图片的横纵坐标
		EndBatchDraw();
		if (index*imgwSize>=720)
		{
			i = 190;
		}
		if (index == 5) 
		{
			i = 0;
		}
		index = (clock() / speed) % 6;
		frameTime = clock() - frameStart;
		if (frameTime < 16)
		{
			Sleep(frameDelay - frameTime);
		}
	}
	return 0;
}

12、句柄操作

#include<easyx.h>
#include<stdio.h>
void change();
int main()
{
	initgraph(640, 640, EX_SHOWCONSOLE);
	setbkcolor(RGB(209, 226, 124));
	cleardevice();
	change();
	getchar();
}
void change()
{
	//获取窗口句柄
	HWND hnd = GetHWnd();
	//设置窗口标题
	SetWindowText(hnd, "king");
	//弹出窗口提示用户操作
	int isok = MessageBox(hnd, "恭喜你中奖500w", "提示", MB_OKCANCEL);  
    //第一个参数设置为hnd,则必须先点击弹出窗口,设置为NULL时都可以点击
    //提示为弹出窗口标题
	if(isok==IDOK)
	{
		printf("ok\n");
	}
	else if(isok==IDCANCEL)
	{
		printf("取消\n");
	}
}

效果图:
在这里插入图片描述

13.音乐播放

#include<stdio.h>
#include<Windows.h>    
#include<mmsystem.h>               //多媒体头文件
#pragma comment(lib,"winmm.lib")   //连接库
void juddge_Error(int ret,const char str[]);
void playBackgroundMusic(const char* music, bool repeat = false, int volume = -1);
int main()
{
	playBackgroundMusic("asset/pyghlkn.mp3", false, 500);
	//专门用来播放音效----->wav
	//PlaySound("asset/CDImage.wav", NULL, SND_FILENAME | SND_ASYNC);
	//最后一个参数为异步,防音乐同时播放的卡顿
	getchar();
}

void juddge_Error(int ret,const char str[])
{
	if (ret != 0)
	{
		char err[100] = { 0 };
		mciGetErrorString(ret, err, 100);
		printf("[%s]:%s\n", str,err);
	}
}

void playBackgroundMusic(const char* music, bool repeat, int volume)
{
	static int i = 0;
	char cmd[100] = { 0 };
	sprintf(cmd, "open %s alias bgm%d", music, i);
	MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);   
	//如果失败返回非零值,成功返回零
	
	juddge_Error(ret, "open");

	sprintf(cmd, "play bgm%d %s", i, repeat ? "repeat" : "");
	ret = mciSendString(cmd, NULL, 0, NULL);
	juddge_Error(ret, "play");

	if (volume != -1) 
	{
		sprintf(cmd, "setaudio bgm%d volume to %d", i, volume);     
		//音效范围[0,1000]
		ret = mciSendString(cmd, NULL, 0, NULL);
		juddge_Error(ret, "volume");
	}

	i++;
}

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

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

相关文章

Domino Web应用中的搜索功能和结果选择问题

大家好&#xff0c;才是真的好。 还有不到十天Domino多瑙河版本就将发布&#xff0c;在此之前&#xff0c;我们还是讲述一下Web中的搜索技术。 废话不多说&#xff0c;我们直接上干货。 Notes应用的视图在Web浏览器中可以直接展现&#xff0c;并且可选择。 如果这样展现的话…

【QGIS入门实战精品教程】8.1:QGIS制作地图案例教程

文章目录 一、加载矢量数据二、加载影像底图三、美化矢量数据四、切换到排版视图五、添加经纬度格网六、添加其他修饰元素七、地图输出一、加载矢量数据 加载本实验数据基础数据.gpkg中的甘肃省政区矢量数据,如下所示: 二、加载影像底图 QGIS加载在线地图案例教程参考: 【…

5、Java中的JDBCJDBCUtilsJDBC控制事务getResource中文或有空格路径处理ResourceBundle演示

JDBC&#xff1a; 1. 概念&#xff1a;Java DataBase Connectivity Java 数据库连接&#xff0c; Java语言操作数据库 * JDBC本质&#xff1a;其实是官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口。各个数据库厂商去实现这…

回收租赁商城系统功能拆解04讲-商品品牌

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

第04章 程序控制结构

在程序中&#xff0c;程序运行的流程控制决定程序是如何执行的。 顺序控制 介绍&#xff1a; 程序从上到下的逐行的执行&#xff0c;中间没有任何判断和跳转。 使用&#xff1a;java中定义变量时&#xff0c;采用合法的前向引用。如&#xff1a; public class Test{int num…

【虚幻引擎】UE4/UE5像素流在广域网上(云)部署(多实例)

一、选择云服务器 每个云平台都提供许多预设的镜像选择&#xff0c;由于像素流技术目前只支持Windows操作系统&#xff0c;所以我们需要选择Windows Server的镜像&#xff0c;2012/2016/2019皆可。我们这里选择了Windows Server 2016 R2 简体中文版的镜像&#xff0c;之所以选择…

【SSM整合】对Spring、SpringMVC、MyBatis的整合,以及Bootstrap的使用,简单的新闻管理系统

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;【Spring】 &#x1f96d;本文内…

代码随想录第53天|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

1143.最长公共子序列 和718.最长重复子数组类似 包括二维数组初始化这些 不同之处在于递推公式主要就是两大情况&#xff1a; text1[i - 1] 与 text2[j - 1]相同&#xff0c;text1[i - 1] 与 text2[j - 1]不相同 如果text1[i - 1] 与 text2[j - 1]相同&#xff0c;那么找到了…

Windows/Linux日志分析

Windows日志分析 Windows系统日志是记录系统中硬件、软件和系统问题的信息&#xff0c;同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因&#xff0c;或者寻找受到攻击时攻击者留下的痕迹。 Windows主要有以下三类日志记录系统事件&#xff1a;应用程序日志…

【链表】leetcode707.设计链表(C/C++/Java/Js)

leetcode707.设计链表1 题目2 思路3 代码3.1 C版本3.2 C版本3.3 Java版本3.3.1 单链表3.3.2 双链表3.4 JavaScript版本4 总结1 题目 题源链接 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性&#xff1a;val 和 next。val 是当前节点的值&…

2022年地图产业研究报告

第一章 行业概况 地图是按照一定法则&#xff0c;有选择地以二维或多维形式与手段在平面或球面上表示地球&#xff08;或其它星球&#xff09;若干现象的图形或图像&#xff0c;它具有严格的数学基础、符号系统、文字注记&#xff0c;并能用地图概括原则&#xff0c;科学地反映…

canvasjs javascript-charts 3.7.3 Crack

canvasjs javascript-charts/ 3.7.3 具有 30 多种图表类型的 JavaScript 图表库 具有 10 倍性能和 30 多种图表类型的 JavaScript 图表和图形库。核心 JavaScript 图表库是独立的&#xff0c;但也带有流行框架的组件&#xff0c;如 React、Angular、Vue 等。图表响应迅速&#…

14、RH850 F1 RAM存储器介绍

前言: RAM——程序运行中数据的随机存取&#xff08;掉电后数据消失&#xff09;整个程序中&#xff0c;所用到的需要被改写的量&#xff0c;都存储在RAM中&#xff0c;“被改变的量”包括全局变量、局部变量、堆栈段&#xff0c;此专栏会有针对SPI的工作原理的详细介绍。 一、…

性能优化系列之如何选择合适的WebView内核?

文章の目录一、iOS UIWebView1、优点2、不足二、iOS WKWebView1、优势2、不足三、Android WebKit 和 Chromium四、Android 第三方1、X5 内核五、选型建议写在最后一、iOS UIWebView 1、优点 从 iOS 2 开始就作为 App 内展示 Web 内容的容器排版布局能力强 2、不足 内存泄露…

将两个对象以指定方法按指定轴对齐的DataFrame.align()方法

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】将两个对象以指定方法按指定轴对齐DataFrame.align()选择题关于以下python代码说法错误的一项是?import pandas as pddf1 pd.DataFrame({"A": [1,2],"B":[3,4]})df2 pd.…

MySQL延时关联使查询速度提升N倍

以下内容也可以观看视频教程&#xff1a; https://space.bilibili.com/431152063先来看下面的sql语句&#xff1a; select * from orderinfo limit 1000000, 100目前orderinfo表中的数据大概是1亿行 查询耗时大概2秒多&#xff0c;如果将sql中的返回所有字段改成只返回dbid字段…

Linux驱动开发基础__APP怎么读取按键值

目录 1 妈妈怎么知道孩子醒了 2 APP读取按键的4种方法 2.1 查询方式 2.2 休眠-环形方式 2.3 poll方式 2.4 异步通知方式 在做单片机开发时&#xff0c;要读取 GPIO 按键&#xff0c;我们通常是执行一个循环&#xff0c;不断地 检测 GPIO 引脚电平有没有发生变化。但是在 Li…

进入保护模式

文章目录前言前置知识代码说明实验操作前言 本博客记录《操作系统真象还原》第四章实验操作~ 实验环境&#xff1a;ubuntu18.04VMware &#xff0c; Bochs下载安装 实验内容&#xff1a;实现从MBR到LOADER&#xff0c;由LOADER实现进入保护模式 实验原理&#xff1a;计算机…

Cadence PCB仿真分配电压网络电压时网络未自动识别问题解决方案

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,问题概述2,分配方法3,避免方法4,总结1,问题概述 如下图所示在使用Allegro PCB SI为电源网络分配电压时,有些网络实际上是电源网络,但是未被自动识别,无法对齐分配电压,具体解决方法如下。 2,分配方法 第1…

最近新开源的基于单目稠密重建NeRF-SLAM

点云PCL免费知识星球&#xff0c;点云论文速读。文章&#xff1a;NeRF-SLAM: Real-Time Dense Monocular SLAM with Neural Radiance Fields作者&#xff1a;Antoni Rosinol John J. Leonard Luca Carlone编辑&#xff1a;点云PCL代码&#xff1a;https://github.com/ToniRV/N…