您的位置:首页 > 其它

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

2014-01-15 22:11 309 查看
动画制作

游戏动画如何制作呢?

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

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

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

#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);


运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: