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部门及以下数据权限 -…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...