EasyX Quick Start
EasyX 图形库与游戏开发
-
这份笔记来源于童晶编写的 《C++ 游戏趣味编程》一书中关于 EasyX 图形库使用的部分。
-
笔记中函数参数为 float 并不代表函数原型也是 float,只是为了说明它可以接受整数或者小数。
控制小球下落
#include <graphics.h>
// EasyX 图形库的源文件
#include <conio.h>
// 控制台输入输出头文件
initgraph(float w, float h);
// 创建一个宽 w 高 h 的窗口
fillcircle(float x, float y, float r);
// 以 (x, y) 为圆心(左上角 (0, 0) )绘制半径为 r 的圆
closegraph(void);
// 关闭窗口
cleardevice(void);
// 清空控制台
别碰方块游戏
kbhit(void);
// keyboard hit, 当键盘有输入时返回 1,无输入时返回 0
//一个检测从键盘输入空格的片段
#include <stdio.h>
while(1)//持续监测
{
if(kbhit())
{
char input = _getch();
if(input == ' ')
{
cout << "space has been kicked!n";
}
}
}
fillrectangle(float l, float t, float r, float b);
//绘制一个左上角坐标 (l, r) 右下角坐标 (r, b) 的矩形
srand(time(0));
// 初始化随机种子, time(0) 为从 0 开始的 UNIX 时间,因为每次运行时间不一样,随机种子就不一样,生成的随机数也不一样。
//要使用 time 函数,需要 #include <time.h>
int rand(void);
// 返回一个 0 ~ 32767 之间的数
const int RAND_MAX = 32767;
//最大的随机数
rand() / float(RAND_MAX);
// 生成 0 ~ 1 的随机小数
TCHAR s[20];
// TCHAR 为宽字符串类型(占用更大内存的字符串,可以用来表示汉字)
int score = 1;
_stprintf(s, _T("%d"), score);
// _stprintf 函数的这个重载把 score 变成字符串类型输出 %d 是 C 语言中 int 类型的输出占位符
// _T是一个宏,在 UNICODE 有定义时(使用 UNICODE 编码)下表示宽字符串
// 但是 VS 可能提示这个函数不安全,改成下面的即可解决问题
swprintf_s(s, _T("%d"), score);
// 关于编码我了解的也不多,有兴趣可以自己查一下资料
settextstyle(float s, float w, _T("宋体"));
// 设置文字大小,字体,s 为大小 w 疑似是宽度
// 这个函数应该会把所有 outtextxy 函数输出的所有字符变成这个格式
outtextxy(float x, float y, TCHAR[] s);
// 在 (x, y) 位置输出字符串 s
旋转🐍错觉
solidpie(float l, float t, float r, float b, float st, float ed);
// l, t, r, b 为扇形对应的圆的外接矩形的左上角与右下角坐标,st, ed 为起始角与终止角,单位为弧度
// ps:角度为 x 轴正方向逆时针转过的角度
circle(float x, float y, float r);
// 绘制 (x, y) 为圆心,r 为半径的空心圆
setbkcolor(COLORREF x);
// 设置背景颜色
setlinecolor(COLORREF x);
// 设置线条颜色
setfillcolor(COLORREF x);
// 设置填充颜色
// ps:COLORREF 为一个 16 进制整数,表示一种颜色。可以使用 RGB 函数把 RGB 的三个十进制参数表示为 COLORREF 的 16 进制,示例如下:
setfillcolor( RGB(255, 255, 255) );
//255, 255, 255 为 RGB 的白色
WHITE, BLACK, RED, GREEN, BLUE, YELLOW
//上述为定义好的 COLORREF 宏,直接表示对应颜色的 COLORREF 值
line(float x_1, float y_1, float x_2, float y_2);
//画一条端点为 (x_1, y_1), (x_2, y_2) 的线段
见缝插针
setlinestyle(PS_SOLID, float x);
// 设置线段风格,PS_SOLID 是实线的宏,x 为宽度
// ps:通过翻头文件库,找到 #define PS_SOLID 0,实际操作一下得到:
// 0 实线,1 虚线,2 更虚的线,3 虚线和更虚的线交错
cos(float x);
sin(float x);
// 三角函数,参数为弧度,需要头文件 #include <math.h>
// ps:实际操作的时候发现 y 轴正方向是向下的
BeginBatchDraw();
// 批量绘图模式,使用这个函数之后,任何绘制命令都不会直接输出,而是存在缓冲区里
FlushBatchDraw();
// 把缓冲区里的绘制命令一次性执行完毕
EndBatchDraw();
// 结束批量绘图模式
// ps:这个工具主要是解决一次性绘制多条图形时画面卡顿/闪烁问题的(因为多次绘图比一次绘多图慢得多,导致我们能肉眼看出来画面卡顿)。
十步万度
// 鼠标交互
MOUSEMSG m;
// MOUSEMSG 类是一个用于检测鼠标动作的类
MouseHit(void);
// 检测鼠标动作,鼠标动了返回真,否则返回假(包括移动,按键,松开按键等)
GetMouseMsg(void);
// 返回一个 MOUSEMSG 类,为检测到的动作
m.uMsg, m.x, m.y;
// m.x, m.y 为鼠标发生动作的坐标,m.uMsg 为鼠标发生的具体动作,有以下几个值
/*
WM_MOUSEMOVE Mouse moves
WM_MOUSEWHEEL Mouse wheel is rotated
WM_LBUTTONDOWN Left mouse button is pressed
WM_LBUTTONUP Left mouse button is released
WM_LBUTTONDBLCLK Left mouse button is double-clicked
WM_MBUTTONDOWN Middle mouse button is pressed
WM_MBUTTONUP Middle mouse button is released
WM_MBUTTONDBLCLK Middle mouse button is double-clicked
WM_RBUTTONDOWN Right mouse button is pressed
WM_RBUTTONUP Right mouse button is released
WM_RBUTTONDBLCLK Right mouse button is double-clicked
*/
// 一段实例代码
void f()
{
MOUSEMSG m;
if (MouseHit())
{
m = GetMouseMsg();
if (m.uMsg == WM_LBUTTONDOWN)
{
// 当鼠标左键按下时
// do sth.
}
}
}
// 文件读写
FILE=* fp = fopen("test.txt", "w");
// test.txt 写入
FILE* fp = fopen("test.txt", "r");
// 从 test.txt 读入
feof(FILE* x);
// 如果文件 x 到结尾,返回真,否则返回假
fgets(char* str, int l, FILE* x);
// 从文件 x 里读入 l 个字符存储到 str 里
fclose(FILE* x);
// 关闭文件 x
// 一段示例代码,实现了把 test.txt 的内容输出到控制台
#include <conio.h>
#include <stdio.h>
int main()
{
char str[80];
FILE* fp = fopen("test.txt", "r");
while(!feof(fp))
{
fgets(str, 80, fp);
printf("%s", str);
}
fclose(fp);
_getch();
return 0;
}
十字消除游戏
setbkmode(TRANSPARENT);
// 透明显示文字(疑)
clock_t x;
// 计时的变量
clock(void);
// 返回一个 clock_t 类型的变量,为程序当前运行时刻
clock_t start = clock();
// do sth.
clock_t now = clock();
// 使用 start - now 得出运行了多少毫秒
// 倒计时条/进度条代码可以直接参考书上的源代码,这里不再展开
// 书上使用了 C 的 malloc 和 alloc 来动态分配内存
// 我们可以用 C++ 的 new 和 delete 达到同样效果,不展开说
绘制樱花树
通过递归实现绘制,很简单并且没有新函数。
坚持一百秒游戏
IMAGE im_bk;
// 图形类
loadimage(&im_bk, _T("background.png"));
// 加载图形 background.png 到 im_bk 中,注意图片的路径应该是代码所在文件夹上一级文件夹的 Debug 文件夹里(实际上就是 .exe 文件生成的位置)
putimage(float x, float y, IMAGE* x);
// 在坐标 (x, y) 位置打印图片 x
// 音乐和音效
// 首先导入 winmm.lib 库以支持 windows 多媒体编程
#pragma comment (lib, "Winmm.lib");
void PlayMusicOnce(TCHAR fileName[80])
{
TCHAR cmdString1[50];
swprintf_s(cmdString1, _T("open %s alias tmpmusic"), fileName);
// 生成命令字符串 cmdString1,这里 alias 后是 tmpmusic,后续的打开/关闭操作也必须是 tmpmusic
mciSendString(_T("close tmpmusic"), NULL, 0, NULL);
// 关闭正在播放的
mciSendString(cmdString1, NULL, 0, NULL);
// 播放指定音乐
mciSendString(_T("play tmpmusic", NULL, 0, NULL));
// 播放一次
mciSendString(_T("play tmpmusic repeat"), NULL, 0, NULL);
// 重复播放
}
祖玛游戏
- STL vector 与链表
火柴人跑酷
// 异步输入与延时改进
GetAsyncKeyState('W');
// 按下 W 键
// VK_LEFT VK_RIGHT VK_UP VK_DOWN 为上下左右方向键对应的宏
// 非阻塞式延迟,不知道什么意思,据说可以减少占用
#include "Timer.h"
// 头文件在 14 章的代码文件里
Timer timer;
void show()
{
FlushBatchShow();
timer.Sleep(50);
}
繁华尽处,
寻一静谧山谷,
筑一木制小屋,
砌一青石小路,
与你晨钟暮鼓,
安之若素。