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 个字符的字符串:
2109 2
C 语言文件读取全指南:打开、读取、逐行输出
|
算法 数据处理 C++
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
1971 1
|
API C# Windows
Winform控件优化之无边框窗体及其拖动、调整大小和实现最大最小化关闭功能的自定义标题栏效果
Winform中实现无边框窗体只需要设置FormBorderStyle = FormBorderStyle.None,但是无边框下我们需要保留移动窗体、拖拽调整大小、自定义美观好看的标题栏等...
6151 0
Winform控件优化之无边框窗体及其拖动、调整大小和实现最大最小化关闭功能的自定义标题栏效果
|
JSON JavaScript 前端开发
在Vue3项目中,Vite起到的作用及其可以做的事情
Vite是Vue 3项目的关键快速开发服务器和高效的热模块替换(HMR)。它的亮点包括:使用ES模块实现快速启动和动态加载,模块级别HMR提升开发效率,Rollup打包优化生产构建。此外,Vite还支持插件系统、自定义配置、静态资源处理和现代JS特性。通过`npm create vite`可快速搭建Vue项目,配置文件`vite.config.js`可定制行为,`.env`文件管理环境变量。Vite优化了开发与构建流程,提高开发者效率并保证构建性能。
|
机器学习/深度学习 自然语言处理
预训练语言模型:从BERT到GPT,NLP的新纪元
自然语言处理(NLP)近年来因预训练语言模型(PLMs)的崛起而发生巨大变革。BERT和GPT等模型在学术与工业界取得突破性进展。本文探讨PLMs原理、发展历程及其实际应用,涵盖文本分类、命名实体识别、问答系统等场景,并通过实战案例展示如何使用这些强大的工具解决复杂的NLP任务。
SDL基础使用04(SDL_image与SDL_mixer扩展库)
本文介绍了如何使用SDL_image和SDL_mixer扩展库在SDL项目中加载和显示图片以及播放音频文件。
1006 1
|
人工智能 数据可视化 开发者
快速部署 Dify 社区版
Dify.AI 是一款 LLMOps 平台,帮助开发者更简单、更快速地构建 AI 应用。它的核心理念是通过可声明式的 YAML 文件定义 AI 应用的各个方面,包括 Prompt、上下文和插件等。Dify 提供了可视化的 Prompt 编排、运营、数据集管理等功能。这些功能使得开发者能够在数天内完成 AI 应用的开发,或将 LLM 快速集成到现有应用中,并进行持续运营和改进,创造一个真正有价值的 AI 应用。本文介绍使用计算巢快速部署 Dify 社区版。
快速部署 Dify 社区版
|
自然语言处理 API 开发工具
基于LangChain-Chatchat实现的本地知识库的问答应用-快速上手(检索增强生成(RAG)大模型)
基于LangChain-Chatchat实现的本地知识库的问答应用-快速上手(检索增强生成(RAG)大模型)
基于LangChain-Chatchat实现的本地知识库的问答应用-快速上手(检索增强生成(RAG)大模型)
|
存储 数据可视化 大数据
大数据平台架构设计与实施
【7月更文挑战第3天】本文探讨了大数据平台的关键技术,包括数据采集(如Kafka、Flume)、存储(HDFS、HBase、Cassandra)、处理(Hadoop、Spark)、分析挖掘及可视化工具。架构设计涉及数据收集、存储、处理、分析和应用层,强调各层次的协同与扩展性。实施步骤涵盖需求分析、技术选型、架构设计、系统部署、数据迁移、应用开发测试及上线运维,旨在为企业决策提供强有力的数据支持。
1409 3
|
Linux
Linux下rz/sz安装及使用方法 (不需要借助ftp传输工具)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/81606337   一、工具说明       在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件. 对于某些linux版本, rz/sz默认没有安装所以需要手工安装。
2853 0

热门文章

最新文章