一、基于Easyx库的初级C/C++编程游戏制作:小球动画(5)

因为最近工作有些忙,虽然代码陆续写了一直没写博客。今天抽空写一下。

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

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值