CreateJS createjs.Ticker.off("tick", element.update) 不起作用

Mig*_*ula 0 javascript event-listener coffeescript createjs

我正在制作一个射击游戏,我需要通过将它们绑定到 'tick' 事件来更新子弹的状态,但是当调用 remove 方法将它们从 'tick' 事件中删除时,它不会删除它。创建一个新实例后,它会不断更新,而不是绑定的那个。

方法 'add'/'remove' 用于从 'tick' 事件绑定/解除绑定方法

class window.Stage

  stage = undefined
  counter = 0
  fps = 60

  add: (element) =>
    element.id = counter++
    stage.addChildAt(element.view, element.id)
    element.listener = createjs.Ticker.on("tick", element.update)

  remove: (element) =>
    createjs.Ticker.off("tick", element.listener) # Not removing!
    stage.removeChildAt(element.id)

  update: () =>
    stage.update()
Run Code Online (Sandbox Code Playgroud)

这就是我在 Game 类中调用 remove 方法的方式

  run: () => 

    if @gun? && !@gun.alive
      @stage.remove(@gun)
      @gun = undefined

    if @player.shooting() && !@gun?     
      @gun = @player.shoot() # Ticker keeps updating new instance
      @stage.add(@gun)

    for bunker in @bunkers
      if @gun? && bunker.gotShot(@gun)
        @gun.alive = false
Run Code Online (Sandbox Code Playgroud)

这就是子弹是如何创建的

class window.Player      
  shoot: =>
    new Gun(@name, @x, @y - radius, false)
Run Code Online (Sandbox Code Playgroud)

如果有任何教程可以更好地理解如何正确使用侦听器,将非常感谢链接,谢谢。

Lan*_*nny 5

off()方法要求您传递调用生成的方法闭包on(),而不是传递的原始方法。这是因为该on()方法会生成一个闭包来维护范围——而addEventListener不会为您确定方法的范围,需要您自己绑定它们,或者使用全局或匿名处理程序。

确保关闭关闭,并通过它。我不熟悉您示例中的语法,因此这是一个普通的 JS 示例:

var listener = element.on("tick", handler, this);
element.off("tick", listener);
Run Code Online (Sandbox Code Playgroud)

请注意,第三个参数是方法应该被调用的范围,如果你不传递它,它仍然会生成一个闭包,并在元素的范围内而不是匿名地触发它。该方法还有一些其他不错的特性on(),例如“触发一次”和event.remove()功能。

addEventListener/removeEventListener如果您更喜欢与 DOM 级别 3 事件相同的行为,您可以始终坚持使用这些方法。