简介
本序列由澳大利亚的一个游戏引擎爱好者整理制作,使用了前瞻的语言技术,
经常多次的修改制作,一个个小的知识点贯通,非常具有引导学习意义!
Bilibili站转载学习,非个人研究,鸣谢!
原作者Github
Bilibili直达链接
YouTube直达链接
#1、定义事件基类:Event
#2、派生事件:ApplicationEvent
KeyEvent
MouseMovedEvent
#3、简单测试一下
// Event.h
#pragma once
#include "Aurora/Core.h"
#include <string>
#include <functional>
namespace Aurora {
// enum class C++11的强类型枚举
// 多个枚举可以拥有相同的枚举类型
// 简单定义所有相关输入的类型
enum class EventType
{
None = 0,
WindowClose, WindowResize, WindowFocus, WindowLostFocus, WindowMoved,
AppTick, AppUpdate, AppRender,
KeyPressed, KeyReleased,
MouseButtonPressed, MouseButtonReleased, MouseMoved, MouseScrolled
};
// 事件类型
// #define BIT(x) (1 << x) 将数据向右移
enum EventCategory
{
None = 0,
EventCategoryApplication = BIT(0),
EventCategoryInput = BIT(1),
EventCategoryKeyboard = BIT(2),
EventCategoryMouse = BIT(3),
EventCategoryMouseButton = BIT(4)
};
// 宏定义,为避免写重复的代码
// 如果一行写不下,在行末尾添加'\'
// 在宏定义中 '#'是不经拓展的直接替换宏参数 '##'是拓展之后再进行连接
// EventType::##type 编译展开实例(WindowClose):EventType::##WindowClose -> EventType::WindowClose
// \#type 编译直接替换成WindowClose
#define EVENT_CLASS_TYPE(type) static EventType GetStaticType() {
return EventType::##type; } \
virtual EventType GetEventType() const override {
return GetStaticType(); } \
virtual const char* GetName() const override {
return #type; }
// category 不需要替换符进行替换,因为category默认是int类型
// 上面的宏定义的是一种type
#define EVENT_CLASS_CATEGORY(category) virtual int GetCategoryFlags() const override {
return category; }
// 定义事件基类
class AURORA_API Event
{
// 声明改类拥有EventDispatcher的访问权限
friend class EventDispatcher;
public:
// virtual 是C++的虚方法,可以当前实现,可以子类型实现
// 当虚方法后面添加了'=0',这是定义纯虚方法,当前不能实现,必须派生类来实现
// 如果一个方法后面添加 const 表示这个方法不会修改类里面的数据,进行编译优化
virtual EventType GetEventType() const = 0;
virtual const char* GetName() const = 0;
virtual int GetCategoryFlags