Hazel游戏引擎(012)GLFW窗口事件
文中若有代码、术语等错误,欢迎指正
文章目录
- 前言
- 如何确定GLFW窗口事件的回调函数参数
- Application接收事件回调流程
- 原项目流程(12345)
- 自己写的简单Demo与流程(123)
前言
-
此节目的
为了完成008计划窗口事件的接收glfw窗口事件以及回调部分
-
此节要完成
使用glfw函数可以设置(拦截)真正窗口事件的回调函数,在回调函数中转换为我们自定义的事件,再回调给Application的OnEvent,OnEvent拦截对应的事件
-
图示部分

图中是将Appilication的事件给Layer去处理,但本节是Application自己拦截事件并处理,修改后的图如下

如何确定GLFW窗口事件的回调函数参数
-
引出
glfwSetKeyCallback(m_Window, [](GLFWwindow* window, int key, int scancode, int action, int mods)如上代码,用lambda接收GLFW按键事件,可是为什么能确定lambda的参数
-
需要ctrl+左键点开glfwSetKeyCallback

Application接收事件回调流程
原项目流程(12345)
对应第二张图按照1、2、3、4、5顺序
-
Application
#include "hzpch.h" #include "Application.h" #include "Hazel/Log.h" #include <GLFW/glfw3.h> namespace Hazel {#define BIND_EVENT_FN(x) std::bind(&Application::x, this, std::placeholders::_1)Application::Application(){// 1.1Application创建窗口m_Window = std::unique_ptr<Window>(Window::Create());// 1.2Application设置窗口事件的回调函数m_Window->SetEventCallback(BIND_EVENT_FN(OnEvent));}// 回调glfw窗口事件的函数void Application::OnEvent(Event& e){// 4.用事件调度器,拦截自己层想要拦截的事件并处理EventDispatcher dispatcher(e);dispatcher.Dispatch<WindowCloseEvent>(BIND_EVENT_FN(OnWindowClose));HZ_CORE_TRACE("{0}", e);}void Application::Run(){while (m_Running){glClearColor(1, 0, 1, 1);glClear(GL_COLOR_BUFFER_BIT);m_Window->OnUpdate(); // 更新glfw}}// 5.执行Application的OnWinClose函数拦截处理event事件bool Application::OnWindowClose(WindowCloseEvent& e){m_Running = false;return true;} } -
WindowsWindow.cpp
// 2.1window创建窗口 m_Window = glfwCreateWindow((int)props.Width, (int)props.Height, m_Data.Title.c_str(), nullptr, nullptr); // 设置glfw当前的上下文 glfwMakeContextCurrent(m_Window); /*设置窗口关联的用户数据指针。这里GLFW仅做存储,不做任何的特殊处理和应用。window表示操作的窗口句柄。pointer表示用户数据指针。 */ glfwSetWindowUserPointer(m_Window, &m_Data); SetVSync(true); // 2.2设置glfw事件回调=接收glfw窗口事件 glfwSetWindowSizeCallback(m_Window, [](GLFWwindow* window, int width, int height){// glfwGetWindowUserPointer获取void*指针可以转换为由glfwSetWindowUserPointer自定义数据类型,WindowData& data = *(WindowData*)glfwGetWindowUserPointer(window);data.Width = width;data.Height = height;// 2.3将glfw窗口事件转换为自定义的事件WindowResizeEvent event(width, height);// 3.回调Application的OnEvent函数,并将事件作为其OnEvent的参数data.EventCallback(event); }); -
效果

自己写的简单Demo与流程(123)
对应第二张图的1、2、3步(少了4、5步,可以回到009.事件系统-自定义事件细看整个事件系统的设计与流程)
#include <iostream>
#include <string>
#include <functional>
using namespace std;
using namespace std::placeholders;// 占位符空间// 事件类定义//
class Event { // 事件基类
public:virtual void Say() { cout << "Event::Say()" << endl; }bool m_Handled; // 事件是否处理完
};
class WindowCloseEvent : public Event { // 窗口关闭事件子类
public:virtual void Say() { cout << "WindowEvent::Say()" << endl;}
};// 窗口类定义//
class Window {
public:using EventCallbackFn = std::function<void(Event&)>; // 声明function类型void function(Event&)static Window* CreateWindow() { // 模拟创建窗口return new Window;}void SetEventCallback(const EventCallbackFn& callback) {EventCallback = callback; // 绑定Application::OnEvent}void SendEvent() {cout << "Window::模拟glfw窗口事件" << endl;// 2.将glfw窗口事件封装成自己系统的事件WindowCloseEvent windowe;// 3.回调Application的OnEvent函数,并将事件作为其OnEvent的参数EventCallback(windowe);}EventCallbackFn EventCallback; // 定义function
};// 应用层类定义//
class Application {
public:Window* win; // 持有的窗口类void OnEvent(Event& event) {event.Say();cout << "Application::OnEvent(Event& event)" << endl;// 4.Application的OnEvent,将事件传递给Application的所有Layer层的OnEvent// ......}
};
int main() {Application app;// 1.1Application对象创建窗口类,窗口类初始化了glfw窗口app.win = Window::CreateWindow();// 1.2Application设置窗口事件的回调函数app.win->SetEventCallback(bind(&Application::OnEvent, app, _1));// bind的argument1是函数地址,arug2是哪个类,arug3是调用OnEvent的参数// 1.3模拟glfw窗口事件app.win->SendEvent();return 0;
}

少了Application自己拦截处理事件
相关文章:
Hazel游戏引擎(012)GLFW窗口事件
文中若有代码、术语等错误,欢迎指正 文章目录 前言如何确定GLFW窗口事件的回调函数参数Application接收事件回调流程原项目流程(12345)自己写的简单Demo与流程(123) 前言 此节目的 为了完成008计划窗口事件的接收glfw窗口事件以及回调部分 此节要完成 使用glfw函数…...
Nenu算法复习第六章
目录 补充知识点 1160: 6001 第几天? 1161: 6002 时间格式转换 1162: 6003 星期几? 1163: 6004 18岁生日、 补充知识点 闰年的判断方法: 能被四整除但是不能一百整除或者能被400整除 例题: 题目描述 经常会有人问你怎么判断闰年&…...
知识付费社群:最好的知识传播方式
知识付费是一种网络内容付费方式,它让知识传播者通过网络以付费的方式向社会大众或特定平台传递知识、技能和智力资源。 知识付费传播的成功离不开用户,他们是核心节点,也是受众和粉丝的重要组成部分。用户不仅可以生产和传播知识࿰…...
局域网内不同网段的设备互相连接设置
目录 介绍1、打开网络连接,找到本地网络->属性->ipv4->属性->高级:2、在高级设置页面,我们添加一个IP,这个IP和板子在一个网段,我这里设置的是192.168.253.101:3、设置完成即可生效,…...
LVS+Keepalived 群集
目录 一、keepalived概述 1.keepalived工作原理 2.keepalived体系主要模块及其作用 3.判断服务器主备,及如何配置浮动IP 二、keepalived的抢占与非抢占模式 三、部署LVSkeepalived 1.配置负载调度器(主备相同) 1.1配置keepalived&…...
windows系统cmd命令设置别名,并添加到环境变量
众所周知,Linux 命令很强大,使用起来也很方便,但是想在 windows 系统上使用 Linux 命令有些困难,要么下载第三方终端工具,要么就是安装一系列命令环境。 作为一个前端开发,其实可以全局安装一下 npm 命令行…...
智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)
智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机) 目录 智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 Matlab实现GWO-SVM灰狼算法优化支持向量机的多输…...
java方法
文章目录 一、java方法总结 一、java方法 在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢? println() 是一个方法。 System 是系统类。 out 是标准输出对象。这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法 pr…...
LabVIEW与Space Wire配合开发
LabVIEW与Space Wire配合开发 Space Wire是欧洲航天局开发的一种高速、点对点、全双工的串行总线网络,以IEEE1355-1995和LVDS 两个商业标准为基础,汲取了1394技术、ATM技术、以太网技术的优点,同时考虑了空间应用的特点,在故障检…...
开始使用chat-gpt4
目录 一、说明 二、安装步骤 三、测试效果咋样 (1)写代码能力 (2)回答问题能力 (3)写作能力 一、说明 参考(非常感谢这位博主的分享):http://t.csdn.cn/qypw9 注意&…...
算法之贪心算法
定义 总是做出当前最好的选择,期望通过局部最优选择得到全局最优的解决方案。 适用标准 贪心选择性质。 原问题的整体最优解可以通过一系列局部最优的选择得到。这种选择依赖于已做出的选择,不依赖于未做出的选择。贪心算法解决的问题,在程…...
Maven 基础
博文目录 文章目录 Maven基础概念生命周期 - Build Lifecycle阶段 - Build Phase目标 - Plugin goals默认目标绑定Clean 生命周期Default 生命周期Site 生命周期 插件 - Plugin POM(Project Object Model)Super POM项目继承 - Project Inheritance项目聚…...
算法刷题-哈希表-两数之和
两数之和 1. 两数之和思路总结其他语言版本 1. 两数之和 力扣题目链接 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中…...
kotlin学习(一)基本概念、数据对象类型、控制流程、空值检验、类与接口
文章目录 认识Kotlin跨平台特性语言类型java的语言类型kotlin的运行原理 hello world 基本概念程序入口数据与对象类型 和 显式数字转换浮点类型位运算AnyUnitNothing 声明变量只读变量 val与可变变量var查看Kotlin字节码 fun(方法 / 函数)函数参数默认值…...
【Linux】Docker部署镜像环境 (持续更新ing)
防火墙 1、查看防火墙状态 sudo systemctl status ufw 2、开启防火墙 sudo systemctl start ufw 3、关闭防火墙 sudo systemctl stop ufw 4、开机禁止开启防火墙 sudo systemctl disabled ufw 5、开启自启防火墙 sudo systemctl enabled ufw Elasticsearch 1、安装指定版本 比…...
Jtti:如何打开云服务器的8082端口
如何打开云服务器的8082端口? 第一步:登录云服务器 首先,我们需要登录到我们的云服务器。可以使用SSH、控制台等方式进行登录。登录成功后,我们可以在终端上看到服务器的控制台。 第二步:编辑防火墙规则 打开终端后,我…...
有关 string 类的练习(下)
目录 一、反转字符串 II 二、反转字符串中的单词 III 三、找出字符串中第一个只出现一次的字符 四、字符串相乘 五、把字符串转换成整数 一、反转字符串 II 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转…...
XuperChain搭建+报错+注意事项
安装依赖 golang 这里安装的是15-17版本 wget -c https://dl.google.com/go/go1.15.2.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local 添加环境变量 这个可以通过添加下面的行到/etc/profile文件(系统范围内安装)或者$HOME/.profile文件(当前用户安装 vim /etc…...
【伏羲八卦图】(PythonMatlab实现)
目录 1 与达尔文对话 2 与老子对话 2.1 Python实现 2.2 Matlab实现 1 与达尔文对话 140年前,1858年7月1日,达尔文在英伦岛发表了自己有关自然选择的杰出论文。他提出,生物的发展规律是物竞天择。经过物竞,自然界选择并存留最具…...
ruoyi数据权限学习
思路 用户关联了角色(用户可以关联多个角色),给角色设置数据权限分类,数据权限分类有如下5种: 全部数据权限 - DATA_SCOPE_ALL自定数据权限 - DATA_SCOPE_CUSTOM部门数据权限 - DATA_SCOPE_DEPT部门及以下数据权限 -…...
CasRel模型实战:从Git仓库提交信息中抽取开发者协作关系
CasRel模型实战:从Git仓库提交信息中抽取开发者协作关系 你有没有想过,一个活跃的Git仓库里,每天产生的那些提交信息和评论,除了记录代码变更,还隐藏着什么秘密?那些看似枯燥的“fix bug”、“add feature…...
BM62S2301-1热式风速传感器原理与Arduino驱动深度解析
1. BM62S2301-1 数字风速传感器深度技术解析BM62S2301-1 是由 Best Modules 公司推出的高精度数字风速传感器模块,专为工业环境监测、HVAC 系统控制、气象站及智能农业通风系统等场景设计。该器件采用热式风速测量原理(Hot-Wire Anemometry)&…...
TradingAgents-CN:基于辩论机制的多智能体金融决策系统技术实现
TradingAgents-CN:基于辩论机制的多智能体金融决策系统技术实现 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 在复杂的金融市场中&…...
为什么你的Llama3本地推理延迟高达8s?——深入CUDA Graph、PagedAttention与vLLM动态批处理的3层性能压测对比报告
第一章:Python 大模型推理本地私有化部署方案在数据安全与合规性要求日益严格的背景下,将大语言模型(LLM)推理能力完全私有化部署于本地环境已成为金融、政务、医疗等关键行业的刚需。本章聚焦基于 Python 生态的轻量级、可复现、…...
windows11安装Rust教程:从下载到环境配置
今天研究了一下构建跨平台桌面应用程序的框架Tauri,需要安装Rust环境,记录一下安装教程,防止遗忘。 第一步 前往 官网 下载适用于Windows的安装程序,根据你的电脑选择合适的版本下载。 下载成功后的rustup-init.exe:…...
OpenClaw权限精细化管控:百川2-13B模型下的文件访问黑白名单
OpenClaw权限精细化管控:百川2-13B模型下的文件访问黑白名单 1. 为什么需要权限管控? 上周我差点经历一场"数字灾难"。当时我正在用OpenClaw自动整理项目文档,这个AI助手突然开始删除我硬盘里的"临时文件"——而那里存…...
PyTorch广播机制详解:为什么你的张量运算突然报错?
PyTorch广播机制详解:为什么你的张量运算突然报错? 在深度学习项目中,张量运算的维度匹配问题就像编程中的"指针错误"一样令人头疼。当你信心满满地运行一个看似简单的矩阵乘法时,突然跳出的RuntimeError: The size of …...
TSmaster曲线窗口操作全攻略:从添加变量到XY轴调整(附实战技巧)
TSMaster曲线窗口操作全攻略:从添加变量到XY轴调整(附实战技巧) 在汽车电子、工业控制等领域的测试测量场景中,TSMaster作为一款专业的诊断与测试工具,其曲线窗口(Graphic)功能是数据分析的核心…...
Android开发者必看:SELinux权限问题排查与实战解决方案(附日志分析技巧)
Android开发者实战:SELinux权限问题深度排查与高效解决方案 在Android系统开发过程中,SELinux权限问题就像一道无形的墙,常常让开发者陷入"明明有root权限却无法操作"的困境。作为一名长期奋战在Android系统定制一线的开发者&#…...
Lingbot-Depth-Pretrain-Vit-VitL-14模型部署避坑指南:常见错误403 Forbidden等排查
Lingbot-Depth-Pretrain-Vit-VitL-14模型部署避坑指南:常见错误403 Forbidden等排查 最近在帮几个朋友部署Lingbot-Depth-Pretrain-VitL-14这个深度估计模型时,发现大家踩的坑都差不多。尤其是那个让人头疼的“403 Forbidden”错误,还有各种…...
