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ゲームを注ぎましたが、このパターンを使用している人はまだ見つかりません:(