Hello SDL: 第一个图形窗口


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

简介

    这一篇教程包含最主要也最基础的一步——弹出一个窗口(Window)

    因为会用到SDL库所以在代码一开始包含SDL.h,这里使用stdio.h而不是iostream,用C的标准IO(理由是more thread safe),对于这样比较简单的程序,使用你习惯的IO就好。

Createwindow(...)



包含头文件之后,我们定义了存储要生成的窗口的宽(width)和高(height)的常量。


SDL surface就是一个2D的图像,它的指针既可以指向文件中的图像,也可以指向屏幕上正在显示的图像。

(A SDL surface is just a 2D image. A 2D image can be loaded from a file or it can be the image inside of a window. )在这里它指向屏幕里的窗口中的图像(所以名字叫screenSurface)


定义完窗口和screen surface之后,对SDL进行初始化。

若没有对SDL进行初始化,则无法调用任何SDL函数。

因为在这篇教程里面我们只需要用SDL的视频子系统(video subsystem)创建一个窗口,我们只给这个初始化函数SDL_INIT_VIDEO作为参数。


如果SDL成功初始化,我们就能使用SDL_CreatWindow()函数来创建窗口。

第一个参数设置窗口的标题或窗口的这一部分:

接下来的两个参数定义了窗口生成处的x和y的坐标。

因为我们暂时不用关心它创建在哪里,所以就直接使用SDL_WINDOWPOS_UNDEFINED这个预定义的常量来初始化x和y坐标。


接下来的两个参数定义了窗口的宽度和高度。

最后那个参数是创建标签(creation flag)。

以SDL_WINDOW_SHOWN作为此参数时,表示窗口一创建即为可见的(非隐藏窗口?)



如果窗口创建成功,如果能获取到窗口的surface,我们就能在surface上作图。而SDL_GetWindowSurface()就是干这个的。


为了使这篇教程尽量简单,我们所要对这个窗口做的就只是使用SDL_FillRect()函数来填充整个窗口。



案例参考:sdl2demo.cpp


案例参考:sdl2demo1.cpp




#include <QCoreApplication>
#include <qdebug.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_thread.h>
#include <SDL2/SDL_test_images.h>
#include<iostream>
using namespace std;
//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<< "Hello,sdl" ;
    SDL_Window *window = NULL;
    SDL_Renderer *renderer = NULL;
    SDL_Init(SDL_INIT_VIDEO);// 初始化函数,可以确定希望激活的子系统
    window = SDL_CreateWindow("My First Window",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              640,
                              480,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);// 创建窗口
    if (!window) {
        return -1;
    }
    //基于窗口创建渲染器
    renderer = SDL_CreateRenderer(window, -1, 0);
    if (!renderer) {
        return -1;
    }
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); //设置渲染器颜色 r、g、b、a
    SDL_RenderClear(renderer);//用指定的颜色清空缓冲区
    SDL_RenderPresent(renderer); //将缓冲区中的内容输出到目标窗口上。
    SDL_Delay(3000); // 延时3秒
    SDL_DestroyRenderer(renderer); //销毁渲染器
    SDL_DestroyWindow(window); //销毁窗口
    SDL_Quit(); //退出SDL
    return a.exec();
}

好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***