1. 程式人生 > >SDL2系列教程11-動漫人物小遊戲

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個人物

最終測試:

  

實現動態開通人物形象;

程式碼下載地址: