BestAns

路漫漫其修远兮,吾将上下而求索(QQ:1438018116)

[视觉错觉] 隐藏的爱心

群里的作业,睡觉前完成了。

一个有趣的视觉错觉程序。

执行效果如下:

PS:程序执行后可能有点大,效果不太明显,那就离远点看试试。

完整的源代码如下:

////////////////////////////////////////
// 程序:视觉错觉:隐藏的爱心
// 作者:BestAns
// 编译环境:VS2019,EasyX_20211109
// 编写日期:2021-11-29
//
#include <graphics.h> 
#include <conio.h>

const int UNIT = 43;

// 画背景单元方格
void DrawBlock(int x, int y, bool odd)
{
	int c1, c2;
	if (odd) { c1 = BLACK; c2 = WHITE; }
	else	 { c1 = WHITE; c2 = BLAC
...

基于 EasyX 的文本框(TextBox)和按钮(Button)控件

这个文本框只是随手写了一个例子,只实现了最基本的文本框功能(支持中文),抛砖引玉吧。

如果有能力,可以在阅读代码后进一步封装、完善功能。

目前输入效果如下:

注意:请使用最新版本 EasyX 编译以下代码

完整源代码如下:

////////////////////////////////////////
// 程序:基于 EasyX 的文本框 + 按钮控件
// 作者:BestAns
// 编译环境:VS2019,EasyX_20211109
// 编写日期:2021-10-28
// 最后修改:2021-11-20
//
#include <graphics.h>



// 实现文本框控件
class EasyTextBox
{
private:
	int left = 0, top = 0, right = 0, bottom = 0;	// 控件坐标
	wchar_t* te
...

在 Dev-C++ 或 Code::Blocks 下面配置 EasyX

前言

EasyX 虽然挺好用,但是目前官方只发布了针对 VC 的使用方法。本文介绍如何将 EasyX 配置到 DevCpp 或 CodeBlocks 里面,并提供相关的库。

平时我工作忙,有问题直接在后面留言,我会尽力修改。

注:版本太老的 mingw 无法支持。

库下载

点这里下载 easyx4mingw_20211002

配置说明

Code::Blocks 配置 EasyX 的详细说明

以下配置说明仅以官方原版 Code::Blocks 20.03(64 位)为例,下载地址:https://appzip.cn/codeblocks/w ,假设 Code::Blocks 的安装路径为 D:\App\CodeBlocks。

安装

1. 下载 easyx4mingw_20211002.zip 后,解压缩。

...

学习 C/C++ 语言的常用开发工具下载

学习编程首先需要安装一款编译器。但是目前的网络环境,很多网站下载到的编译器都被捆绑了各种广告插件,甚至木马病毒,困扰了很多初学者。本页面列出来的各种编译器及下载地址,我都亲自测试过,确保无毒无害无恶意广告插件,请放心下载。ps:如果某个资源无效了,请针对本文发表评论,我会收到提醒。

如果你是初学者不知道选择哪个,相信我,选择 VC2010 学习版就挺好。不要听信某些人说 Linux 更适合学编程什么的鬼话,也别信什么 Code::Blocks 可以跨平台的噱头。学编程就是学编程,学会了编程再说系统或跨平台的问题,不要在初学的时候就把很多问题混在一起,会打击到自己的。

Microsoft Visual C++ 2010 学习版(推荐)

简称 VC2010。目前 VC2010 是计算机二级考试的官方指定上机环境。作为学习工具,VC2010 是免费的,足够好用,并且体积不大,安装简单,推荐使用。安装完 VC2010 后,建议打上 SP1 补丁包。

VC2010 下载地址:https://appzip

...

VC绘图/游戏简易教程--16:设备上下文句柄(Windows 编程入门2)

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

注:学习本节前,请自备 MSDN,以便查阅 Windows GDI 函数。

对于 Windows GDI 中的绘图函数,操作目标通常是 DC(Device Context),因此需要传入一个 DC 的句柄,数据类型为 HDC(Handle of Device Context)。用 GetImageHDC() 函数可以获取 EasyX 的绘图窗口或 IMAGE 对象的句柄,然后就可以使用 Windows GDI 函数进行绘图操作。看以下示例:

#include <graphics.h>
#include <conio.h>

int main()
{
	// 初始化绘图窗口,并获取 HDC 句柄
	initgraph(640, 4
...

钟表模拟程序(表针形式)

这是个简单的表针式时钟模拟程序。

运行效果如下:

在源代码的基础上,可以通过 API 函数 mciSendString 轻松加上滴答声音,我就不再多写了。

代码如下:

////////////////////////////////////////////
// 程序名称:钟表模拟程序(表针形式)
// 编译环境:Visual C++ 6.0 ~ 2019,EasyX_20210730
// 程序编写:BestAns <BestAns@qq.com>
// 最后更新:2010-10-30
//
#include <graphics.h>
#include <conio.h>
#include <math.h>

#define	PI	3.1415926536

void DrawHand(int hour, int minute, int second)
{
	do
...

三维旋转球 源码+注释+简单讲解

前言

关于三维的东西远不止这么点内容,也不是我几句话可以讲完的,需要大家扎扎实实的看图形学。不能好高骛远,要扎实、系统的学习。还要注意相关数学知识的学习。

图形学一般是借助矩阵实现的各种转换。我在这篇文章里尽量不用图形学的术语,也不做优化、不加额外功能,只用最简单的三角函数实现,希望大家能从道理上看的清楚明白。

简单讲解

关于一个点,一定要有一个三维坐标,程序中的结构体 POINT3D 就是。

点的初始化由函数 InitPoint() 实现,该函数产生了 n 个半径为 1 的点。

点的运动,是在三维坐标内运动的,包括平移、缩放、旋转等。这个程序只涉及到了旋转,定义了三个方法:RotateX()、RotateY()、RotateZ(),分别实现绕三个轴旋转;可以使用矩阵运算来实现,也可以直接这样算出来。

最后需要将三维世界呈现出来,这里用到一个术语:投影,就是将三维的画面投影到二维上。投影有多种方法,这个球体用的单点透视,因此还需要一个“观察点”,程序中

...

VC绘图/游戏简易教程--15:窗体句柄(Windows 编程入门)

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

EasyX 库有一个获取窗口句柄的功能,很是强大,这里介绍一下。

【窗体句柄】

窗体句柄是 Windows 下窗口的标识,可以理解为窗口的 ID。Windows SDK 中的许多窗口操作函数都需要指明窗体句柄,也就是说,有了句柄,我们可以通过 Windows SDK 中的 API 实现许多高级的窗体控制。

【函数原型】

窗体句柄为 HWND 类型,通过 GetHWnd() 函数可以返回绘图窗体的句柄。其函数原型是:
HWND GetHWnd();

【使用句柄】

举个例子,设置窗体标题文字的 Windows API 为:
BOOL SetWindowText(HWND hWnd, LPCTSTR lpString);
参数:
   hWnd: 要设置标题文

...

VC绘图/游戏简易教程--14:通过位运算实现颜色的分离与处理

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

本节课要求熟练掌握位运算,详见:
http://hi.baidu.com/bestans/blog/item/fb75b439404876e614cecb9f.html (已失效)

[颜色基础]

在 EasyX 库中,颜色是一个 int 类型的数据,转换为 16 进制后的颜色格式是 0xbbggrr,其中,bb/gg/rr 分别表示两位十六进制的蓝/绿/红颜色值,每种颜色的范围是 0x0~0xff,转换为十进制就是 0~255。

举几个颜色标示的例子:

  • 颜色  直接表示  RGB 宏标示
  • 纯绿色 0x00ff00  RGB(0, 255, 0)
  • 青色  0xffff00  RGB(0, 255, 255)  注:青=蓝+绿
...

VC绘图/游戏简易教程--13:getimage / putimage / loadimag / saveimage / IMAGE 的用法

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

 getimage / putimage / loadimage / saveimage 这一组命令和 IMAGE 对象可以实现图像处理的相关功能,下面逐个介绍。
(有点类似 tc 中的 imagesize)

[加载图片]

实现加载图片主要分三步:
1. 定义 IMAGE 对象
2. 读取图片至 IMAGE 对象
3. 显示 IMAGE 对象到需要的位置

很简单,我们看一下完整的代码:

#include <graphics.h>
#include <conio.h>

int main()
{
	initgraph(640, 480);

	IMAGE img;	// 定义 IMAGE 对象
	loadimag
...

VC绘图/游戏简易教程--12:数组

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法) 

课程要求:先复习下课本上对数组的讲解(随便一本教材都行)

一维数组

数组可以实现批量操作。比如,我们产生 10 个随机数,产生后先保存起来,然后输出最大的:

	int n[10];
	int i;
	for (i = 0; i < 10; i++)
		n[i] = rand() % 1000;

	// 按生成的顺序,逆序输出
	for (i = 9; i >= 0; i--)
		printf("%d\n", n[i]);

	// 找出最大的
	int max = -1;
	for (i = 0; i < 10; i++)
	{
		if (n[i] > max)
			max = n[i];
	}

	printf("最大的数字是:%d\n", ma
...

VC绘图/游戏简易教程--11:鼠标控制及高级按键控制

教程总目录:https://codebus.cn/bestans/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

学习本节课前,需要熟练掌握第 7 节。详见:https://codebus.cn/bestans/concise-lesson-7

==本节课开始==

首先,获取鼠标消息:

ExMessage m;
m = getmessage();

ExMessage 是 EasyX 定义的一个表示消息的结构体类型,以上代码表示用该类型声明了一个变量 m,然后通过 getmessage 函数获取消息,并返回给变量 m。根据 m 的内容,进一步分析获取到的是什么消息。鼠标消息可以通过以下成员获取鼠标消息中的信息:

	USHORT message;		// 当前消
...

VC绘图/游戏简易教程--10:绘图中的位运算

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

========================

位运算和绘图有什么关系?先举个例子来个感性认识:使用XOR运算可以实现擦除图形后不破坏背景,这在时钟程序中绘制表针是很有用的。稍后我们会给出这样的例子。

一、位运算的运算法则

位运算主要分 4 种:NOT、AND、OR、XOR,位运算的运算对象是二进制数(十进制要转换为二进制,计算机会自动转换)。

运算法则如下:

1. NOT

表示“取反”,将二进制位的 1 变 0、0 变 1。
C 语言用符号 ~ 表示。

如:
二进制: ~1101 = 0010
用十进制表示就是:~13 = 2

2. AND

表示“并且”,只有两数的对应二进制位都为 1,

...

VC绘图/游戏简易教程--9:用函数简化相同图案的制作

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents

实际中有许多类似的图案,如果一一单独绘制,太麻烦。于是,我们需要一个公用的绘制过程,就是函数。

例如,我们需要画5个三角形,位于不同的位置。我们可以将绘制单个三角形的过程写成函数,函数内是一个独立的程序段,这个绘制过程很简单。
然后,在需要绘制的时候,调用这个函数即可。可以通过参数来解决细微差异(图案的坐标、颜色等),例如:

#include <graphics.h>
#include <conio.h>

// 在坐标 (x,y) 处,用颜色 c 绘制三角形
void sanjiaoxing(int x, int y, int c)
{
	// 设置画线颜色
	setlinecolor(c);

	// 画三角形的三条边
	line(x, y, x+50, y);
	line(x, y, x, y+50);
	line(x+
...

VC绘图/游戏简易教程--8:随机函数

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents(里面包括VC下的graphics.h的配置方法)

[随机函数简介]
游戏中,许多情况都是随即发生的。还有一些图案程序,例如屏保,也是随即运动的。这就需要用随机函数。

随机函数很简单,只有一个:
rand()
该函数返回 0~32767 之间的一个整数。(不需要记住 32767 这个数字,大概知道这个范围就行了)
该函数在头文件 <stdlib.h> 中,使用前记得引用。

[简单测试]

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int r;
	for(int i=0; i<10; i++)
	{
		r = rand();
		printf("%d\n", r);
	}

	return 0;
}
...