Easyx使用(中篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

整个easyx用起来还是比较简单的,没有c++,没有多线程,也没有其他复杂的架构和配置,基本上顺着往下写代码就可以了。所以这就意味着,掌握了基本的easyx api,就可以做一些事情了。很多人用它做游戏,做图形学课程,都是可以的。但是不仅仅这些,还可以用它做仿真、做工具、做一些创意产品。所以easyx的最大优势就是开发快,效果快,如果用户对最终gui界面要求不高,直接部署也是可以的。

今天我们就看看一个运动小球的demo是怎么开发的。

1、画一个小球

既然是运动小球,那么至少需要画一个小球。做到这一点,不难。即注意画的时候,是用solidcircle,而不是circle。

复制代码
	setfillcolor(BLUE);
	solidcircle(x, y, RADIUS);

2、小球的运动

这里我们说的是运动小球,那么如何让小球运动起来呢?一种直观的方式,就是擦掉重画。确实大部分库也是这么做的,通常我们先调用cleardevice函数清掉,再重新绘制,

复制代码
		cleardevice();

        // draw item

		setfillcolor(BLUE);
		solidcircle(x, y, RADIUS);

3、如何更新x和y

既然是更新x和y,那么只需要每一次对x和y,做递增、递减运算即可。当然计算的时候,我们还要分析是不是要弹回来。因为显示的时候,还需要判断一下x和y的范围,不然小球就撞到墙里去了。

复制代码
		// judge direction
		
		if (y >= (HEIGHT - RADIUS))
		{
			y_direction = 0;
		}
		else if (y <= RADIUS)
		{
			y_direction = 1;
		}

		if (x >= (WIDTH - RADIUS))
		{
			x_direction = 0;
		}
		else if (x <= RADIUS)
		{
			x_direction = 1;
		}

		// judge next data

		if (y_direction)
		{
			y += speed;
		}
		else
		{
			y -= speed;
		}

		if(x_direction)
		{
			x += speed;
		}
		else
		{
			x -= speed;
		}

4、批处理显示

显示的时候,很多时候,我们是希望所有元素都ready之后,一起刷新显示,这样才不会有画面闪烁。要实现这一点,需要先调用BeginBatchDraw,然后每次绘制结束后,再调用FlushBatchDraw即可。只有程序结束的时候,才会调用EndBatchDraw函数。

5、添加延时函数

为了有流畅的画面效果,还需要每一个frame渲染结束后,延时若干毫秒。

复制代码
		Sleep(50);

6、键盘输入

很多时候,我们需要对软件进行人机交互,那么这个时候就可以通过键盘进行处理。特别是交互不多的时候,就可以通过_kbhit和_getch来实现。

复制代码
		// get key input

		if (_kbhit())
		{
			_getch(); // just simulate to get some data

			speed -= 2;
			if (speed < 0)
				speed = 10;
		}

7、信息反馈

除了键盘输入之外,有些情况下我们也需要从屏幕上读取一些信息,这些信息就可以通过outtextxy反映出来。

复制代码
		// prepare buffer

		memset(x_buf, 0, sizeof(x_buf));
		memset(y_buf, 0, sizeof(y_buf));

		sprintf(x_buf, "x_pos: %d", x);
		sprintf(y_buf, "y_pos: %d", y);

		outtextxy(500, 10, x_buf);
		outtextxy(500, 30, y_buf);

8、去除编译错误和告警

实际字符串显示的时候,还有两个错误。第一个错误就是,需要把字符集设置为"使用多字节字符集",这点可以在项目属性里面设置。还有一个,就是某些函数的使用会触发编译器生成编译告警,所以我们需要引入一个宏,

复制代码
#define _CRT_SECURE_NO_WARNINGS

9、优化和改进程序

实际编写的时候,我们会引入很多的坏习惯,比如使用magic number。这部分都可以通过替换macro来解决。至于其他代码习惯部分,就是见招拆招了。实际开发中,我们也会发现,哪怕是简单的程序,也需要不停修改和验证的。最后给出完整的代码,有兴趣的同学可以运行看看。这里使用的vs是2017版本,os是win10,cpu是x86版本。

复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <graphics.h>
#include <conio.h>
#include <stdio.h>

#define WIDTH  640
#define HEIGHT 480
#define RADIUS 20
#define START_X 300
#define START_Y 200

// main function

int main()
{
	int x = START_X;
	int y = START_Y;
	int x_direction = 1;
	int y_direction = 1;
	int speed = 10;

	char x_buf[128] = {0};
	char y_buf[128] = {0};

	initgraph(WIDTH, HEIGHT);

	// draw circle

	setfillcolor(BLUE);
	solidcircle(x, y, RADIUS);

	// start batch draw

	BeginBatchDraw();

	while (1)
	{
		cleardevice();

		// judge direction
		
		if (y >= (HEIGHT - RADIUS))
		{
			y_direction = 0;
		}
		else if (y <= RADIUS)
		{
			y_direction = 1;
		}

		if (x >= (WIDTH - RADIUS))
		{
			x_direction = 0;
		}
		else if (x <= RADIUS)
		{
			x_direction = 1;
		}

		// judge next data

		if (y_direction)
		{
			y += speed;
		}
		else
		{
			y -= speed;
		}

		if(x_direction)
		{
			x += speed;
		}
		else
		{
			x -= speed;
		}

		// draw item

		setfillcolor(BLUE);
		solidcircle(x, y, RADIUS);


		// prepare buffer

		memset(x_buf, 0, sizeof(x_buf));
		memset(y_buf, 0, sizeof(y_buf));

		sprintf(x_buf, "x_pos: %d", x);
		sprintf(y_buf, "y_pos: %d", y);

		outtextxy(500, 10, x_buf);
		outtextxy(500, 30, y_buf);

		FlushBatchDraw();

		// get key input

		if (_kbhit())
		{
			_getch(); // just simulate to get some data

			speed -= 2;
			if (speed < 0)
				speed = 10;
		}

		// sleep for a while

		Sleep(50);
	}

	EndBatchDraw();
	closegraph();
	return 0;
}
相关推荐
繁华似锦respect6 分钟前
C++ & Linux 中 GDB 调试与内存泄漏检测详解
linux·c语言·开发语言·c++·windows·算法
立志成为大牛的小牛7 分钟前
数据结构——五十四、处理冲突的方法——开放定址法(王道408)
数据结构·学习·程序人生·考研·算法
代码游侠30 分钟前
复习——栈、队列、树、哈希表
linux·数据结构·学习·算法
碧海银沙音频科技研究院40 分钟前
基于物奇wq7036与恒玄bes2800智能眼镜设计
arm开发·人工智能·深度学习·算法·分类
小白程序员成长日记1 小时前
2025.12.03 力扣每日一题
算法·leetcode·职场和发展
元亓亓亓2 小时前
LeetCode热题100--20. 有效的括号--简单
linux·算法·leetcode
熊猫_豆豆2 小时前
LeetCode 49.字母异位组合 C++解法
数据结构·算法·leetcode
ModestCoder_3 小时前
强化学习 Policy 的 Tracking 能力全解析,以Legged_gym为例解说Policy的训练流程
人工智能·算法·自然语言处理·机器人·具身智能
小白程序员成长日记3 小时前
2025.12.02 力扣每日一题
数据结构·算法·leetcode
永远都不秃头的程序员(互关)3 小时前
在vscodeC语言多文件编译实战指南
c语言·数据结构·算法