3. 图片资源加载

图片资源加载

SDL可加载很多格式的图片资源, 自带bmp格式加载. 扩展包SDL_image中有其他格式的加载API. 我们先看bmp加载. 自行找bmp资源(会自己制作游戏资源的就更好了).

//Game.h
#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED

#include <SDL.h>

class Game
{
public:
    bool init(const char* title,
              int xpos = SDL_WINDOWPOS_CENTERED,
              int ypos = SDL_WINDOWPOS_CENTERED,
              int width = 640, int height = 480,
              int flags = SDL_WINDOW_SHOWN);
    void render();
    void update();
    void handleEvents();
    void clean();

    bool running() const { return m_bRunning; }

private:
    SDL_Window* m_pWindow;
    SDL_Renderer* m_pRenderer;

    SDL_Texture* m_pTexture;
    SDL_Rect m_srcRect;
    SDL_Rect m_destRect;

    bool m_bRunning;
};

#endif // GAME_H_INCLUDED
// Game.cpp
#include "Game.h"
#include <iostream>

bool Game::init(const char* title, int xpos, int ypos, int width, int height, int flags)
{
    bool success = true;
    if (SDL_Init(SDL_INIT_EVERYTHING) == 0) {
        std::cout << "SDL init success\n";
        m_pWindow = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
        if (m_pWindow) {
            std::cout << "window creation success\n";
            m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
            if (m_pRenderer) {
                std::cout << "render creation success\n";
                SDL_SetRenderDrawColor(m_pRenderer, 255, 255, 255, 255);
            }
            else {
                std::cout << "render creation fail\n";
                success = false;
            }
        }
        else {
            std::cout << "window creation fail\n";
            success = false;
        }
    }
    else {
        std::cout << "SDL init fail\n";
        success = false;
    }

    if (success) {
        SDL_Surface* pTempSurface = SDL_LoadBMP("assets/Rider.bmp");
        if (pTempSurface) {
            std::cout << "assets/Rider.bmp load success.\n";
            m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer, pTempSurface);
            if (m_pTexture) {
                std::cout << "create texture success.\n";
            }
            else {
                std::cout << "create texture fail.\n";
                success = false;
            }
            SDL_FreeSurface(pTempSurface);
        }
        else {
            std::cout << "load assets/Rider.bmp fail.\n";
            success = false;
        }
    }

    if (success) {
        SDL_QueryTexture(m_pTexture, NULL, NULL, &m_srcRect.w, &m_srcRect.h);
        m_destRect.x = m_srcRect.x = 0;
        m_destRect.y = m_srcRect.y = 0;
        m_destRect.w = m_srcRect.w;
        m_destRect.h = m_srcRect.h;
    }

    std::cout << "init success\n";
    m_bRunning = true;

    return success;
}

void Game::render()
{
    SDL_RenderClear(m_pRenderer);

    SDL_RenderCopy(m_pRenderer, m_pTexture, &m_srcRect, &m_destRect);

    SDL_RenderPresent(m_pRenderer);
}

void Game::update()
{

}

void Game::clean()
{
    std::cout << "cleaning game\n";
    SDL_DestroyTexture(m_pTexture);
    m_pTexture = nullptr;
    SDL_DestroyRenderer(m_pRenderer);
    m_pRenderer = nullptr;
    SDL_DestroyWindow(m_pWindow);
    m_pWindow = nullptr;

    SDL_Quit();
}

void Game::handleEvents()
{
    SDL_Event event;

    if (SDL_PollEvent(&event)) {
        switch (event.type) {
        case SDL_QUIT:
            m_bRunning = false;
            break;

        default:
            break;
        }
    }
}

编译运行, 结果
在这里插入图片描述

简单解释

大致流程如下:
SDL_LoadBMP(“path_to_assets”) —> SDL_CreateTextureFromSurface(render, surface) —> SDL_RenderCopy(render, texture, src_rect, dst_rect);

SDL_Surface和SDL_Texture什么区别?
目前可以简单的认为, SDL_Surface是software render, SDL_Texture是hardware render

src_rect和dst_rect有什么用?
src_rect指定了原图中那一块区域的像素会被加载到显示窗口中.
dst_rect指定了像素加载到显示窗口的那个块.
自己修改一下这两个rect的值, 就会明白他们的作用.

猜你喜欢

转载自blog.csdn.net/creambean/article/details/88573494
3.