SDL基础使用02(加载bmp图片、纹理和渲染)

简介: 这篇文章介绍了如何使用SDL库在C++中加载和显示BMP图片,以及如何使用纹理和渲染器进行更高级的图形处理。

1. 加载bmp图片到SDL窗口

步骤 SDL 函数
1.初始化SDL SDL_Init
2.创建窗口 SDL_CreateWindow
3.获取窗口表面 SDL_GetWindowSurface
4.加载bmp图片到surface SDL_LoadBMP
5.将图片surface设置到窗口surface上 SDL_BlitSurface
6.更新窗口surface显示 SDL_UpdateWindowSurface
7.释放资源,退出SDL SDL_FreeSurface, SDL_DestroyWindow, SDL_Quit
#include <iostream>
/* 加载bmp图片
*    1. SDL默认只能加载bmp图片
*/
extern "C"
{
#include <SDL.h>
}

#pragma comment(lib, "SDL2.lib")


#undef main
int main03()
{
    // 1. 初始化SDL
    int nRet = SDL_Init(SDL_INIT_EVERYTHING);
    if (nRet < 0)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 2. 创建窗口
    SDL_Window* pWnd = SDL_CreateWindow("BMP SHOW",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        640, 480,
        SDL_WINDOW_SHOWN);
    if (NULL == pWnd)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 3. 获取窗口表面 
    SDL_Surface* pWndSurface = SDL_GetWindowSurface(pWnd);
    if (NULL == pWndSurface)
    {
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 4. 加载bmp图片
    SDL_Surface* pBmpSurface = SDL_LoadBMP("./Panda.bmp");

    // 5. 将图片的surface设置到窗口的surface上
    SDL_BlitSurface(pBmpSurface, NULL, pWndSurface, NULL);

    // 6. 更新窗口surface显示
    SDL_UpdateWindowSurface(pWnd);

    SDL_Delay(3000);

    // 7. 释放资源
    if (pBmpSurface)
    {
        SDL_FreeSurface(pBmpSurface);
    }
    if (pWnd)
    {
        SDL_DestroyWindow(pWnd);
    }

    // 8. 退出SDL
    SDL_Quit();

    return 0;
}

2. 纹理和渲染的简单使用

1. 初始化SDL                SDL\_Init  
2. 创建窗口                SDL\_CreateWindow  
3. 基于窗口创建渲染器    SDL\_CreateRenderer  
4. 基于渲染器创建纹理    SDL\_CreateTexture  
5. 绘制三部曲  
    5.1 清空渲染器上一次的显示        SDL\_RenderClear  
    /// 一些绘制操作     SDL\_SetRenderDrawColor SDL\_RenderFillRect  SDL\_RenderDrawRect   
    5.2 拷贝纹理数据到渲染器            SDL\_RenderCopy  
    5.3 更新渲染器显示                SDL\_RenderPresent  
6. 释放资源,退出        SDL\_DestroyTexture  SDL\_DestroyRenderer SDL\_DestroyWindow                SDL\_Quit
#include <iostream>
/* 纹理和渲染(方块跳动) */
extern "C"
{
#include <SDL.h>
}

#pragma comment(lib, "SDL2.lib")

#undef main
int main()
{
    // 1. 初始化
    int nRet = SDL_Init(SDL_INIT_EVERYTHING);
    if (nRet < 0)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 2. 创建窗口
    SDL_Window* pWnd = SDL_CreateWindow("Title",
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        640, 480,
        SDL_WINDOW_SHOWN);
    if (NULL == pWnd)
    {
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 3. 创建渲染器
    SDL_Renderer* pRenderer = SDL_CreateRenderer(pWnd, -1, 0);
    if (NULL == pRenderer)
    {
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 4. 创建纹理
    SDL_Texture*  pTexture = SDL_CreateTexture(pRenderer,                        // 渲染器
                                               SDL_PIXELFORMAT_RGBA8888,        // 渲染数据格式(YUV RGB)
                                               SDL_TEXTUREACCESS_TARGET,        // 纹理类型 static、stream、target
                                               640, 480);                        // 纹理宽高
    if (NULL == pTexture)
    {
        SDL_DestroyRenderer(pRenderer);
        SDL_DestroyWindow(pWnd);
        std::cout << "SDL Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    SDL_Event event;
    SDL_Rect  rect;
    rect.w = 50, rect.h = 50;
    while (true)
    {
        SDL_PollEvent(&event);            // 获取事件
        if (event.type == SDL_QUIT)
            break;
        rect.x = rand() % 640;            // 随机方块的位置
        rect.y = rand() % 480;

        SDL_SetRenderTarget(pRenderer, pTexture);                    // 设置渲染器目标(此时绘制目标为整个纹理)
        SDL_SetRenderDrawColor(pRenderer, 0xFF, 0x00, 0x00, 0x00);    // 设置渲染器绘制颜色(背景颜色)(不设置,下一次循环渲染器绘制颜色为下面设置的颜色)
        SDL_RenderClear(pRenderer);                                    // 刷新渲染器(将渲染器上次渲染清空)

        SDL_SetRenderDrawColor(pRenderer, 0x00, 0xFF, 0x00, 0x00);    // 设置渲染器绘制颜色
        SDL_RenderDrawRect(pRenderer, &rect);                        // 绘制矩形
        SDL_RenderFillRect(pRenderer, &rect);                        // 绘制填充矩形

        // 渲染三部曲:1. 清空上一次的显示    2. 拷贝纹理数据到渲染器        3. 更新渲染器显示 
        SDL_SetRenderTarget(pRenderer, NULL);                        // 清除一下渲染器的目标
        SDL_RenderCopy(pRenderer, pTexture, NULL, NULL);            // 拷贝纹理绘制信息到渲染器
        SDL_RenderPresent(pRenderer);                                // 更新渲染器
        SDL_Delay(500);
    }

    // 释放纹理
    if (pTexture)
    {
        SDL_DestroyTexture(pTexture);
    }
    // 释放渲染
    if (pRenderer)
    {
        SDL_DestroyRenderer(pRenderer);
    }
    // 释放窗口
    if (pWnd)
    {
        SDL_DestroyWindow(pWnd);
    }

    SDL_Quit();

    return 0;
}
相关文章
|
存储 C语言
C 语言文件读取全指南:打开、读取、逐行输出
要从文件读取,可以使用 r 模式: FILE *fptr; // 以读取模式打开文件 fptr = fopen("filename.txt", "r"); 这将使 filename.txt 打开以进行读取。 在 C 中读取文件需要一点工作。坚持住!我们将一步一步地指导您。 接下来,我们需要创建一个足够大的字符串来存储文件的内容。 例如,让我们创建一个可以存储多达 100 个字符的字符串:
1405 2
C 语言文件读取全指南:打开、读取、逐行输出
|
Ubuntu Windows
Qt开发笔记之编码h264码流并封装mp4(六):ubuntu平台编译mp4v2并封装mp4
Qt开发笔记之编码h264码流并封装mp4(六):ubuntu平台编译mp4v2并封装mp4
Qt开发笔记之编码h264码流并封装mp4(六):ubuntu平台编译mp4v2并封装mp4
|
4月前
|
安全 IDE 开发工具
电脑错误代码0xc0000001解决步骤
以下是解决电脑错误代码0xc0000001的详细步骤,综合了多个高可信度来源的修复方案:
|
5月前
|
程序员 编译器 C++
【实战指南】C++ lambda表达式使用总结
Lambda表达式是C++11引入的特性,简洁灵活,可作为匿名函数使用,支持捕获变量,提升代码可读性与开发效率。本文详解其基本用法与捕获机制。
192 44
|
5月前
|
Web App开发 前端开发 关系型数据库
GitHub 2.8k star 开源既封神,“Liquid‑Glass‑React”,让你前端界面瞬间拥有苹果级液态玻璃效果!
Liquid-Glass-React 是一款开源前端组件,旨在将 Apple iOS 26 的“液态玻璃”视觉效果引入 React 应用。凭借逼真折射、多种反射模式、响应式交互及高度可配置性,它已获得 2.8k stars,成为提升 UI 质感的热门工具。
558 0
|
5月前
|
JSON 监控 前端开发
快手引流到微信的六种方法
快手引流至微信的6大技术实现方案(2025版) 一、API自动化交互方案
|
C语言
C语言中返回指针值的函数
C语言中返回指针值的函数
367 0
SDL基础使用04(SDL_image与SDL_mixer扩展库)
本文介绍了如何使用SDL_image和SDL_mixer扩展库在SDL项目中加载和显示图片以及播放音频文件。
644 1
|
Linux API 开发者
SDL库入门:掌握跨平台游戏开发和多媒体编程(一)
SDL库入门:掌握跨平台游戏开发和多媒体编程
1790 1
ly~
|
缓存 监控 编译器
如何优化 SDL 图形库在不同系统中的性能
SDL(Simple DirectMedia Layer)是一个跨平台的多媒体开发库,用于优化不同系统中的图形库性能。在银河麒麟系统中,通过SDL渲染模式提升视频监控客户端性能,支持更多播放路数。优化方法包括:1) 图像加载时使用SDL_ConvertSurface转换图像格式,避免内存中存在多份拷贝;2) 在VSCode下配置SDL时,合理设置编译器选项和项目架构,减少API调用带来的性能开销;3) 使用SDL库在景嘉微7200显卡上优化渲染性能,提高播放路数。综合考虑图像加载优化、系统特性利用及硬件兼容性,以实现最佳性能。
ly~
794 6

热门文章

最新文章