原理:将角色动画的一系列画面保存到一幅图中,然后计算srcRect源框的值,剪裁式地将单个角色按顺序显示屏幕上,就可以产生动画效果。
//Game.cpp中,修改装载图片的代码:
//修改源和目的矩形值的定义:
//检查render()中的纹理复制函数是否正确
测试运行:目前只显示文件中第一帧的画面
//Game.cpp中的update()
测试运行:可以正常产生动画效果
试验一:
//将素材包中的animate.bmp复制到工程目录的assets文件夹中//Game.cpp中,修改装载图片的代码:
//装入动作系列图片,形成绘制纹理
SDL_Surface* pTempSurface = SDL_LoadBMP("assets/animate.bmp");
//修改源和目的矩形值的定义:
//本例中不再查询图片的高宽,而是指定单帧的高宽
//SDL_QueryTexture(m_pTexture, NULL, NULL, &m_srcRect.w, &m_srcRect.h);
m_srcRect.w = 128; //指定单帧的高宽
m_srcRect.h = 82;
m_destRect.x = m_srcRect.x = 0; //赋值destRect
m_destRect.y = m_srcRect.y = 0;
m_destRect.w = m_srcRect.w;
m_destRect.h = m_srcRect.h;
//检查render()中的纹理复制函数是否正确
//绘制纹理对象
SDL_RenderCopy(m_pRenderer, m_pTexture, &m_srcRect, &m_destRect);
//SDL_RenderCopy(m_pRenderer, m_pTexture, 0, 0);
测试运行:目前只显示文件中第一帧的画面
试验二:
在update()中添加代码,用来计算在不同时间,应该显示出来的帧://Game.cpp中的update()
void Game::update()
{
//利用GetTicks返回已消逝的毫秒数,对6取模,因为有6帧
//得到的帧数再乘128,这是每帧的宽
m_srcRect.x = 128 * int(((SDL_GetTicks() / 100) % 6));
}
测试运行:可以正常产生动画效果