正逍遥0716
本帖最后由 正逍遥0716 于 2015-10-31 00:14 编辑

<基于1.8 Forge的Minecraft mod制作经验分享>
这一章其实才应该是第一章,矿物生成里面用到了Event的一些内容。如果你对之前矿物生成那一章的将算法插入ORE_GEN_BUS那块没看懂,那么相信这一章会给你解释清楚。
下面开始逐一分析MC与Forge的Event系统。
一、EventHandler。
很熟悉不是?其实从制作mod的第一步开始,我们已经在于Event打交道了。我们用一个@EventHandler注解,标注了mod主类中的几个带有唯一事件参数方法,从而使这几个方法取得了事件的控制权,从而插入一些操作到MC中去。确切的说,当MC运行开始,Forge就会把这几个方法插进去,使得你运行的MC不再是原来的MC,而是被部分偷梁换柱了的。下面简单回顾一下以前提到过的,几个@EventHandler所接受的Forge的生命周期Event:
这三个事件很常用也很简单,不做过多解释。当然,你可以对着@EventHandler标签Ctrl + clickL,看看Forge还为你提供了哪些可用的事件。唯一需要注意的就是,这三个事件实际上都是在游戏开始前执行的,当你运行打了Forge的MC,看到一个小锤子在那敲的时候,这三个事件就以此发生了。
二、EventBus,本文的重点。
EventBus,事件公交,一般我们称它为事件主线,其实就是观察者模式。按照名称来理解,EventBus是一个交通载体,事件是它的乘客,EventBus会载着它的乘客们贯穿于MC中。但我更喜欢这么来理解:EventBus是一个电台,每一个事件是一则广播。我们用post();方法,向某个EventBus电台发布一则事件广播,然后可以在其它地方用register();方法来注册一个订阅者(观察者),来监听这个事件广播。一旦一个事件被post到一条事件主线上,那么所有这条线上的订阅者都可以监听到它,并对它做出响应。
首先我们需要掌握几个与EventBus交互的几个重要方法:
再接下来,我们还需掌握几个重要的Event的通用方法:
呼~终于掌握了足够的与EventBus、Event交互的方法,来到了最后一步:看看四条Forge为我们提供的EventBus。(童鞋挺住啊,斗罗大坑在前方等待着你呢)认识这四条主线很重要,如果事件在一条线上发布、广播了,你却跑到另一条线上去订阅、收听,怎么可能收到呢。什么?为什么会有这么多条“主线”?为了分工啊童鞋,不然所有的发布事件、注册订阅者都对同一条总线操作,会堵车的啊,则也再次印证了我上文的建议——建立多个订阅者,分管不同的事件:你看,Forge都这么做了。你虽然没办法得到一条真正的“主线”,但你可以直接在ListenerList层面上进行操作,它有大量公开的诸如
  1. public void register(int id, EventPriority priority, IEventListener listener);
复制代码
之类的定制程度很高的方法,第一个参数id就是主线的id,一个事件的所有存在监听器的主线都被放在了一个ListenerListInst[]中,所以这个id其实应该是主线在[]里的index。ListenerList里面还有一个静态的allLists域,虽然是私有的,但也能看出它拥有很高的自定义度了。不过目前我还没有实际运用过,所以暂不讨论,有兴趣的童鞋自行探索。
终于结束了,后面我们要涉及的问题越来越深入,文章也会越来越长。别怪我不分成小章节,这毕竟不是系统的书本教程,我需要让大家遇到什么问题后能很清楚的找到对它的分析与解决它的所有相关知识点,以免出纰漏,自然不能把关联的问题分的太散,否则可能需要你读好几章才能彻底搞明白一个问题,万一漏读了一章会出大麻烦。我只能说,我会尽量把章与章之间的界限划分的更加明显。
GitHub链接:https://github.com/zhengxiaoyao0716/DouroMod
斗罗大坑真不是我一个人能完成的,我甚至都不敢肯定自己会不会弃坑,所以我公开源码,分析源码,还专门写这些文章来分享我的经验,就是为了拉你一起入坑。都说咱国人盗版强,MC如此开放,Notch如此宽容,咱倒是做一个震撼点的mod出来啊。


第一页 上一页 下一页 最后一页