Как следует обрабатывать события в игре NodeJS с каждым объектом как классом? - PullRequest
5 голосов
/ 07 августа 2011

Когда я имею дело с несколькими классами в игре Javascript / NodeJS, у меня возникают проблемы с выяснением, какой класс должен генерировать события, а какие классы должны слушать.Я следую этому руководству по созданию игр, управляемых событиями: http://pragprog.com/magazines/2011-08/decouple-your-apps-with-eventdriven-coffeescript

Я пишу небольшую игру и разделил свои классы на следующие контроллеры:

world - создает игровой мири проходит через ряд «ходов», чтобы определить простую игровую логику (то есть персонаж должен двигаться, башня должна стрелять).

башня - башня сидит на сетке 10x10 и имеет диапазон.Когда объект попадает в зону действия, он может стрелять.

мобы (враги) - моб появляется на сетке 10x10 и перемещается каждые 3 секунды.В какой-то момент он находится в пределах досягаемости башни.

Я читал о EventEmitters весь день, но, похоже, не могу понять, как правильно спроектировать мои события.Должны ли мобы запускать событие, когда они двигаются, а башня прислушивается к событию «движение»?Или мир должен контролировать все события, а башни / мобы слушают мир?

См. Ниже пример кода.

Справочная информация: я работал над простой игрой TowerD дляNodeJS и решил сначала внедрить сервер.Я храню все объекты в MongoDB и использую геопространственные вычисления, чтобы определить, находятся ли объекты в пределах досягаемости для съемки.В настоящее время я использую элементарный трехсекундный цикл, чтобы «пометить» логику игры и прогресса, но я бы хотел перейти к действительно управляемой событиями модели и борюсь.

World:

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]

(см. Полный мир1030 *

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/bdickason/node-towerd

Любая помощь в мероприятиях приветствуется. Язалил на github около 15 игр nodejs и пока не нашел никого, кто бы использовал этот шаблон: (

1 Ответ

2 голосов
/ 07 августа 2011

Я бы использовал пользовательский EventEmitter, который поддерживает «родителей», например, пузырьковое распространение событий.Затем я сделал бы это следующим образом:

  • Когда моб перемещается, он запускает на себя событие «перемещение» с параметром, подобным {mob: @,x: x, y: y} (событие затем всплывает в мир).
  • Мир прислушивается к событиям «движения».Когда он получает один, он проверяет в базе данных, чтобы найти башни, которые должны быть уведомлены, и генерирует событие на них.
...