2

我想干掉这段代码:

@$canvas.on 'mousemove', (e) =>
  return unless @running
  @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
  @player?.mouseMove()

@$canvas.on 'mousedown', (e) =>
  return unless @running
  @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
  @player?.mouseDown()

@$canvas.on 'mouseup', (e) =>
  return unless @running
  @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
  @player?.mouseUp()

我想要一些效果:

@$canvas.on 'mousemove', 'mousedown', 'mouseup' -> @mouseAction

mouseAction: (e) =>
  return unless @running
  @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
  @player?.mouseUp() # here is the problem...

问题是,我如何在保持 DRY 代码@player?.mouseUp()@player?.mouseDown()同时交替使用?@player?.mouseMove()

4

2 回答 2

1

要扩展 pdoherty926 的答案,您想以某种方式做同样的事情,但在@player. 如果您控制方法名称并且始终可以使用事件类型,则可以执行 pdoherty926 建议的操作 - 否则,这里有一个更明确的解决方案的建议:

@$canvas.on 'mousemove', @mouseAction 'mouseMove'
@$canvas.on 'mousedown', @mouseAction 'mouseDown'
@$canvas.on 'mouseup', @mouseAction 'mouseUp'

mouseAction: (action) =>
  (e) =>
   return unless @running
   @mouseTarget.set @board.x + e.clientX, @board.y + e.clientY * 2
   @player?[action]()
于 2013-09-03T19:16:19.347 回答
0

你可以试试:

capitaliseFirstLetter = (string) -> string.charAt(0).toUpperCase() + string.slice(1)
# you could also include the underscore.string library and use _.capitalize

event_type = "mouse#{capitaliseFirstLetter(e.type.split('mouse')[1])}"
@player[event_type]()
于 2013-09-03T18:59:57.987 回答