SDL2笔记

SDL2基本操作

      • 头文件
      • 主函数
      • 初始化
      • 创建窗口
      • 窗口暂停以及事件讲解
      • 销毁窗口(释放指针)并退出
      • 加载bmp图片
      • 新加载图片的方法(使用渲染、纹理)
      • 加载其他格式的图片

头文件

#include "SDL.h"
#include "SDL_image.h"

主函数

int main(int argc,char* argv[])  //一定要写成这种含参数形式
{
}

初始化

使用SDL_Init(参数),参数表示整个游戏可以播放动画和声音等,可以只填一个,但是一定要有参数。

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); 

创建窗口

采用SDL_Window类型的指针来创建,使用SDL_CreateWindow(const char *title, int x, int y, int w,int h, Uint32 flags)函数来创建窗口。
函数参数意义依次为:

  • 窗口标题
  • 窗口显示在屏幕的位置(x,y),x和y可以让系统来设置,可以写成SDL_WINDOWPOS_UNDEFINED和SDL_WINDOWPOS_UNDEFINED
  • 窗口的大小(w,h)
  • 以什么样的方式显示窗口,如SDL_WINDOW_SHOWN(直接显示),SDL_WINDOW_FULLSCREEN(全屏显示)

代码如下:

SDL_Window* window = SDL_CreateWindow("Asuna",100,100,800,600,SDL_WINDOW_SHOWN);

窗口暂停以及事件讲解

代码如下:

//方法1
SDL_Delay(3000); //窗口停留3000秒
//方法2
system("pause");//一直暂停窗口,知道输入其他键才消失
//方法3,使用事件弄一个循环
SDL_Event event;
bool quit=false;
while (quit==false)
{ /*用SDL_PollEvent(&event)来检测是否有事件,用SDL_Event的实例属性event.type来获取事件。*/while (SDL_PollEvent(&event))  //当触发事件时候执行该循环,没有事件的时候就暂停,这样做的目的是可以减少使用更多的内存和cpu消耗{if (event.type==SDL_QUIT) //窗口操作的事件,当点击窗口右上角关闭按钮的时候就执行if{quit=true;//使用exit(0)是退出程序,这样有个缺点,就是可能有之前创建的内存没有释放}else if (event.type==SDL_MOUSEBUTTONDOWN) //鼠标事件,当在窗口内点击鼠标的时候触发。{if (event.button.button==SDL_BUTTON_LEFT) //点击鼠标左键的时候执行该代码{}else if(event.button.button==SDL_BUTTON_RIGHT) //点击鼠标右键的时候执行该代码{}}else if (event.type == SDL_KEYDOWN) //键盘事件,当输入任意键时触发。{if (event.key.keysym.sym==SDLK_UP) //如果按下的键是上就执行代码,左侧用来接收用户按下的键{}	}}
}

销毁窗口(释放指针)并退出

程序最后需要执行的代码。代码如下:

SDL_DestroyWindow(window); //销毁窗口
SDL_Quit(); //以最安全的方式退出

加载bmp图片

加载图片相当于在窗口表面覆盖上一张贴图,SDL2默认支持加载bmp格式的图片,注意图片的大小要比窗口小。步骤如下:
1.使用SDL_Surface类型的指针通过SDL_GetWindowSurface()函数获得到窗口的表面。
2.再创建一个SDL_Surface类型的指针接收SDL_LoadBMP()函数加载的图片。
3.贴图之前要清除原来的图,不然之前的图还会呈现在窗口内
4.使用SDL_BlitSurface()函数把图片贴到窗口表面。
第一个参数是图片。
第二个参数是以一个点切割图片,取右下角图片。参数形式和参数四一样(NULL默认不切割)
第三个参数是窗口。
第四个参数表示把图片贴到窗口的哪个位置(NULL为贴到左上角),使用结构体SDL_RECT类型,创建一个实例,该结构体有两个属性x,y代表贴的位置,然后对其赋值,再将实例作为实参传给第四个参数(需要指针,所以需要加&取地址)。代码如下:

	SDL_Rect rect;rect.x = 100;rect.y = 100;

5.刷新窗口
加载图片详细代码如下:

	SDL_Surface* surface = SDL_GetWindowSurface(window);//记住最后需要释放,使用SDL_FreeSurface()函数。SDL_Surface* image = SDL_LoadBMP("1.bmp");//此处为相对路径,也就是放在和代码同一个文件夹中SDL_FillRect(surface, NULL, 0);//清除原来的图,但是程序大的话鼠标会闪屏,第一个参数表示在哪画一个矩形(NULL表示整个屏幕),第二个参数表示要填充的地方,第三个参数表示颜色SDL_BlitSurface(image,NULL,surface,&rect);//贴完之后刷新窗口SDL_UpdateWindowSurface(window)

当程序大或者电脑差的时候,用这种方法会发生鼠标指针一闪一闪的问题,原因是每次更新屏幕时都是通过SDL_FillRect()在屏幕上画了一个很大的矩形,然后把原来的屏幕覆盖掉了。为了解决这个问题,引入了render(渲染)来更新屏幕。

新加载图片的方法(使用渲染、纹理)

1.先对窗口进行渲染(使用renderer),得到rend,以后都用rend代替窗口。
2.再把图片转换成纹理才能贴到rend上
3.创建一个矩形,也就是要贴的大小位置等
4.每次贴之前先清空rend
5.把img贴到rend上
6.显示贴完之后的rend

SDL_Window* window = SDL_CreateWindow("Asuna", 100, 100, 800, 600, SDL_WINDOW_SHOWN);
//1.渲染,以后用rend来代表window
SDL_Renderer* rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Surface* image = SDL_LoadBMP("1.bmp");
//2.要先把surface转换成纹理(材质)才能贴到rend上
SDL_Texture* img = SDL_CreateTextureFromSurface(rend, image);
//3.创建矩形
SDL_Rect rect;
rect.x = 100;
rect.y = 100;
rect.h = image->h;
rect.w = image->w;
//4.每次贴之前先清空rend
SDL_RenderClear(rend);
//5.把img贴到rend上
SDL_RenderCopy(rend, img, NULL, &rect);//第三个参数同样是对图片进行分割
//6.显示贴完之后的rend
SDL_RenderPresent(rend);

加载其他格式的图片

使用来自SDL_image.h库的IMG_Load()函数,其他和加载bmp格式的图片一样,改一下获取图片的函数就可以了。

SDL_Surface* image1 = IMG_Load("yui.png");

通用模板代码如下:

#include <iostream>
#include "SDL.h"
#include "SDL_image.h"
using namespace std;int main(int argc, char* argv[])
{SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);SDL_Window* window = SDL_CreateWindow("Asuna", 100, 100, 800, 600, SDL_WINDOW_SHOWN);//渲染之后,用rend来代表windowSDL_Renderer* rend = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);SDL_RenderClear(rend); //清空掉窗口SDL_Surface* image = SDL_LoadBMP("1.bmp");//此处为相对路径,也就是放在和代码同一个文件夹中//要先把surface转换成纹理(材质)才能贴到rend上SDL_Texture* img = SDL_CreateTextureFromSurface(rend, image);SDL_Rect rect;rect.x = 100;rect.y = 100;rect.h = image->h;rect.w = image->w;SDL_Event event;bool quit = false;while (quit == false){ /*用SDL_PollEvent(&event)来检测是否有事件,用SDL_Event的实例属性event.type来获取事件。*/while (SDL_PollEvent(&event))  //当触发事件时候执行该循环,没有事件的时候就暂停,这样做的目的是可以减少使用更多的内存和cpu消耗{if (event.type == SDL_QUIT) //窗口操作的事件,当点击窗口右上角关闭按钮的时候就执行if{quit = true;//使用exit(0)是退出程序,这样有个缺点,就是可能有之前创建的内存没有释放}else if (event.type == SDL_MOUSEMOTION){//每次贴之前先清空rendSDL_RenderClear(rend);//把img贴到rend上SDL_RenderCopy(rend, img, NULL, &rect);}}SDL_Delay(5); //闪屏速度,越低越快。可以降低cpu使用率//显示贴完之后的rendSDL_RenderPresent(rend);}SDL_DestroyWindow(window); //销毁窗口SDL_Quit(); //以最安全的方式退出return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统时间片轮换_《操作系统_时间片轮转RR进程调度算法》

转自:https://blog.csdn.net/houchaoqun_xmu/article/details/55540250时间片轮转RR进程调度算法一、概念介绍和案例解析时间片轮转法 - 基本原理&#xff1a;在早期的时间片轮转法中&#xff0c;系统将所有的就绪进程按先来先服务的原则排成一个队列&#xff0c;每次调度时&am…

java ee打印功能_Java EE 8的前5个新功能

java ee打印功能备受期待的Java Enterprise Edition 8版本具有两个令人兴奋的新API&#xff08;JSON绑定1.0和Java EE Security 1.0&#xff09;&#xff0c;并且对当前API进行了改进&#xff08;JAX-RS 2.1&#xff0c;Bean Validation 2.0&#xff0c;JSF 2.3&#xff0c;CDI…

SDL2事件笔记

SDL2事件窗口关闭的事件&#xff1a;鼠标事件鼠标点击事件鼠标移动事件键盘事件用SDL_PollEvent(&event)来检测是否有事件&#xff0c;用SDL_Event的实例属性event.type来获取事件。 窗口关闭的事件&#xff1a; SDL_QUIT鼠标事件 鼠标点击事件 鼠标点击事件&#xff1…

什么是复数

我们把形如 zabi&#xff08;a、b均为实数&#xff09;的数称为复数。其中&#xff0c;a 称为实部&#xff0c;b 称为虚部&#xff0c;i 称为虚数单位。当 z 的虚部 b&#xff1d;0 时&#xff0c;则 z 为实数&#xff1b;当 z 的虚部 b≠0 时&#xff0c;实部 a&#xff1d;0 …

qnx 设备驱动开发_QNX驱动开发——应用层与resource manger交互 | 学步园

QNX操作系统是一个类Unix实时操作系统&#xff0c;遵从POSIX规范&#xff0c;驱动程序具有良好的可移植性。编写任何驱动程序都会遇到同样的一个问题&#xff1a;应用程序与驱动程序之间是如何进行交互的。其实这个问题很简单&#xff0c;QNX有大量资料说明这一点。当客户端调用…

spring api层打包_Spring项目的按层打包已过时

spring api层打包我认为Spring应用程序不应该以逐层方法构造。 在我看来&#xff0c;按功能打包更有意义。 首先&#xff0c;让我简要描述每种方法。 “按层打包”&#xff08;在非Java世界中为“按类型折叠”&#xff09; 该项目结构根据源代码文件所属的体系结构层将其分为…

C++ Primer(第五版)第七章 类 部分答案

第七章 类练习7.2练习7.3练习7.4练习7.6练习7.7练习7.9练习7.14、7.15、7.22练习7.23、7.24、7.26练习7.27练习7.2 曾在 2.6.2 节的练习&#xff08;第 76 页&#xff09;中编写了一个 Sales_data类&#xff0c;请向这个类添加 combine 和 isbn 成员。 创建头文件sales.h #ifn…

arpanet(阿帕网)

“阿帕”&#xff08;ARPA&#xff09;&#xff0c;是美国高级研究计划署&#xff08;Advanced Research Project Agency&#xff09;的简称。他的核心机构之一是信息处理技术办公室&#xff08;IPTO Information Processing Techniques Office&#xff09;&#xff0c;一直在关…

mongodb数据库淘汰_mongodb 内存数据淘汰策略

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼About MongoMongoDB uses memory mapped files.This means the the operating system essentially controls what is paged in and out of memory (to and from disk).The RulesIf your indexes working set exceed memory, the l…

Markdown常用转义字符

如果字符无法正常输出&#xff0c;则在前面加\试试。 空格&#xff1a; 数学公式 数学公式要使用$$&#xff0c;需将公式放在两个$中间。 下标: _上标: ^分数&#xff1a;方法1&#xff1a;\frac{分子}{分母} 方法2&#xff1a;分子 \over 分母 对于\frac的方法…

互联网工程任务组(IETF)

国际互联网工程任务组&#xff08;The Internet Engineering Task Force&#xff0c;简称 IETF&#xff09;是一个公开性质的大型民间国际团体&#xff0c;汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和研究人员&#xff0c;并欢迎所有对此行业感兴趣…

javafx 打印控件_Java的新视差控件(JavaFX)

javafx 打印控件介绍 视差是一种视觉效果&#xff0c;您可以组合以不同速度移动的两个分层图像以获得深度感。 想想一下&#xff0c;当您在道路上行驶时&#xff0c;您会看到附近的树木在快速移动&#xff0c;而距离较远的树木将沿同一方向移动但速度较慢&#xff0c;结果是您…

beoplay耳机序列号查询_BOSE耳机序列号如何查询?

展开全部 大多数序列号可在产品的背面或底部找到,一般位于条形码旁。e69da5e6ba903231313335323631343130323136353331333431363532序列号长度为 17 位(还有一些耳机是 4 位),可包含字母和数字。 另外,与 Bose Connect 应用程序兼容的产品将在应用程序的设置和gt; 产品信息下…

编译原理总概述笔记

编译原理编译原理程序设计语言分类翻译编译解释编译的转换过程两阶段的转换三阶段的转换编译程序的工作词法分析语法分析中间代码生成优化目标代码生成表格与表格管理出错处理语句翻译实例过程编写编译程序方式编译原理 是介绍高级程序设计语言变换成计算机硬件所能识别的机器…

RFC(一系列以编号排定的文件)

Request For Comments&#xff08;RFC&#xff09;&#xff0c;是一系列以编号排定的文件。文件收集了有关互联网相关信息&#xff0c;以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society&#xff08;ISOC&#xff09;赞助发行。基本的互联网通信协议都有在RFC文件内…

deprecated_使用Java的@Deprecated前瞻

deprecated我偶尔会遇到一种情况&#xff0c;我需要引入新的API或构造以供其他人试用&#xff0c;但是我知道在使用某些API后&#xff0c;它可能会根据其他人的反馈而改变。 在这种情况下&#xff0c;我想以某种方式注释该构造&#xff0c;以警告其他开发人员此新添加的构造的暂…

fusionsphere的核心组件_FusionSphere架构详解

FusionSphere架构详解关键字&#xff1a;云计算XEN Hypervisor FusionSphere摘要&#xff1a;本技术案例主要针对Huawei FusionSphere云计算软件架构进行深入分析&#xff0c;总结概括出我们的FusionSphere云计算产品技术及课程内容中的关键点&#xff0c;为产品技术学习和云计…

将py文件打包成exe可执行文件

使用pyinstaller库即可将py文件打包成exe文件 安装pyinstaller库 pip install pyinstaller将py文件打包成exe文件 1.首先进入cmd&#xff0c;用cd命令定位到要打包的py文件所在的文件夹 2.使用以下命令打包py文件 pyintaller -F xxx.py #xxx.py就是要打包的文件之后会生成…

文件的 MD5 签名介绍

在 RFC1321 中有 MD5 的详细描述。简单的说&#xff0c;MD5 根据文件的内容用算法产生一个唯一的128位签名&#xff0c;用任何方法改变文件都会导致签名改变。尽管人们一直在讨论修改文件后能保持签名不变的理论可能性&#xff0c;但截止到目前还没有人能够做到。所以在文件使用…

apache.camel_Apache Camel 2.21发布–新增功能

apache.camel我们刚刚发布了Apache Camel 2.21&#xff0c;我将在此博客中重点介绍值得注意的更改。 此版本不支持Spring Boot2。对Spring Boot 2的支持将在Camel 2.22中提供&#xff0c; 我们计划在2018年夏季之前发布。 1&#xff09;处理大型JMS消息 我们在JMS组件中添加了…