Javascript 在以每个对象为类的NodeJS游戏中,事件应该如何处理?
在Javascript/NodeJS游戏中处理多个类时,我很难确定哪个类应该发出事件,哪个类应该侦听事件。我遵循本指南创建事件驱动游戏: 我正在编写一个小游戏,并将我的类划分为以下控制器: 世界-创建游戏世界并通过若干“回合”来确定一些简单的游戏逻辑(即角色应该移动,塔应该射击) 塔-塔位于10x10网格上,具有一定范围。当一个物体进入射程时,它可以射击 怪物(敌人)-怪物在10x10网格上繁殖,每3秒移动一次。在某一点上,它在塔的范围内游荡 我整天都在读关于EventEmitter的书,但似乎无法找到构建我的事件的正确方法。暴徒在移动时是否应该发射事件,而塔台是否应该监听“移动”事件?或者世界应该控制所有的事件,塔楼/暴徒应该倾听世界 参见下面的示例代码 背景:我一直在为NodeJS开发一个简单的TowerD游戏,并决定首先实现服务器。我将所有实体存储在MongoDB中,并使用地理空间计算来确定对象是否在拍摄范围内。目前,我正在使用一个基本的3秒循环来“勾选”游戏和进度逻辑,但我想转向一个真正的事件驱动模型,我正在努力 世界:Javascript 在以每个对象为类的NodeJS游戏中,事件应该如何处理?,javascript,node.js,coffeescript,eventemitter,Javascript,Node.js,Coffeescript,Eventemitter,在Javascript/NodeJS游戏中处理多个类时,我很难确定哪个类应该发出事件,哪个类应该侦听事件。我遵循本指南创建事件驱动游戏: 我正在编写一个小游戏,并将我的类划分为以下控制器: 世界-创建游戏世界并通过若干“回合”来确定一些简单的游戏逻辑(即角色应该移动,塔应该射击) 塔-塔位于10x10网格上,具有一定范围。当一个物体进入射程时,它可以射击 怪物(敌人)-怪物在10x10网格上繁殖,每3秒移动一次。在某一点上,它在塔的范围内游荡 我整天都在读关于EventEmitter的书,但似乎
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}
- 世界监听“移动”事件。当它收到一个事件时,它会检查数据库,查找需要通知的塔,并在塔上发出事件
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] + ')'