因为最近工作有些忙,虽然代码陆续写了一直没写博客。今天抽空写一下。
11、小球的动画控制
为了使得更好地表达面向对象的设计,我修改了变量的名称,并且将分配结构体内存空间,以及初始化参数分开。
在主循环中调用了games_ui_keyboard这个函数。名字的含义中UI意思为GUI,人机交互界面的意思。
这个函数作用是玩家可以通过键盘操控动画的播放暂停,以后会改成对游戏进行暂停和播放。
1)主函数的实现
int main()
{
//DWORD_PTR dwUser = NULL;
initgraph(screen_width, screen_height);//窗口初始化
//初始化一个小球
games_obj_t player_obj = graph_draw_obj_create();
if (circle == NULL)
{
perror("circle create error");
return -1;
}
player_obj_init(player_obj);
games_anima_timer_create(10, player_obj);
while (1)
{
games_ui_keyboard(player_obj);
Sleep(100);
}
closegraph();
//删除占用的内存
graph_draw_obj_destroy(player_obj);
games_anima_timer_destory();
return 0;
}
数值初始化函数实现如下:
void player_obj_init(games_obj_t player_obj)
{
player_obj->anima->velocity = 10;
player_obj->anima->x = 100;
player_obj->anima->y = 100;
player_obj->anima->r = 20;
player_obj->anima->vx = 10;
player_obj->anima->vy = 0;
player_obj->anima->acceleration = 1;
player_obj->anima->angle = 45;
player_obj->anima->K = 0.55;
}
2)键盘实现动画的开始播放、暂停、结束、继续播放控制
开始播放的动画不一定要是下降的也可以是其他动画。
如果检测到了关闭键,关闭动画播放;如果检测到了开始,打开动画播放;如果检测到了暂停,暂停动画播放;如果检测到了继续,继续动画的播放
void games_ui_keyboard(games_obj_t player_obj)
{
char ch;
if (_kbhit() != 0)//检测到有键盘输入
{
ch = _getch();
switch (ch)
{
case ' '://暂停
player_obj->anima->anima_obj_tag = ANIMA_OBJ_START;
games_anima_timer_create(10, player_obj);
break;
case 'z'://开始
player_obj_init(player_obj);
player_obj->anima->anima_obj_tag = ANIMA_OBJ_DOWN;
games_anima_timer_create(10, player_obj);
break;
case 'c'://继续
player_obj->anima->anima_obj_tag = ANIMA_OBJ_DOWN;
games_anima_timer_create(10, player_obj);
break;
case 'x'://关闭
games_anima_timer_destory();
break;
default: break;
}
}
}
3)定时器回调函数中动画实现
回调函数中使用了一个状态机,根据anima_obj_tag的状态可以切换到不同的动画效果当中。这些动画都是我之前写好的。games_anima_static中我只添加了显示函数games_anima_display;
//定时器的回调函数
void WINAPI TimerCallback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
static int i = 0;
//games_anima_t temp_str = (games_anima_t)dwUser;
OutputDebugPrintf("timer count:%d-->\n",i++);
games_anima_display((games_obj_t)dwUser);
switch (((games_obj_t)dwUser)->anima->anima_obj_tag)
{
case ANIMA_OBJ_STATIC:
games_anima_static((games_obj_t)dwUser);
break;
case ANIMA_OBJ_DOWN:
games_anima_down((games_obj_t)dwUser);
break;
case ANIMA_OBJ_CUSTOM:
games_anima_parabola((games_obj_t)dwUser);
default: break;
}
}
4)简单的面向对象与代码设计分析
实际上一个游戏框架中有很多不同作用的定时器,比如有:控制游戏运行状态的定时器,控制游戏时间的定时器,控制动画效果的定时器等等,只有将功能模块化才能使得代码易于维护和使用。
在编程中通常代码结构由开发者来设计,通常有两种思路:
面向过程的思维:创建一个球->球落地弹起 球->下落->碰到物体->弹起;
面向对象的思维:创建一个有弹性球的弹性,这个球有弹性,所以在发生碰撞时会弹起。这是我打算在小球动画最后做的事情。
一个简单流程:
球->有弹性(不断检测有没有碰撞)->有碰撞->弹起(弹起是一个动画过程需要经过计算包括坐标计算)->没有->轨迹不变;
剩下的之后写,感谢支持。
2024/3/10