SDL2系列教程11-动漫人物小游戏

本机制作一个动漫人物,具有丰富的动作形象;

代码讲解

定义精灵表结构体

struct spritesheet {
    SDL_Texture* texture;
    vector<SDL_Rect> sprites;
    Uint32 lastFrame, lastUpdate;
};

texture  纹理;

 sprites 向量存储每个人物的矩形位置;

lastFrame 上一帧;

lastUpdate  上次刷新时间;

先加载图片,获取每个人物的矩阵信息

扫描二维码关注公众号,回复: 3512508 查看本文章

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

最终测试:

  

实现动态开通人物形象;

代码下载地址:

https://download.csdn.net/download/cyf15238622067/10698366

猜你喜欢

转载自blog.csdn.net/cyf15238622067/article/details/82912055