本章又是个重要的章节——动画。
动画,本质上时一系列静态的画面连续播放,欺骗人眼产生动画效果。这个原理自打十九世纪电影诞生开始,就从来没变过。
我们的游戏中也需要一些动画效果,比如,被击中时的受伤效果,击毁效果,血包的动画效果等等。这些动画分为两类:连续线性动画、离散的帧动画。
离散动画,就是在指定的时间点,将目标变量设定为特定的值。
连续动画,就是除了两个特定时间之外,通过插值算法为中间帧设定中间值。
这两者的时间轴都应不受系统处理能力的影响,所以,我们又想到了tick。
我们先从简单的开始,先做个帧动画。设定飞机被击中时,变为红色,1秒后恢复,单次动画不重复。
1、先定义一个动画基类:
Animation.h
/*
* Animation.h
*
* Created on: Dec 25, 2023
* Author: YoungMay
*/
#ifndef SRC_ANICOMP_ANIMATION_H_
#define SRC_ANICOMP_ANIMATION_H_
#include "stdint.h"
#include "../drivers/DList.h"
#include "../drivers/tools.h"
typedef struct {
uint32_t time;
int value;
} AnimationData;
class Animation {
public:
Animation() {
dataList = ListCreate();
}
virtual ~Animation() {
ListDestory(dataList);
}
void addItem(uint32_t time, int value);
virtual int tick(uint32_t t)=0;
void start();
uint8_t isValid = 0;
int *bindAddress = NULL;
protected:
ListNode *dataList;
uint32_t totalTick;
};
#endif /* SRC_ANICOMP_ANIMATION_H_ */
其中
各时间点的数据,保存在链表dataList中。
bindAddress是绑定的数据地址,到了指定时刻,我们就修改它。
2、再定义一个离散动画类:
DispersedAnimation.h
/*
* DispersedAnimation.h
*
* Created on: Dec 25, 2023
* Author: YoungMay
*/
#ifndef SRC_ANICOMP_DISPERSEDANIMATION_H_
#define SRC_ANICOMP_DISPERSEDANIMATION_H_
#include "Animation.h"
class DispersedAnimation: public Animation {
public:
DispersedAnimation();
~DispersedAnimation();
int tick(uint32_t t);
};
#endif /* SRC_ANICOMP_DISPERSEDANIMATION_H_ */
DispersedAnimation.cpp