事件,我们在生活中时时在产生事件并且做出响应,如早晨出门时,看见外面下雨了,这时候我们需要带把伞等情况!

在现实生活之中事件分为人为事件和自然事件,那么在计算机操作系统中也不例外,存在两种事件

1.人为事件:自定义事件等(如游戏引擎中节点推动节点产生的一系列事件)

2.系统事件:计算器内部触发的事件(如键盘、鼠标等事件)

一、简单事件处理方案

网络上也可以看到很多文章说到被观察者和观察者,

小白:啊!大神,我是小白,不懂,说的是什么外星语

小白别急,一步一步咱们开始深入学习,先来看一张简单的图:

触发者一但发生事件则触发,就通知接收者进行响应,要想达到这个条件,那么必须要接收者给触发者一个联系方式,编程中叫回调函数,只要我们给触发者一个回调函数的地址,那么触发者有事件时就可以调用这个回调函数了,相当于给了个接口(联系方式),例如[接收者]给[触发者]一个电话号码一样,[触发者]有事情找[接收者]了,那么直接拨打这个电话号码就可以联系到[接收者]一样的道理!

那么我们就可以推出另外一张图了,如下:

如上图中显示,那么在实际应用当中,触发者和接收者太多太多,那么每个触发者都保存接收者的联系方式,这样的负担太重,例如上图中,【B接收者】假如产生了一个事件,【A接收者】对【B接收者】这个事件感兴趣,那么这个简单模型中,【B接收者】又需要保存【A接收者】的联系方式,越来越复杂了!

二、添加中间者【派发者】

为了更好地管理派送中心,仅仅联系方式还是显得有些简陋,我们在加上一个事件类型,这样更容易区别事件!

编辑中。。。。

#include <string>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
#include <windows.h> enum class EventType
{
NON = 1,
KEY_BOARD, // 键盘
MOUSE // 鼠标
};
// 监听者、观察者基类
class EventListener
{
public:
EventListener():m_Type(EventType::NON){ } virtual EventType getType() { return m_Type; } virtual void update() = 0;
protected:
EventType m_Type;
}; // [举例一]键盘事件
class KeyListener : public EventListener
{
public:
KeyListener()
{
this->m_Type = EventType::KEY_BOARD;
} virtual void update() override
{
cout << "KeyListener upDate()" << endl;
} };
// [举例二]键盘事件
class MouseListener : public EventListener
{
public:
MouseListener()
{
this->m_Type = EventType::MOUSE;
} virtual void update() override
{
cout << "MouseListener upDate()" << endl;
} }; // 派送中心
class EventDispatch
{
public:
EventDispatch() {
// 创建EventListener*数组并添加到map中
vector<EventListener*> *vec1 = new vector<EventListener *>();
vec1->reserve(20);
vector<EventListener*> *vec2 = new vector<EventListener *>();
vec2->reserve(20);
map_type_listener.insert(pair<EventType,
vector<EventListener*>*>(EventType::KEY_BOARD, vec1));
map_type_listener.insert(pair<EventType,
vector<EventListener*>*>(EventType::MOUSE, vec2));
} void addListener(EventListener* e)
{
map<EventType, vector<EventListener*>*>::iterator iter; if (e->getType() == EventType::KEY_BOARD)
{
iter = map_type_listener.find(EventType::KEY_BOARD);
//if (iter == map_type_listener.end()){
// vector<EventListener*> *vec1 = new vector<EventListener *>();
// map_type_listener.insert(pair<EventType,
// vector<EventListener*>*>(EventType::KEY_BOARD, vec1));
//}
}else if (e->getType() == EventType::MOUSE)
{
iter = map_type_listener.find(EventType::MOUSE);
//if (iter == map_type_listener.end()) {
// vector<EventListener*> *vec2 = new vector<EventListener *>();
// map_type_listener.insert(pair<EventType,
// vector<EventListener*>*>(EventType::MOUSE, vec2));
//}
}
vector<EventListener*>* eListener = iter->second;
eListener->push_back(e);
} void dispatch()
{
map<EventType, vector<EventListener*>*>::iterator iter;
for (iter = map_type_listener.begin(); iter != map_type_listener.end(); iter++)
{
vector<EventListener*>* eListener = iter->second;
vector<EventListener*>::iterator it = eListener->begin();
for (it; it != eListener->end(); it++)
{
// 更新状态
(*it)->update();
}
}
}
private:
// map[key:事件类型 value:EventListener*数组的指针]
map<EventType, vector<EventListener*>*> map_type_listener;
}; // 游戏节点
class GameNode
{
public:
GameNode(EventDispatch* pEventDispatch):m_pEventDispatch(pEventDispatch){} public:
EventDispatch* m_pEventDispatch;
}; EventDispatch dis;
int main()
{
KeyListener kListener;
MouseListener mListener;
GameNode node(&dis); // 添加键盘监听事件
node.m_pEventDispatch->addListener(&kListener);
// 添加鼠标监听事件
node.m_pEventDispatch->addListener(&mListener); while (true)
{
//dis.dispatch();
node.m_pEventDispatch->dispatch();
Sleep(5000);
} system("pause");
return 0;
}

Java事件通知模型:

1.有事件添加到事件队列中;

2.取事件队列中的事件进行处理

事件响应模型(游戏引擎、JAVA中等应用)的更多相关文章

  1. 第1部分: 游戏引擎介绍, 渲染和构造3D世界

    原文作者:Jake Simpson译者: 向海Email:GameWorldChina@myway.com ---------------------------------------------- ...

  2. AI:从游戏引擎--到AI

    原文链接:http://blog.csdn.net/left_la/article/details/6358911#t9 这是我在Gameres上看到的一篇文章,文章很长,全文分为11个部分,看后感觉 ...

  3. Android游戏引擎总汇 原文出处:http://software.intel.com/en-us/blogs/2012/03/13/game-engines-for-android?page=1

    随着Android系统的使用越来越广泛,了解一下Android平台下的游戏引擎就非常有必要.而同时因为基于Intel x86的移动设备越来越多,我也非常关注支持x86的移动游戏引擎.然而就目前为止游戏 ...

  4. cocos2d-x游戏引擎核心(3.x)----事件分发机制之事件从(android,ios,desktop)系统传到cocos2dx的过程浅析

    (一) Android平台下: cocos2dx 版本3.2,先导入一个android工程,然后看下AndroidManifest.xml <application android:label= ...

  5. cocos2d-x游戏引擎核心之五——触摸事件和触摸分发器机制

    一.触摸事件 为了处理屏幕触摸事件,Cocos2d-x 提供了非常方便.灵活的支持.在深入研究 Cocos2d-x 的触摸事件分发机制之前,我们利用 CCLayer 已经封装好的触摸接口来实现对简单的 ...

  6. 基于Java的开源3D游戏引擎jMonkeyEngine

    jMonkeyEngine简介 jMonkeyEngine是一款纯Java语言编写的游戏引擎,继承了Java应用跨平台的特性,而且是开放源代码的,遵循BSD开源协议,BSD开源协议用一句简单的话概括就 ...

  7. java事件响应方法汇总(容器类监听、监听器类、AbstractAction、反射)

    Java图形用户界面中,处理事件时所必须的步骤是: 1.创建接受响应的组件(控件)2.实现相关事件监听接口3.注册事件源的动作监听器4.事件触发时的事件处理 相应的可以通过以下的集中方式来作出事件响应 ...

  8. Java 3D游戏引擎——JME(java Monkey Engine)

    转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java ...

  9. Python游戏引擎开发(五):Sprite精灵类和鼠标事件

    本次来实现Sprite类和鼠标事件. 说起这个Sprite啊,涉及过2D游戏研究领域的看官应该都听说过它. 它中文原意是"精灵",只是在不同人的眼中,它所表示的意义不同. 比方说在 ...

随机推荐

  1. Signing for "XXXX" requires a development team.

    [iOS]Signing for requires a development team. Select a development team in the project editor. Code ...

  2. runtime实现weak属性

    我们可以自己创建一个 A 类,然后在“宿主对象”和“值对象”建立 weak 关系的时候,偷偷地创建一个 A 类的实例 a,绑定在 “值对象” 上. 当“值对象”销毁后,这个 a 也会被销毁.而 A 类 ...

  3. 【English】主语从句的引导词是如何选择?

    在英语中,主要有三大从句,即名词性从句(包括主语从句,宾语从句,表语从句,同位语从句).形容词性从句(即定语从句).副词性从句(即状语从句,包括时间.条件.结果.目的.原因.让步.地点.方式等). 引 ...

  4. OpenFace的一些了解

    1.OpenFace内4个样例代码 配置学习了两个 其一: Ubantu 基本命令 Docker 安装方式.发布网站方式.查看验证安装结果命令 Openface 基本demo 实现方式.和基本原理 其 ...

  5. Element-table-formatter格式化数据

    1.formatter  用来格式化内容   对table的值进行处理.Function(row, column, cellValue, index){}   使用formatter需要注意以下几点: ...

  6. 抛异常 throw的注意事项

    子类覆盖父类只能抛出父类的异常或者子类或者子集注意:如果父类的方法没有抛异常,那么子类覆盖时绝对不能抛. 子类继承父类时,方法抛异常,要么抛父类,要么抛父类下的子类,不能抛父类平级或以上的异常 原因是 ...

  7. lua加载函数require和dofile

    lua加载函数require和dofile Lua提供高级的require函数来加载运行库.粗略的说require和dofile完成同样的功能但有两点不同: 1. require会搜索目录加载文件; ...

  8. 微信小程序实现简单的树形图treeview

    H5有很多树形图(树状图)的组件,echarts也有.比如像bootstrap的treeview,定制性很强.不过这些都无法方便地为小程序所用,除非整个页面用H5搭建再用webview框进去,有点粗暴 ...

  9. (转)Springboot定时任务

    在我们的项目开发过程中,经常需要定时任务来帮助我们来做一些内容,springboot默认已经帮我们实行了,只需要添加相应的注解就可以实现 1.pom包配置 pom包里面只需要引入springboot ...

  10. word2vec 评测 size_diff

    This is a test for word2vecWed Nov 07 16:47:19 2018dir of model1: ./model/window3_ min_count2_worker ...