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);
}
posted @ 2024-04-11 11:00  ZTer  阅读(21)  评论(1编辑  收藏  举报