您的位置:首页 > 运维架构 > Linux

lesson 2 在窗口上显示图像

2016-03-13 17:33 447 查看
//本教程的地一个垫脚石:一个弹出窗口

//现在SDL已经设置好了, 是时候做一个梗概使SDL图形程序在屏幕上渲染显示
//使用 SDL 和标准 IO
#include<SDL2/SDL.h>
#include<cstdio>
//屏幕尺寸常数
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
 /*
我们在顶部包含SDL的头文件,因为我们需要SDL函数和数据类型作出任何SDL的代码同时也包括 C 标准 IO来输出错误到控制台,你可能更习惯使用iostream,因为它是线程安全的。对于早期的应用,使用让你感觉最舒服的就行
*/


int main(int argc, char *args[]){
//创建我们将渲染的窗口
SDL_Window* window = nullptr;

//窗口表面
SDL_Surface* screenSurface = nullptr;

//初始化SDL
if(SDL_Init(SDL_INIT_VIDEO) == -1){
printf("SDL could not initialize!, SDL_Error:%s\n",SDL_GetError());
return -1;
}
/*
这是我们的主函数,重要的是函数的的参数是一个整数和一个char* 的数组,任何其他形式的主函数可能会产生一个未定义的主函数,SDL需要这样的定义是考虑到多平台的兼容性然后来声明一个SDL窗口,接下来生命一个SDL表面,SDL的表面是一个2D图像,一个2D图像可以从文件中加载或者是窗口的一个图像。然后将图片显示在窗口表面当有错误产生的时候,SDL_Init函数返回 -1,同时在控制台输出错误信息,否则程序就会一闪而过如果你以前从来没使用过 printf,它表示打印格式,它的第一个参数打印一行字符串,下一个参数是一个字符串变量。当发生错误,SDL初始化失败的话,SDL_Error:“SDL_GetError将在控制台输出一个字符串”,%s是一个特殊的格式,%s意味着输出一个字符串到变量列表,SDL_GetError是唯一的参数,返回的字符串将会被添加,SDL函数SDL_GetError返回最近的错误
*/
else{
//创建窗口
window = SDL_CreateWindow("SDL Tutorial",SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN);
if(window == nullptr){
printf("Window could not be created! SDL_Error:%s\n",SDL_GetError());
return -1;
}
/*
如果窗口初始化成功,我们将使用SDL_CreateWindow()创建一个窗口,第一个参数设置窗口标题或者这部分的窗口接下来两个参数定义了x,y表示窗口的创建位置,因为我们不关心在哪创建窗口,因此使用SDL_WINDOWPOS_UNDEFINED设置x,y位置接下来两个参数设置窗口的宽度和高度,最后一个参数是一个创建标志, SDL_WINDOW_SHOWN确保一旦窗口被创建就会显示出来.如果有错误发生,SDL_CreateWindow 返回 NULL,如果没有窗口,我们打印错误到控制台
*/
else{
//获取窗口表面
screenSurface = SDL_GetWindowSurface(window);

//填充白色
SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF));

//更新表面
SDL_UpdateWindowSurface(window);

//等待两秒
SDL_Delay(2000);
}
/*
如果窗口创建成功,我们希望获得窗口表面来让我们在上面绘画, SDL_GetWindowSurface 就是做这个的为了保证这是一个简单的教程,所有我们要做的就是使用 SDL_FillRect在窗口表面填充白色,本教程只是让窗口弹出对于渲染一个重要的一点就是虽然你绘制了一些东西在窗口上,但并不表示你将能看到它,在你做了所有的绘制然后用SDL_UpdateWindowSurface更新后你就能看到你绘制的东西如果我们做的是创建窗口,填充它同时更新。无哦有我们能看到的只是窗口一闪而过同时关闭。为了让它不消失我们调用SDL_Delay。SDL_Delay将等待一个指定的毫秒数。一毫秒的时间是 1/1000 秒。这以为着这个代码将会等待 2 秒后关闭需要注意的事情是当SDL等待的时候,它不能接受键盘输入或者鼠标。不要恐慌当你运行这个程序的时候它不会有回应。我们还没有给出操作鼠标和键盘的代码
*/
//销毁窗口
SDL_DestroyWindow(window);
//退出SDL子系统
SDL_Quit();
return 0;
}
/*
当延迟2秒结束后,我们将销毁窗口释放内存。同时会照顾到 SDL_Surface.当所有东西都被释放后。退出SDL程序返回0并终止运行
*/
完整的程序代码:

#include<SDL2/SDL.h>
#include<cstdio>

//屏幕尺寸常数
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main(int argc, char *args[]){
//创建我们将渲染的窗口
SDL_Window* window = nullptr;

//窗口表面
SDL_Surface* screenSurface = nullptr;

//初始化SDL
if(SDL_Init(SDL_INIT_VIDEO) == -1){
printf("SDL could not initialize!, SDL_Error:%s\n",SDL_GetError());
return -1;
}else{
//创建窗口
window = SDL_CreateWindow("SDL Tutorial",SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN);
if(window == nullptr){
printf("Window could not be created! SDL_Error:%s\n",SDL_GetError());
return -1;
}else{
//获取窗口表面
screenSurface = SDL_GetWindowSurface(window);

//填充白色
SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF));

//更新表面
SDL_UpdateWindowSurface(window);

//等待两秒
SDL_Delay(2000);
}
}

//销毁窗口
SDL_DestroyWindow(window);
//退出SDL子系统
SDL_Quit();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux c++ SDL2