本机制作一个动漫人物,具有丰富的动作形象;
代码讲解
定义精灵表结构体
struct spritesheet {
SDL_Texture* texture;
vector<SDL_Rect> sprites;
Uint32 lastFrame, lastUpdate;
};
texture 纹理;
sprites 向量存储每个人物的矩形位置;
lastFrame 上一帧;
lastUpdate 上次刷新时间;
先加载图片,获取每个人物的矩阵信息
spritesheet ss;
ss.lastFrame = 0;
ss.lastUpdate = SDL_GetTicks();
ss.texture = SDL_CreateTextureFromSurface(renderer, buffer);
SDL_FreeSurface(buffer);
buffer = NULL;
if (!ss.texture) {
cout << "Error creating texture: " << SDL_GetError() << endl;
return false;
}
for (int j = 0; j < 16; j++) { //此循环将人物矩形信息放入vector sprites中
for (int i = 0; i < 16; i++) {
SDL_Rect r = { i * sprite_width, j * sprite_height, sprite_width, sprite_height };
ss.sprites.push_back(r);
}
}
然后循环显示每一个人物
const float sprite_fps = 24.0f;
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderClear(renderer);
Uint32 current = SDL_GetTicks();
float dT = (current - ss.lastUpdate) / 1000.0f; //时间差
int framesToUpdate = floor(dT / (1.0f / sprite_fps)); //由时间差计算出需要显示哪一张,(1.0f / sprite_fps)=每帧时间(t), // dT/t=时间差应该显示几帧
if (framesToUpdate > 0) {
ss.lastFrame += framesToUpdate;
ss.lastFrame %= ss.sprites.size(); //取余实现循环显示
ss.lastUpdate = current;
}
SDL_RenderCopy(renderer, ss.texture, &ss.sprites[ss.lastFrame], NULL);
SDL_RenderPresent(renderer);
基于本张图片制作:共16*16个人物
最终测试:
实现动态开通人物形象;
代码下载地址: