Lessong 7 纹理加载和渲染

SDL2.0的一个新添加的主要部分就是纹理渲染API,这可以使你进行快速、灵活的硬件渲染,在本教程中我们将使用这种新的技术


//加载个人的纹理图像
SDL_Texture* loadTexture(string path);

//The Wwindow we'll be rendering to
SDL_Window* gWindow = nullptr;

//The Window renderer
SDL_Renderer* gRenderer = nullptr;

//Current display texture
SDL_Texture* gTexture = nullptr;
纹理在SDL中有自己的数据类型 SDL_Texture,当我们需要处理 SDL纹理并将其渲染到屏幕上,这就是为什么我们声明了一个全局渲染器gRenderer
你也可以看到我们有一个新的图像加载程序 loadTexture 同时声明了一个我们需要加载的纹理对象

//create window
gWindow = SDL_CreateWindow("SDL Tutorial 07", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
                                   SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
        if(gWindow == nullptr){
            printf("Window could not be created! SDL_Error:%s\n", SDL_GetError());
            success = false;
        }
        else{
            //create renderer for window
            gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED);
            if(gRenderer == nullptr){
                printf("Renderer could not be created! SDL_Error:%s\n",SDL_GetError());
                success = false;
            }else{
                //Initialize renderer color
                SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF,0xFF,0xFF);
                //Initialize PNG loading
                int imgFlags = IMG_INIT_PNG;

                if(!(IMG_Init(imgFlags) & imgFlags)){
                    printf("SDL_image could not initialized! SDL_Error:%s\n",SDL_GetError());
                    success = false;
                }
            }
        }
    }
    return success;
当我们创建了我们的窗口后,我们需要为窗口创建一个渲染器渲染纹理,调用 SDL_CreateRenderer 可以很容易的完成
创建渲染器之后,我们需要用 SDL_SetRendererDrawColor 初始化纹理颜色,这控件的颜色用于各种渲染器操作

SDL_Texture* loadTexture(string path){
    //The final Texture
    SDL_Texture* newTexture = nullptr;

    //load image an specified path
    SDL_Surface* loadedSurface = IMG_Load(path.c_str());
    if(loadedSurface == nullptr){
        printf("Unable to load image %s! SDL_image Error:%s\n", path.c_str(), IMG_GetError());
    }else{
        //Create texture from surface pixel
        newTexture = SDL_CreateTextureFromSurface(gRenderer, loadedSurface);
        if(newTexture == nullptr){
            printf("Unable to create texture from %s! SDL_Error: %s\n", path.c_str(), SDL_GetError());
        }
        SDL_FreeSurface(loadedSurface);
    }
    return newTexture;
}
纹理加载函数在很大程度上看起来和以前差不多,只是不使用转换加载表面格式,我们使用SDL_CreateTextureFormSurface创建一个纹理的表
面加载,像以前一样,这个函数创建一个新的纹理从一个存在的表面上,这就需要我们释放一个 loaded surface,然后返回一个 loaded texture

bool loadMedia(){
    bool success = true;
    gTexture = loadTexture("SDL_7/texture.png");
    if(gTexture == nullptr){
        printf("Failed to load texture image!\n");
        success = false;
    }
    return success;
}

void close(){
    SDL_DestroyTexture(gTexture);
    gTexture = nullptr;

    SDL_DestroyRenderer(gRenderer);
    SDL_DestroyWindow(gWindow);
    gRenderer = nullptr;
    gWindow = nullptr;

    IMG_Quit();
    SDL_Quit();
} 
由于纹理加载是抽象的图像加载函数,loadMedia()函数和之前做的几乎是同一个工作
在清理函数中,我们必须记住释放我们的纹理用 SDL_DestroyTexture

else{
            bool quit = false;
            SDL_Event e;
            while(!quit){
                while(SDL_PollEvent(&e) != 0){
                    if(e.type == SDL_QUIT){
                        quit = true;
                    }
                }
                //clear screen
                SDL_RenderClear(gRenderer);
                //renderer texture to screen 纹理渲染到屏幕上
                SDL_RenderCopy(gRenderer, gTexture, NULL, NULL);
                //Update screen
                SDL_RenderPresent(gRenderer);          
在主循环后,我们调用SDL_Renderer,这个函数用SDL_SetRenderDrawColor最后设置的颜色填充窗口屏幕
屏幕清除,渲染纹理我们用SDL_RenderCopy 渲染纹理,我们仍然需要更新屏幕,但我们不能用SDL_Surface显示,SDL_UpdateWindowSurface也不能用。相反,我们必须使用SDL_RenderPresent。

程序的完整代码和媒体文件下载地址(这个二维码是我博客的地址,修改图片后缀为 .rar就可以解压,因为我不知道csdn在哪上传文件):右键另存为





你可能感兴趣的:(linux,SDL2,c++,SDL2.0)