SDL 默认只支持BMP图片格式,加载图片到SDL_Texture*中,使用SDL_LoadBMP函数即可。函数原型如下。
SDL_Surface* SDL_LoadBMP(const char* file)
按照SDL官方文档,旧的SDL_Surface已经建议尽量不要使用了,因为SDL_Surface是加载到RAM中处理,而使用SDL_Texture,数据是在GPU中处理,能够使用到硬件加速,速度会快很多。但是SDL_Surface并未被废弃,在加载大图片(如地图,背景等图片),通常还是使用SDL_Surface, 对于游戏精灵等图片,推荐使用SDL_Texture.
将BMP图片加载到SDL_Texture中,可以使用如下代码。
SDL_Surface* pTempSurface = SDL_LoadBMP("assets/rider.bmp");
m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer,
pTempSurface);
SDL_FreeSurface(pTempSurface);
当前游戏中所涉及的图片资源都是JPG或PNG格式,这个时候可以将SDL_Image库引用到工程中,获取更多的图片格式支持。SDL_Image支持 BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV 文件格式。
SDL_Texture* pTexture=IMG_LoadTexture(pRenderer,"xxx.png");
图片加载后,就可以调用SDL_RenderCopy 或SDL_RenderCopyEx函数 进行绘制。
int SDL_RenderCopy(SDL_Renderer* renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect);
SDL_RenderCopy 中srcrect 是源图片的矩形图片,赋值为NULL即是绘制整张图片,取图片的一部分则只绘制部分图片。dstrect是将srcrect内容绘制的目的矩形,赋值为NULL是绘制当前render所在的整个区间。调整这两个参数可以实现图片的部分绘制,图片的缩放。
如果要实现图片的水平或垂直反转,图片的旋转,需要调用SDL_RenderCopyEx。
int SDL_RenderCopyEx(SDL_Renderer* renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect,
const double angle,
const SDL_Point* center,
const SDL_RendererFlip flip);
本篇开头所示的图片依次示范,背景图片绘制(冰山),图片原样输出,放大2倍,缩小1倍,水平反转,垂直反转,沿顺时针方向旋转45度,沿逆时针旋转45度。
完整示例代码如下:
#include <SDL.h>
#include <SDL_image.h>
#include <iostream>
using namespace std;
SDL_Window* window = 0;
SDL_Renderer* renderer = 0;
void loadAssets();
void draw();
void cleanup();
void render();
void update();
SDL_Texture *texBackground = 0;
SDL_Texture *texTux = 0;
const SDL_Rect rc[] = {
{0,0,64,80}, //normal
{64,0,64*2,80*2}, //scale *2
{190,0,64/2,80/2}, //scale* 1/2
{260,0,64,80},//H
{330,0,64,80 },//V
{400,0,64,80 },//rotate
{470,0,64,80 }//rotate
};
int main(int argc, char** argv)
{
SDL_Event event;
bool running = true;
SDL_Init(SDL_INIT_EVERYTHING);
SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_SHOWN, &window, &renderer);
SDL_SetWindowTitle(window, "Draw Image in SDL");
loadAssets();
while (running)
{
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
{
running = false;
break;
}
update();
render();
}
}
cleanup();
return 0;
}
void render()
{
SDL_RenderClear(renderer);
draw();
SDL_RenderPresent(renderer);
}
void loadAssets()
{
texBackground = IMG_LoadTexture(renderer, "assets/bluemountain-middle.png");
texTux = IMG_LoadTexture(renderer, "assets/stand-0.png");
}
void cleanup()
{
SDL_DestroyTexture(texBackground);
SDL_DestroyTexture(texTux);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
void update()
{
}
void draw()
{
SDL_RenderCopy(renderer, texBackground, NULL, NULL);
SDL_RenderCopy(renderer, texTux, NULL, &rc[0]);
SDL_RenderCopy(renderer, texTux, NULL, &rc[1]);
SDL_RenderCopy(renderer, texTux, NULL, &rc[2]);
SDL_RenderCopyEx(renderer, texTux, NULL, &rc[3], 0, 0, SDL_FLIP_HORIZONTAL);
SDL_RenderCopyEx(renderer, texTux, NULL, &rc[4], 0, 0, SDL_FLIP_VERTICAL);
SDL_RenderCopyEx(renderer, texTux, NULL, &rc[5], 45, 0, SDL_FLIP_NONE);
SDL_RenderCopyEx(renderer, texTux, NULL, &rc[6], -45, 0, SDL_FLIP_NONE);
}