上一篇教程中粗略地讲了如何创建窗口,现在让我们在窗口里面展示一张图片。
NOTE:从这篇教程开始,代码示例将会只包含关键的部分。
/Starts up SDL and creates window
//函数功能:初始化SDL并创建窗口
bool init();
//Loads media
//函数功能:加载多媒体文件
bool loadMedia();
//Frees media and shuts down SDL
//函数功能:释放多媒体文件并关闭SDL
void close();
这里的新的数据类型叫做SDL Surface,SDL surface就是一种包含图像所有的像素点以及一些需要用于渲染这个图像的数据的图像数据类型。
(Here’s a new data type called an SDL Surface. An SDL surface is just an image data type that contains the pixels of an image along with all data needed to render it.)
SDL surface使用软件渲染,这就意味着它会使用CPU进行渲染。
当然也可以进行硬件渲染,但是会更加复杂一些,所以还是先学简单的方法吧。以后的教程中会讲到如何GPU加速渲染图像。
我们这里要处理的图像就是要在屏幕中显示的图像(你在窗口中看到的),我们将从文件中加载它。
注意代码中使用的是指向SDL surface的指针,理由如下:
1. 我们会动态地分配内存来加载图像
2. 引用内存中的图片会更好。想象一下你做的一个游戏里面有一堵由同样的砖块多次渲染而成的砖墙(就像超级玛丽兄弟)。如果在内存中反复载入多组相同砖块的图像来组成墙是很浪费内存的,更好的方法是通过引用同一个图像再多次渲染成墙。
同样,一定要记得初始化你的指针,就像代码里面一样在声明的时候直接初始化。
在载入多媒体文件的函数中我们调用了SDL_LoadBMP()函数,SDL_LoadBMP()接受一个存有BMP图像文件的地址的字符串做为参数并返回载入完成的surface。
我们调用了之前自己的定义init()函数来初始化SDL并加载图像。
成功之后就通过调用SDL_BlitSurface()把加载完成的surface位块传送(blit)到screen surface。
位块传送(blit)所做的事就是将获得的源surface进行复制并将复制出的东西放到目标处的surface。
SDL_BlitSurface()函数的第一个参数就是源surface,第三个参数就是目标位置。
第二个和第四个参数在后面的教程中再进行讲解。
做完surface的绘制工作后,到目前为止仍不能让他出现在窗口里。还有一步:
//更新surface
SDL_UpdateWindowSurface( gWindow );
在屏幕上绘制所有内容后,我们要使用SDL_UpdateWindowSurface()更新屏幕。通常当你尝试绘制在屏幕上时,你并非直接绘制在你所见的窗口中的图像上的(也就是说并不能直接看到)。默认情况下,大多数渲染系统都是双缓冲机制的,这两个缓冲区分为前、后缓冲区。
案例参考:sdl2image.cpp
#include#include #include #include #include #include using namespace std; //Screen dimension constants const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; //Starts up SDL and creates window static bool init(); //Loads media static bool loadMedia(); //Frees media and shuts down SDL static void close(); //The window we'll be rendering to static SDL_Window* gWindow = NULL; //The surface contained by the window static SDL_Surface* gScreenSurface = NULL; //The image we will load and show on the screen static SDL_Surface* gHelloWorld = NULL; bool init() { //Initialization flag bool success = true; //Initialize SDL if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() ); success = false; } else { //Create window gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN ); if( gWindow == NULL ) { printf( "Window could not be created! SDL_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 splash image gHelloWorld = SDL_LoadBMP( "hello_sdl.bmp" ); if( gHelloWorld == NULL ) { printf( "Unable to load image %s! SDL Error: %s\n", "02_getting_an_image_on_the_screen/hello_world.bmp", SDL_GetError() ); success = false; } return success; } void close() { //Deallocate surface SDL_FreeSurface( gHelloWorld ); gHelloWorld = NULL; //Destroy window SDL_DestroyWindow( gWindow ); gWindow = NULL; //Quit SDL subsystems SDL_Quit(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug()<< "Hello,sdl" ; //Start up SDL and create window if( !init() ) { printf( "Failed to initialize!\n" ); } else { //Load media if( !loadMedia() ) { printf( "Failed to load media!\n" ); } else { //Apply the image SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL ); //Update the surface SDL_UpdateWindowSurface( gWindow ); //Wait two seconds SDL_Delay( 2000 ); } } //Free resources and close SDL close(); return a.exec(); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)