SDL2系列教程11-動漫人物小遊戲
本機制作一個動漫人物,具有豐富的動作形象;
程式碼講解
定義精靈表結構體
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個人物
最終測試:
實現動態開通人物形象;
程式碼下載地址: