SDL游戏之路(九)--动画制作

动画制作


游戏动画如何制作呢?

我的理解就是,动画就是一幅幅图片不断替换就形成了动画。

当然,每一副图片要显示一段时间。

所有定义一个动画的实现类,代码如下:

#ifndef SKANIMATION_H_
#define SKANIMATION_H_

#include "SkComm.h"
#include "SkImage.h"

#include <vector>
using namespace std;
namespace sk_park {
class SkAnimation {
public:
	SkAnimation();
	//获取对应时刻点应该绘制的图片
	SkSurface * getShow(Sint64 iMSecTime);
	//设置动画开始播放的时间点,动画从此时间点后会循环播放
	void setBeginTime(Sint64 iBeginMSec);
	//添加动画图片,按照顺序添加每一幅图片,并指定该图片显示的毫秒数
	void addPic(SkSurface & stPic, Sint32 iMSec);
	//清除动画内容
	void clear();

	//动画的位置信息,只作为成员属性,动画绘制的位置需要在绘制时候指定
	Sint32 m_iPosX;
	Sint32 m_iPosY;
	//动画大小,只作为成员属性,动画绘制的大小需要在m_vctPic中指定
	Sint32 m_iWidth;
	Sint32 m_iHeight;
	//绘制的图片
	vector<SkSurface> m_vctPic;
	//绘制图片的时长
	vector<Sint32> m_vctMSec;
	//动画开始时间
	Sint64 m_iBeginMSec;
	//动画总时长
	Sint32 m_iTotalMSec;

};
}

extern sk_park::SkAnimation g_SkAnimation;

#endif /* SKANIMATION_H_ */


实现如下:

#include "pch.h"

#include "SkAnimation.h"
using namespace sk_park;

SkAnimation::SkAnimation() {
	m_iBeginMSec = 0;
	m_iPosX = 0;
	m_iPosY = 0;
	m_iTotalMSec = 0;
}
void SkAnimation::setBeginTime(Sint64 iBeginMSec) {
	m_iBeginMSec = iBeginMSec;
}
SkSurface * SkAnimation::getShow(Sint64 iMSecTime) {
	if (m_iBeginMSec == 0) {
		m_iBeginMSec = iMSecTime;
	}
	Sint32 iMSec = iMSecTime - m_iBeginMSec;
	if (iMSec < 0) {
		iMSec = 0;
	}
	if (m_iTotalMSec <= 0) {
		return NULL;
	}
	Sint32 iMSecTmp = iMSec % m_iTotalMSec;
	Sint32 iTmp = 0;
	for (int i = 0; i < (int) m_vctMSec.size(); i++) {
		iTmp += m_vctMSec.at(i);
		if (iTmp >= iMSecTmp) {
			return &(m_vctPic.at(i));
		}
	}
	return NULL;
}
void SkAnimation::addPic(SkSurface & stPic, Sint32 iMSec) {
	if (iMSec > 0) {
		m_iTotalMSec += iMSec;
		m_vctMSec.push_back(iMSec);
		m_vctPic.push_back(stPic);
	}
}
void SkAnimation::clear() {
	m_vctMSec.clear();
	m_vctPic.clear();
	m_iTotalMSec = 0;
}

SkAnimation g_SkAnimation;

使用示例:

{
		SkImage image;
		image.load("pic/p0.png");
		m_testAnimation.addPic(image.m_skSurface, 100);
	}
	{
		SkImage image;
		image.load("pic/p1.png");
		m_testAnimation.addPic(image.m_skSurface, 100);
	}
	{
		SkImage image;
		image.load("pic/p2.png");
		m_testAnimation.addPic(image.m_skSurface, 100);
	}
	{
		SkImage image;
		image.load("pic/p3.png");
		m_testAnimation.addPic(image.m_skSurface, 100);
	}
	m_testAnimation.setBeginTime(g_SkGameTimer.m_siGameLastTime);


运行效果:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值