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

本文详细描述了如何改进游戏中的动画,包括动画的定义、结构体设计(如初始化、静态、下降、碰撞和自定义动画类型),以及如何在小球对象中使用动画结构体来控制运动和碰撞反应,如弹起动画的实现过程。
摘要由CSDN通过智能技术生成

6、动画改进

今天又是新的一天,继续昨天的动画改进。

1) 动画的概念

动画的含义可以是动作/运动+画面显示
之前函数中无论是放大小球的动画,都涉及到了两个方面

  • 运动变量的变化和动作位置的计算
  • 画面显示

后续所有的动画效果都会根据这个来编写代码。

2)动画结构体的定义

定义动画类型,动画各种各样,我暂时设计五个,分别是初始化、静态、下降、碰撞和自定义,这个枚举后续可能还会发生改变:

//定义动画类型
typedef enum
{
	ANIMA_OBJ_START,		//初始化
	ANIMA_OBJ_STATIC,
	ANIMA_OBJ_DOWN,
	ANIMA_OBJ_COLLISION,	//碰撞
	ANIMA_OBJ_CUSTOM,		//自定义
}enanima_obj_type;

动画的结构体会有点复杂,需要一点点地增加,先写运动变量相关的参数。结构体按照我之前所说的运动变量和画面显示来定义。
当然,画面显示不可能一只用sleep后续肯定是要改成定时器来控制的有了定时器就可以计算画面的显示帧数了。所有的动画函数都会存入动画列表中。

//动作运动和画面显示
typedef struct animation
{
	enanima_obj_type anima_obj_tag;
	float x;	//运动的位置x轴和y轴
	float y;	
	float r;    //物体的大小
	float step;	//运动变化量
	int velocity;//运动速度
	int acceleration;

	//动画定时器
	//回调函数列表。anima的操作->
}games_anima_s;
typedef games_anima_s* games_anima_t;

接着,在小球的结构体中加入动画结构体的指针:

typedef struct circle
{
	float x;
	float y;
	float r;
	games_anima_t anima;//操作动画的指针
}games_circle_s;

最后,在创建小球的函数graph_draw_circle_create中为动画开辟一块空间,在使用的时候改变小球动画的状态:

circle->anima = (games_anima_t)malloc(2 * sizeof(games_anima_s));
if (circle->anima == NULL)
{
	perror("circle anima malloc error");
	return NULL;
}
	circle->anima->x = x;//记录物体的位置
	circle->anima->y = y;
	circle->anima->r = r;//记录物体的大小
	circle->anima->step = 0;

circle->anima->anima_obj_tag = ANIMA_OBJ_COLLISION;

在主函数中可以任意赋值来改变动画效果

circle->anima->anima_obj_type = ANIMA_OBJ_DOWN;
circle->anima->step = 100;
3) 使用anima结构体,将之前的参数全部放入结构体当中,比如:
void games_circle_down(games_circle_t circle, int n)
{
	for (int i = 0; i <= n; i++)
	{
		circle->anima->y = circle->anima->y + circle->anima->step;
		cleardevice();
		fillcircle(circle->anima->x, circle->anima->y, circle->anima->r);
		Sleep(circle->anima->vec);
	}
}

7、弹起动画实现

小球简单代码逻辑:判断小球当前位置是否会发生碰撞->如果发生了碰撞那就进行弹起的动画效果->计算弹起的数值->显示弹起动画
实现如下:

void games_obj_bounce(games_circle_t circle, n)
{
		//判断是不是发生了碰撞
		if (circle->anima->y >= screen_height - circle->anima->r)
		{
			y_collision = circle->anima->y;
			//计算碰撞后小球位置的变化		
			for (int j = 0; j <= 10; j++)
			{
				y_collision = y_collision - 10;
				cleardevice();
				fillcircle(circle->anima->x, y_collision,circle->anima->r);
				Sleep(speed);
			}
			circle->anima->y = y_collision;
		}
	}

2024/02/23

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值