要使用 SDL3 和 SDL2_image 库将 .png 文件加载到窗口,我从下面的链接下载了以下代码:
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <SDL3_image/SDL_image.h>
#include <string>
//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
//Starts up SDL and creates window
bool init();
//Loads media
bool loadMedia();
//Frees media and shuts down SDL
void close();
//Loads individual image
SDL_Surface* loadSurface( std::string path );
//The window we'll be rendering to
SDL_Window* gWindow = NULL;
//The surface contained by the window
SDL_Surface* gScreenSurface = NULL;
//Current displayed PNG image
SDL_Surface* gPNGSurface = NULL;
bool init()
{
//Initialization flag
bool success = true;
//Initialize SDL
if( !SDL_Init( SDL_INIT_VIDEO ) )
{
SDL_Log( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Create window
gWindow = SDL_CreateWindow( "SDL Tutorial", SCREEN_WIDTH, SCREEN_HEIGHT, 0 );
if( gWindow == NULL )
{
SDL_Log( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Initialize PNG loading
int imgFlags = IMG_INIT_PNG;
if( !( IMG_Init( imgFlags ) & imgFlags ) )
{
SDL_Log( "SDL_image could not initialize! SDL_image Error: %s\n", SDL_GetError() );
success = false;
}
else
{
//Get window surface
gScreenSurface = SDL_GetWindowSurface( gWindow );
}
}
}
return success;
}
bool loadMedia()
{
//Loading success flag
bool success = true;
//Load PNG surface
gPNGSurface = loadSurface( "loaded.png" );
if( gPNGSurface == NULL )
{
SDL_Log( "Failed to load PNG image!\n" );
success = false;
}
return success;
}
void close()
{
//Free loaded image
SDL_DestroySurface( gPNGSurface );
gPNGSurface = NULL;
//Destroy window
SDL_DestroyWindow( gWindow );
gWindow = NULL;
//Quit SDL subsystems
IMG_Quit();
SDL_Quit();
}
SDL_Surface* loadSurface( std::string path )
{
//The final optimized image
SDL_Surface* optimizedSurface = NULL;
//Load image at specified path
SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
if( loadedSurface == NULL )
{
SDL_Log( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), SDL_GetError() );
}
else
{
//Convert surface to screen format
optimizedSurface = SDL_ConvertSurface( loadedSurface, gScreenSurface->format );
if( optimizedSurface == NULL )
{
SDL_Log( "Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
}
//Get rid of old loaded surface
SDL_DestroySurface( loadedSurface );
}
return optimizedSurface;
}
int main( int argc, char* args[] )
{
//Start up SDL and create window
if( !init() )
{
SDL_Log( "Failed to initialize!\n" );
}
else
{
//Load media
if( !loadMedia() )
{
SDL_Log( "Failed to load media!\n" );
}
else
{
//Main loop flag
bool quit = false;
//Event handler
SDL_Event e;
//While application is running
while( !quit )
{
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 )
{
//User requests quit
if( e.type == SDL_EVENT_QUIT )
{
quit = true;
}
}
//Apply the PNG image
SDL_BlitSurface( gPNGSurface, NULL, gScreenSurface, NULL );
//Update the surface
SDL_UpdateWindowSurface( gWindow );
}
}
}
//Free resources and close SDL
close();
return 0;
}
设置 SDL3 和 SDL_Image 库:
https://github.com/libsdl-org/SDL/releases/tag/preview-3.1.6
https://github.com/libsdl-org/SDL_image/releases
686-w64-mingw32 x86_64-w64-mingw32 cmake
https://github.com/libsdl-org/SDL_image/blob/main/include/SDL3_image/SDL_image.h
对于 CodeBlocks 20.03 32 位中的项目设置:
SDL3.dll SDL2_image.dll
程序编译没有任何问题,但是当我运行它时,它给出错误“SDL2.dll not found”。
除了使用 SDL3 加载 .png 文件之外,其他示例都工作正常。加载 SDL3_image 库时是否存在错误或者我缺少什么?