SDL系列(四)—— 事件机制

news2024/11/24 7:08:34
事件循环
大多数多媒体程序依靠 事件系统 来处理输入。
SDL 为处理输入事件提供了灵活的 API
本质上, SDL 将来自设备(如键盘,鼠标或控制器)的输入记录为 事件 ,将它们存储在
事件队列 ”中。
您可以将此结构视为等待线 - 事件在线的后面排队并从线的前面取出。
        在您的程序中,您将始终拥有一个 事件(或“游戏”或“主”)循环 来处理这些事件
并根据输入运行您的程序。每次运行事件循环时,必须从事件队列中拉出每个事件(按顺序)
以处理输入。这是通过函数 SDL_PollEvent () 完成的。此函数从队列中删除第一个事件,
将值复制到 SDL_Event 类型的参数中。如果事件队列为空,则该函数将返回 0
轮询事件后,您可以在逻辑链中使用它来推断输入内容和响应方式。
SDL_Event
        SDL_Event 包含任何子事件之一。这可以通过使用联合来实现。 union 描述了结构中的
几个互斥数据成员。这意味着子事件类型都存储在同一个内存中,因此 SDL_Event 可以灵活
而不浪费空间。但是,这个系统使语法稍微笨拙 - 访问子事件数据,首先必须访问 SDL_Event
中的子事件。
退出
        当用户希望关闭程序时, 您的事件循环将收到 SDL_QUIT 类型的事件。这包括按下窗口
上的“ x ”,按 ALT + F4 ,或以其他方式请求程序结束。这不包括结束进程或将 CTRL + C 发送
到控制台 - 这些是不受控制的,立即中止。
        因此,当您的程序收到 SDL_QUIT 事件时,它应该正常关闭(或提示用户提供更多信息)。
事件的类型可通过其“类型”成员访问。
键盘事件
        键盘事件有两种形式 - SDL_KEYDOWN SDL_KEYUP 。这两种类型都与 SDL_KeyboardEvent
相关联,后者包括键码和表示输入事件的标志。
        是否按下/ 释放 / 重复键可以通过 SDL_KeyboardEvent 的状态和重复成员来确定,而键码和修
饰键在 keysym 成员( SDL_Keysym )中指定。
键盘轮询
有一种方法可以在没有事件系统的情况下获得键盘输入。这是通过直接轮询键盘。建议
不要这样做,因为轮询键盘会为您提供当时的状态,而不是自上次轮询以来发生的每个事件
的日志。但是,轮询仍然偶尔会有用,因此 SDL 提供了函数 SDL_GetKeyboardState ()。此
函数返回包含键值的值数组。这个数组是持久的 - 它将在处理键盘事件时更新。
要访问密钥阵列中的数据,可以使用 SDL_Scancode
扫描码类似于 SDL_KeyboardEvent 的键值,而是作为键盘状态数组的索引。
鼠标事件
所有类型的事件都类似于键盘事件,
因为它们具有包含多个描述输入的数据成员的事件类型。
鼠标事件可以是 SDL_ MOUSEMOTION
SDL_ MOUSEBUTTONDOWN SDL_ MOUSEBUTTONUP SDL_ MOUSEWHEEL 类型。
这些类型与 SDL_ MouseButtonEvent SDL_ MouseMotionEvent SDL_ MouseWheelEvent 相关联。所有这些类型都包括鼠标事件的 x y 坐标,以及额外的数据和修饰符。
// 完整示例代码:
#include "stdafx.h"

#include <SDL.h>

#undef main

int main__event2(int, char**)///__event2
{
	SDL_Init(SDL_INIT_EVERYTHING);
	SDL_Window* win = SDL_CreateWindow("yx3sxmeng", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
	SDL_Renderer* renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
	SDL_Surface* surface = SDL_LoadBMP("./Hello_world.bmp");
	SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);

	///1. window-->render(GPU, window),  surface内存信息(bitmap), texture描述信息(render, bitmap|surface);


	///2. SDL事件循环机制 
	bool quit = false;
	SDL_Event ev;
	SDL_Rect rect = { 0,0,800,600 };///目标位置大小(x,y, w,h);
	int sx = 0, sy = 0;
	while (!quit)
	{
		while (SDL_PollEvent(&ev))
		{
			switch (ev.type)
			{
			case SDL_QUIT:
				quit = true;
				break;
			case SDL_MOUSEBUTTONDOWN:
				sx = ev.button.x + rect.x;
				sy = ev.button.y + rect.y;
				break;
			case SDL_MOUSEMOTION:
				if (ev.motion.state & SDL_BUTTON_LMASK)
				{
					rect.x = ev.motion.x - sx;
					rect.y = ev.motion.y - sy;
				}
				break;

			case SDL_KEYDOWN:

				if (ev.key.keysym.sym == SDLK_LEFT)
				{
					rect.x -= 10;
					printf("SDLK_LEFT...");
				}
				else if (ev.key.keysym.sym == SDLK_RIGHT)
				{
					printf("SDLK_RIGHT...");
					rect.x += 10;

				}
				else if (ev.key.keysym.sym == SDLK_UP)
				{
					printf("SDLK_UP...");
					rect.w += 10;
					rect.h += 10;
				}
				else if (ev.key.keysym.sym == SDLK_DOWN)
				{
					printf("SDLK_DOWN...");
					rect.w -= 10;
					rect.h -= 10;
				}
				printf("scancode=%d\n", ev.key.keysym.scancode);
				break;

			case SDL_MOUSEWHEEL:
				if (ev.wheel.y > 0)
				{
					rect.h *= 1.1;
					rect.w *= 1.1;
				}
				if (ev.wheel.y < 0)
				{
					rect.w /= 1.1;
					rect.h /= 1.1;
				}
				break;
			}
		}
		SDL_RenderClear(renderer);
		SDL_RenderCopy(renderer, texture, NULL, &rect);
		SDL_RenderPresent(renderer);
		SDL_Delay(16);
	}

	//释放资源
	SDL_DestroyTexture(texture);
	SDL_DestroyRenderer(renderer);
	SDL_DestroyWindow(win);

	SDL_Quit();
	return 0;
}

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

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

相关文章

3D轻量化引擎HOOPS Communicator在PLM全生命周期管理中的应用

在当今快速发展的工业领域&#xff0c;产品生命周期管理&#xff08;PLM&#xff09;是确保产品从设计到市场再到最终退役过程中信息一致性和流程效率的关键。 随着3D模型的日益复杂化和数据量的不断增长&#xff0c;传统的PLM系统面临着数据管理和渲染效率的挑战。HOOPS Comm…

pandas dataframe 的几种过滤数据的方法

pandas dataframe简介 Pandas是一个用于数据科学的开源Python库。这个库在整个数据科学行业被广泛使用。它是一个快速和非常强大的python工具来执行数据分析。Pandas为我们提供了读取、过滤、检查、操作、分析和绘制数据的命令。它使用内置函数加载以各种文件格式存储的数据&a…

圆片/圆盘测厚设备 HW01-SG系列单点测厚仪

关键字:圆片测厚仪圆盘测厚仪, 圆形测厚仪, 单点测厚仪, 汽车工件测厚仪, 产品简介&#xff1a; 测厚仪采用上下两个对射的激光位移传感器测量圆盘状物体边缘的厚度。圆盘放置在由步进电机驱动的托盘上&#xff0c;点按测量按钮托盘旋转一周&#xff0c;可测量被测物整个圆周上…

三:哈希map day6 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

今日任务 ● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和 今日任务 242.有效的字母异位词 题目 大型概括&#xff1a;map 的使用 1.题目描述-->思路&#xff1a; 给出两个string s,t; …

开放式运动耳机哪款好用?五款高性能值得信赖产品推荐

身为户外运动的达人&#xff0c;我发现开放式运动耳机简直是咱们运动时的最佳拍档&#xff0c;不管是跑步还是健身&#xff0c;开放式运动耳机最为舒适&#xff0c;它的妙处就在于不用塞进耳朵&#xff0c;这样既安全又卫生&#xff0c;户外动起来更放心。但市面上好坏参半&…

SDL系列(一)—— 小白入门

SDL &#xff08; Simple DirectMedia Layer &#xff09; 是一套开放源代码的 跨平台多媒体开发库 &#xff0c;使用 C 语 言写成。 SDL 提供了数种控制图像、声音、输出入的函数&#xff0c;让开发者只要用相同或是相似的 代码就可以开发出 跨多个平台&#xff08; Linu…

线上3D博物馆搭建简单吗?有何优势?有哪些应用场景?

随着科技的飞速发展&#xff0c;传统的博物馆参观方式正在经历一场前所未有的变革&#xff0c;在科技的“加持”下&#xff0c;不少博物馆凭借强大的技术、创意和美学实践&#xff0c;频频“出圈”&#xff0c;线上3D博物馆逐渐崛起&#xff0c;这不仅丰富了人们的文化体验&…

量子计算机接入欧洲最快超算!芬兰加快混合架构算法开发

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;1900字丨7分钟阅读 摘要&#xff1a;芬兰技术研究中心&#xff08;VTT&#xff09;与 CSC 展开合作&#xff0c;基于量子计算机超算架构进行算法开…

年度更新!统信UOS服务器版V20(1070)超越期待

不负广大客户期待&#xff01; 统信UOS服务器版V20&#xff08;1070&#xff09;年度首更 功能更强大、性能更卓越、生态更丰富 助您畅享安全、便捷、高效的产品和服务 新平台&#xff0c;新生态 统信UOS服务器版始终坚持进行生态适配&#xff0c;目前已支持超过百万种兼容…

学习Nginx(五):虚拟主机配置

核心功能 在演示虚拟主机配置之前&#xff0c;来看一下Nginx配置的核心功能说明。 了解配置更多功能&#xff0c;请查看官方说明&#xff1a; http://nginx.org/en/docs/ngx_core_module.html [rootRockyLinux9 conf]# cat nginx.conf # 核心功能&#xff0c;全局配置 # 设置启…

TikTok Shop认知课 打通TK小店全流程

资料 001-先导课.mp4 002-如何用思维导图工具做课程笔记.mp4 003-TTS入驻模式.mp4 004-如何获取店铺.mp4 005-TTS店铺注册全流程,mp4 006-店铺整体运营思路.mp4 007-运营的几个误区.mp4 008-新店起店准备工作,mp4 009-规店铺风控注意事项,mp4 010-店铺基础设置之店铺…

怎么3d立面有些模型不能删除是什么原因怎么解决?---模大狮模型网

在进行3D建模和设计过程中&#xff0c;有时会遇到一些模型无法删除的情况&#xff0c;这可能会导致设计流程受阻&#xff0c;影响工作效率。本文将介绍在3D立面中遇到无法删除模型的原因以及解决方法&#xff0c;帮助您顺利解决这一问题&#xff0c;提高设计效率。 一、模型未正…

第二届视觉语音识别挑战赛 CNVSRC 2024 启动

由 NCMMSC 2024 组委会发起&#xff0c;清华大学、北京邮电大学、海天瑞声、语音之家共同主办的第二届中文连续视觉语音识别挑战赛 CNVSRC 2024 即日启动&#xff0c;诚邀参与报名。 视觉语音识别&#xff0c;也称唇语识别&#xff0c;是一项通过口唇动作来推断发音内容的技术。…

如何在华企盾DSC防泄密系统中设置文件自动加密?

在华企盾DSC系统中设置文件自动加密的过程&#xff0c;简单且用户友好&#xff0c;确保了企业数据的安全&#xff0c;同时不干扰日常工作流程。以下是设置文件自动加密的步骤&#xff1a; 系统安装与配置&#xff1a;确保华企盾DSC数据防泄密系统已经在企业的网络中正确安装和配…

【刷题(3)】双指针

一、双指针问题基础 二、283. 移动零 1 题目 2 解题思路 &#xff08;1&#xff09;遍历数组&#xff0c;把不是零的放到一个新容器中 &#xff08;2&#xff09;遍历结束后&#xff0c;在新容器末尾插入0 &#xff08;3&#xff09;注意&#xff0c;必须在不复制数组的情况…

mobarxtem应用与华为设备端口绑定技术

交换机端口绑定 华为交换机的基础配置与MOBAXTERM终端连接 实验步骤&#xff1a; 一、给每个交换机划分vlan并添加端口 1.单个vlan的划分 2.批量划分vlan 在高端交换机CE6800上批量划分连续编号的VLAN&#xff0c;本例中连续的vlan20到vlan25 [~CE6800]vlan b 20 to 25 3…

使用websocket和服务建立链接慢的原因分析

1、java 项目使用websocketHandler创建websocket服务&#xff0c;在拦截器HttpSessionHandshakeInterceptor中&#xff0c;beforeHandshake日志到的很快&#xff0c;afterHandshake很慢 建立链接一直在连接中 2、原因分析&#xff1a; 找到服务器上的进程名 jps -l 3、使用…

Java开发大厂面试第01讲:String 的特点及其重要的方法都有哪些?

几乎所有的 Java 面试都是以 String 开始的&#xff0c;如果第一个问题没有回答好&#xff0c;则会给面试官留下非常不好的第一印象&#xff0c;而糟糕的第一印象则会直接影响到自己的面试结果&#xff0c;就好像刚破壳的小鹅一样&#xff0c;会把第一眼看到的动物当成自己的母…

处理Mini-ImageNet数据集,用于分类任务

一、Mini-ImageNet数据集介绍 ImageNet 1000类的数据太大了&#xff0c;全部下载大概有100GB左右。 2016年google DeepMind团队从ImagNet数据集中抽取的一小部分&#xff08;大小约3GB&#xff09;制作了Mini-ImageNet数据集&#xff0c;共有100个类别&#xff0c;每个类别有…

人物介绍模板 PSD 源文件免费获取

免费获取 下载链接在最后&#xff01; 下载链接在最后&#xff01; 下载链接在最后&#xff01; 下载链接在最后&#xff01; 下载链接在最后&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1sq3e6djMdZt76Sh_uqVxWg 提取码&#xff1a;naun