5

Javascript / NodeJSゲームで複数のクラスを処理する場合、どのクラスがイベントを発行し、どのクラスがリッスンする必要があるかを判断するのに問題があります。私はイベント駆動型ゲームを作成するためにこのガイドに従っています:http://pragprog.com/magazines/2011-08/decouple-your-apps-with-eventdriven-coffeescript

私は小さなゲームを書いていて、クラスを次のコントローラーに分割しました。

world-ゲームの世界を作成し、いくつかの「ターン」を経て、いくつかの単純なゲームロジックを決定します(つまり、キャラクターが移動し、タワーが撃つ必要があります)。

タワー-タワーは10x10グリッド上にあり、範囲があります。オブジェクトが範囲内に入ると、それは撃つことができます。

モブ(敵)-10x10グリッドにモブが出現し、3秒ごとに移動します。ある時点で、それは塔の範囲内をさまよう。

私は一日中EventEmittersについて読んでいますが、私のイベントを設計する正しい方法を理解できないようです。モブは移動するときにイベントを発生させ、タワーは「移動」イベントをリッスンする必要がありますか?それとも、世界がすべてのイベントを制御し、タワー/モブが世界に耳を傾ける必要がありますか?

コード例については、以下を参照してください。

背景:私は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

(完全なtowers.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/bdickason/node-towerd

イベントのお手伝いをいただければ幸いです。私はgithubに約15のnodejsゲームを注ぎましたが、このパターンを使用している人はまだ見つかりません:(

4

1 に答える 1

2

バブリングイベントの伝播など、「親」をサポートするカスタムEventEmitterを使用します。それから私はそれを次のようにします:

  • 暴徒が移動すると、次のようなパラメータを使用して「移動」イベントを発生させます{mob: @,x: x, y: y}(イベントはその後、世界にバブルアップします)。
  • 世界は「移動」イベントをリッスンします。受信すると、データベースをチェックインして、通知が必要なタワーを検索し、イベントを送信します。
于 2011-08-07T10:23:45.573 に答える