文档章节

小球大作战-事件分发器

梦想游戏人
 梦想游戏人
发布于 2017/01/10 22:04
字数 698
阅读 52
收藏 0

提供了2种EventDispatcher ,一种是用hash table 来存储 string 类型的key

一种是同数组 ,和const int事件类型  来存储 实现比hash还快的  索引

完整代码

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;


// this is custom event (use string0
public class EventDispatcher : ZT_Object
{
    private EventDispatcher()
    {
        EventSystem.ins.AddEvent_Update(this);
    }
    Hashtable objs = new Hashtable();
    Hashtable objs_for_once = new Hashtable();


    public static EventDispatcher ins
    {
        get
        {
            return EventDispatcher.GetInstance();
        }
    }

    private static EventDispatcher _ins = null;

    public static EventDispatcher GetInstance()
    {
        if (_ins == null)
        {
            _ins = new EventDispatcher();
        }
        return _ins;
    }


    public static void DestroyInstance()
    {
        _ins.Clear();
        _ins = null;
    }

    public static EventDispatcher Create(string name = "UnName")
    {
        EventDispatcher ret = new EventDispatcher();
        ret.name = name;

        return ret;
    }


    public void PostEvent(string type, object userdata = null)
    {
        if (objs.ContainsKey(type))
        {
            ArrayList list = objs[type] as ArrayList;

            for( int i=0;i<list.Count;i++ )
            {
                ZT_Object obj = list[i] as ZT_Object;

                obj.OnEvent(type, userdata);
            }
        }
    }






    public void PostEventOnce(string type, object userdata = null)
    {
        //call for once
        if (objs_for_once.ContainsKey(type))
        {
            ArrayList list = objs_for_once[type] as ArrayList;

            foreach (ZT_Object obj in list)
            {
                obj.OnEvent(type, userdata);
            }
            objs_for_once.Remove(type);
        }

    }


    public void AddEventListener(ZT_Object target, string type)
    {
        if (objs.ContainsKey(type) == false)
        {
            objs.Add(type, new ArrayList());
        }
        ArrayList list = objs[type] as ArrayList;

        list.Add(target);
    }


    public void RemoveEventListener(ZT_Object target, string type)
    {
        if (objs.ContainsKey(type) == false)
        {
            return;
        }
        ArrayList list = objs[type] as ArrayList;

        list.Remove(target);
    }

    public void Clear()
    {
        objs.Clear();
    }


    public void AddEventListenerOnce(ZT_Object target, string type)
    {
        if (objs_for_once.ContainsKey(type) == false)
        {
            objs_for_once.Add(type, new ArrayList());
        }
        ArrayList list = objs_for_once[type] as ArrayList;

        list.Add(target);
    }


    public void AddFuncToMainThread(Func<int> func)
    {
        this._queue_funcs.Enqueue(func);
    }

    private void ProcessOtherThreadFunc()
    {
        _queue_funcs.Lock();

        while (_queue_funcs.UnSafeEmpty() == false)
        {
            Func<int> func = _queue_funcs.UnSafeDequeue() as Func<int>;
            func();
        }

        _queue_funcs.UnLock();
    }

    public override void Update()
    {
        this.ProcessOtherThreadFunc();
    }
    private ThreadSafeQueue _queue_funcs = new ThreadSafeQueue();

    public string name = "Global";

};








//this is event which used int for Event

public class ZTEventDispatcher : object
{
    private ZTEventDispatcher()
    {
        for (int i = 0; i < Event.MAX_EVENT_LENGTH; i++)
        {
            objs.Add(null);
            objs_for_once.Add(null);
        }

    }
    ArrayList objs = new ArrayList();
    ArrayList objs_for_once = new ArrayList();


    public static ZTEventDispatcher ins
    {
        get
        {
            return ZTEventDispatcher.GetInstance();
        }
    }

    private static ZTEventDispatcher _ins = null;

    public static ZTEventDispatcher GetInstance()
    {
        if (_ins == null)
        {
            _ins = new ZTEventDispatcher();
        }
        return _ins;
    }


    public static void DestroyInstance()
    {
        _ins.Clear();
        _ins = null;
    }

    public static ZTEventDispatcher Create(string name = "UnName")
    {
        ZTEventDispatcher ret = new ZTEventDispatcher();
        ret.name = name;

        return ret;
    }

    public void PostEvent(int type, object userdata = null)
    {

        if (objs[type] == null)
        {
            return;
        }
        ArrayList list = objs[type] as ArrayList;

        foreach (ZT_Object obj in list)
        {
            obj.OnEvent(type, userdata);
        }

    }

    public void PostEventOnce(int type, object userdata = null)
    {
        //call for once
        if (objs_for_once[type] != null)
        {
            ArrayList list = objs_for_once[type] as ArrayList;

            foreach (ZT_Object obj in list)
            {
                obj.OnEvent(type, userdata);
            }
            objs_for_once.Remove(type);
        }

    }


    public void AddEventListener(ZT_Object target, int type)
    {
        if (objs[type] == null)
        {
            objs[type] = new ArrayList();
        }
        ArrayList list = objs[type] as ArrayList;

        list.Add(target);
    }


    public void RemoveEventListener(ZT_Object target, int type)
    {
        if (objs[type] == null)
        {
            return;
        }
        ArrayList list = objs[type] as ArrayList;

        list.Remove(target);
    }

    public void Clear()
    {
        objs.Clear();
    }


    public void AddEventListenerOnce(ZT_Object target, int type)
    {
        if (objs_for_once[type] == null)
        {
            objs_for_once[type] = new ArrayList();
        }
        ArrayList list = objs_for_once[type] as ArrayList;

        list.Add(target);
    }




    public string name = "GlobalZTEvent";

};

ZT_Object

using UnityEngine;
using System.Collections;
using System;

public class ZT_Object : IDisposable
{


    // every frame will be call
    public virtual void Update()
    {

    }

    //every logic frame will be call(Frame Sync to All clients)
    public virtual void UpdateMS()
    {

    }

    //use this to init you class
    public virtual bool Init()
    {
        return true;
    }

    public virtual void OnEvent(string type, object userData)
    {

    }
    public virtual void OnEvent(int type, object userData)
    {

    }

    // you can override  this interface to release your Res ,Rem. must call base.OnExit when you override
    public virtual void OnExit()
    {

    }


    // you can use this interface to  notify class to release//OnExit will be call
    // use this or Release()
    public void Dispose()
    {
        this.OnExit();
    }
    // use this or Dispose()
    public void Release()
    {
        this.Dispose();
    }
};


此外ZT_Object为客户端所有对象的父类,负责消息派发,事件响应,逻辑更新接口,每帧更新接口,析构处理等。

EventDispatcher 在主线程跑,提供了其他线程添加主线程执行函数 回调方法

© 著作权归作者所有

上一篇: Unity使用C++ DLL
梦想游戏人
粉丝 41
博文 461
码字总数 132517
作品 0
成都
私信 提问
球球大作战 01 小球的移动和碰到金币,金币会消失。

版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top 优梦创客的游戏讲堂:https://91make.ke...

优梦创客
08/24
0
0
当我阅读完上千行的游戏球球大作战战斗服务器端源码后...

这周服务器主程安排给了我一个任务(其实是我在用Go做完了一些小demo后,向主程请示下一步的安排),让我将他用Lua语言写的球球大作战的服务端代码转成Go语言形式。 于是,我开搞了! 此内容...

Zoctopus·Lian
2018/09/01
0
0
Unity经典游戏编程之:球球大作战

版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:)以及微信公众号"优梦创客" 您可以自由转载,但必须加入完整的版权声明! 首先: alt + 鼠标拖拽 视角旋转 按住鼠标中间,并移...

优梦创客
08/08
0
0
vue 游戏 虚拟摇杆 控制飞机

使用vue 设计了一个虚拟摇杆,可以控制飞机移动 移动使用二维向量,实现任意方向的移动 点击显示,不占用屏幕空间 可以控制移动的速度,与小球与大球的距离成正比 设置需要使用到的属性 包括...

阿豪boy
2018/04/14
10
0
Material Design学习之 Switch(详细解释)

转载请注明出处:王亟亟的大牛之路 继续这一系列的Material Design之行,昨天讲的是Sliders链接如下:http://blog.csdn.net/ddwhan0123/article/details/50586510 今天讲的是Switch,本来有考...

ddwhan0123
2016/01/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
8
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部