写这篇文的原因:最近对游戏制作感兴趣,在阅读《C和C++游戏趣味编程》,打算按照书里的实践项目,一点点实现一个简单的游戏框架。
注意点:
- 因为更擅长C语言,先都用C语言写,后续根据需要改进成C++。
- 底层的图形库动画等等实现都用C语言,再制作C++的接口。
- 暂时随便标注错误和状态,后续加个轻量的日志系统
一、基本的图像绘制
1.基本图像绘制:
使用EasyX的库函数:
void fillcircle (int x, int y, int radius); //绘制一个圆
HWND initgraph(int width, int height, int flag = 0);//创建窗口
void closegraph(); //关闭窗口
void cleardevice(); //清屏
2.小球结构体
超简单的小球结构体,后续再改进
typedef struct circle
{
int x;
int y;
int r;
}games_circle_s;
typedef games_circle_s* games_circle_t;
3.创建一个小球
games_circle_t graph_draw_circle_init(int x,int y,int r)
{
games_circle_t circle = (games_circle_t)malloc(2 * sizeof(games_circle_s));
if (circle == NULL)
{
perror("malloc error");
return NULL;
}
circle->x = x;
circle->y = y;
circle->r = r;
return circle;
}
在主函数中创建一个小球:
games_circle_t circle = graph_draw_circle_create(screen_width / 2,screen_height/2, 20);
if (circle == NULL)
{
perror("circle create error");
return -1;
}
4、下降动画实现
下落动画简单的实现思路:
画一个球->停顿一会儿->改变球的y轴位置->清除球->画一个球->重复
一开始根据书上动画制作的相当简单,类似这样:
cleardevice();
fillcircle (300,100,20);
sleep(1000);
cleardevice();
fillcircle (300,200,20);
sleep(1000);
cleardevice();
fillcircle (300,300,20);
sleep(1000);
一点点改进最后变成了这样:
y:下降位置
step:下降距离
n:这个后续可能会改成帧数计算,现在先这么写
speed:下降速度
//下坠的动画
void games_circle_down(games_circle_t circle,int y,int step,int n,int speed)
{
for (int i = 0; i <= n; i++)
{
y = y + step;
cleardevice();
fillcircle(circle->x, y, circle->r);
Sleep(speed);
}
}
5、变大变小动画
有了下降动画就很简单了,直接就是复制上面的函数稍微改一改,最后变成了这样:
//变大变小的动画
void games_circle_length(games_circle_t circle, int r, int step, int n, int speed)
{
for (int i = 0; i <= n; i++)
{
r = r + step;
cleardevice();
fillcircle(circle->x, circle->y, r);
Sleep(speed);
}
}
两个动画在主函数中的简单调用:
games_circle_down(circle,game_circle_y,game_circle_step, 100, 100);
games_circle_length(circle, game_circle_r, game_circle_step, 100, 100);
6、动画改进
设计一个动画结构体,专门用于存储动画的参数,比如当前对象的坐标,状态,以及持续的动画时间,动画帧数等。
这个需要抽象一下,明天继续吧
2024/2/22