Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在以每个对象为类的NodeJS游戏中,事件应该如何处理?_Javascript_Node.js_Coffeescript_Eventemitter - Fatal编程技术网

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

Javascript 在以每个对象为类的NodeJS游戏中,事件应该如何处理?,javascript,node.js,coffeescript,eventemitter,Javascript,Node.js,Coffeescript,Eventemitter,在Javascript/NodeJS游戏中处理多个类时,我很难确定哪个类应该发出事件,哪个类应该侦听事件。我遵循本指南创建事件驱动游戏: 我正在编写一个小游戏,并将我的类划分为以下控制器: 世界-创建游戏世界并通过若干“回合”来确定一些简单的游戏逻辑(即角色应该移动,塔应该射击) 塔-塔位于10x10网格上,具有一定范围。当一个物体进入射程时,它可以射击 怪物(敌人)-怪物在10x10网格上繁殖,每3秒移动一次。在某一点上,它在塔的范围内游荡 我整天都在读关于EventEmitter的书,但似乎

在Javascript/NodeJS游戏中处理多个类时,我很难确定哪个类应该发出事件,哪个类应该侦听事件。我遵循本指南创建事件驱动游戏:

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

世界-创建游戏世界并通过若干“回合”来确定一些简单的游戏逻辑(即角色应该移动,塔应该射击)

塔-塔位于10x10网格上,具有一定范围。当一个物体进入射程时,它可以射击

怪物(敌人)-怪物在10x10网格上繁殖,每3秒移动一次。在某一点上,它在塔的范围内游荡

我整天都在读关于EventEmitter的书,但似乎无法找到构建我的事件的正确方法。暴徒在移动时是否应该发射事件,而塔台是否应该监听“移动”事件?或者世界应该控制所有的事件,塔楼/暴徒应该倾听世界

参见下面的示例代码

背景:我一直在为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]
(见完整世界。咖啡:)

塔楼:

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
(参见完整的towers.coffee:)

暴徒:

(见mobs.coffee的完整来源:)

项目的完整来源:


任何活动的帮助都将不胜感激。我已经在github上浏览了大约15个nodejs游戏,还没有发现任何人使用这种模式:(

我会使用一个支持“父级”的自定义EventEmitter,例如冒泡事件传播。然后我会用以下方法来做:

  • 当一个mob移动时,它会在自己身上触发一个“move”事件,其参数类似于
    {mob:@,x:x,y:y}
    (该事件随后会向世界显示)
  • 世界监听“移动”事件。当它收到一个事件时,它会检查数据库,查找需要通知的塔,并在塔上发出事件

ahahaha可爱的家长事件发射器:D确保你花一些时间在系统的设计上。例如,给对象分组,这样你就可以在全世界收听“golbin.move”每升一级,你都会在地精、世界等中取消转换到回调参数中。谢谢他们的JH和Ivo,这些都是很好的建议!我对“冒泡”概念有一点了解,但其他一切都很清楚。你能用一个简单的例子来澄清地精或世界中的“取消转换”吗?当然,想象一下有了地精启动一个移动。地球仪上的侦听器看起来像是
goblin.bind('move',function(x,y){
现在世界上的侦听器看起来像
world.bind('goblin.move',function(goblin,x,y){
诸如此类,感谢你的支持。把一个简单的流程图和一些场景放在一起,然后我就开始破解了!
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] + ')'