图片资源加载
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的值, 就会明白他们的作用.