在每个对象作为一个类的NodeJS游戏中,事件应该如何处理?

当在一个Javascript / NodeJS游戏中处理多个类时,我很难找出哪个类应该发出事件,哪些类应该听。 我正在按照本指南创build事件驱动的游戏: http : //pragprog.com/magazines/2011-08/decouple-your-apps-with-eventdriven-coffeescript

我正在写一个小游戏,并将我的课程分为以下控制器:

世界 – 创造游戏世界,并通过一系列“轮stream”来确定一些简单的游戏逻辑(即angular色应该移动,塔应该射击)。

塔 – 一个塔坐在一个10×10的网格,并有一个范围。 当一个物体进入射程,它可以射击。

暴徒(敌人) – 一个暴徒在10×10格子上产生并每3秒移动一次。 在某个时候,它在一个塔的范围内飘荡。

我一整天都在读EventEmitters,但似乎无法找出构build我的活动的正确方法。 如果暴徒在移动的时候发起了一个事件,那么这个塔就是在听“移动”事件呢? 或者,这个世界是否应该控制所有的事件和塔/小怪听世界?

请参阅下面的示例代码。

背景:我一直在为NodeJS开发一个简单的TowerD游戏,并决定首先实现服务器。 我将所有实体存储在MongoDB中,并使用地理空间计算来确定对象是否在范围内进行拍摄。 目前,我正在使用一个基本的3秒循环来“勾选”游戏和进度逻辑,但是我想转向一个真正的事件驱动模型,并且正在挣扎。

世界:

exports.World = class World extends EventEmitter constructor: -> ### Initial config ### @gameTime = 3000 # every 3000ms, the game progresses ### Start the game!! ### @game = setInterval -> world.gameLoop() , @gameTime ### Load the map ### # First level: Hidden Valley @maps = [] @maps.push new map 'hiddenvalley' ### Load the mobs ### # First map has one mob: Warrior @mobs = [] # Let's create two of them @mobs.push new mob @maps[0].mobs[0] @mobs.push new mob @maps[0].mobs[0] 

(查看完整的world.coffee:https://github.com/bdickason/node-towerd/blob/master/controllers/world.coffee)

塔:

 exports.Tower = class Tower constructor: (name) -> name = name.toLowerCase() # In case someone throws in some weird name # Check for anything within range checkTargets: (callback) -> mobModel.find { loc : { $near : @loc , $maxDistance : @range } }, (err, hits) -> if err console.log 'Error: ' + err else callback hits 

(详见tower.coffee:https://github.com/bdickason/node-towerd/blob/master/controllers/towers.coffee)

小怪:

 exports.Mob = class Mob extends EventEmitter move: (X, Y, callback) -> @loc = [@loc[0] + X, @loc[1] + Y] newloc = @loc mobModel.find { uid: @uid }, (err, mob) -> if(err) console.log 'Error finding mob: {@uid} ' + err else mob[0].loc = newloc mob[0].save (err) -> if (err) console.log 'Error saving mob: {@uid} ' + err console.log 'MOB ' + @uid + ' [' + @id + '] moved to (' + @loc[0] + ',' + @loc[1] + ')' 

(查看mobs.coffee的完整源代码: https : //github.com/bdickason/node-towerd/blob/master/controllers/mobs.coffee )

项目的完整来源: https : //github.com/bdickson/node-towerd

任何事件的帮助,将不胜感激。 我在github上倒了大约15个nodejs游戏,并且还没有发现有人使用这个模式呢:(

我会使用支持“父母”的自定义EventEmitter,例如冒泡事件传播。 那么我会这样做:

  • 当一个暴民移动时,它会用{mob: @,x: x, y: y}这样的参数激发一个“移动”事件(然后事件向上冒泡)。
  • 世界倾听“搬家”事件。 当它收到一个,它会检查数据库,以查找需要通知的塔,并发出事件。