在 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 游戏,还没有发现有人使用这种模式:(