event.stopImmediatePropagation如何在AS3中运行?

时间:2014-04-11 23:46:28

标签: actionscript-3 event-handling

所有相关代码均发布在下方。我有一个基于骰子的战斗系统。掷骰子后,名为enableAttacks的事件将启用当前骰子允许的任何攻击(不同的组合会产生不同的攻击)。目前,我正在进行一些测试的快捷方式,例如只启用一次攻击并自动选择它作为所选攻击。

这是问题所在。 SetDice方法由侦听MouseEvent.Click的侦听器调用。此事件获取骰子的当前状态并将其传递给攻击者enableAttack方法。在它之后,它添加了一个监听器来启动所选择的攻击。 (在我开始工作之后,实际上会有另一个步骤,但这不会影响这个测试)。但是,即使我在MouseEvent上调用stopImmediatePropagation,它仍然会触发第二个侦听器。根据文档,stopImmediatePropagation

"Prevents processing of any event listeners in the current node and any subsequent nodes in the event flow. This method takes effect immediately, and it affects event listeners in the current node"

但事件仍在触发事件停止后添加的eventListener。显然,我理解这是如何工作的不正确。 stopImmediatePropagation究竟做了什么,如果它没有做我认为它做的事情,我怎样才能让添加的eventListener不被第一个事件触发?

private function setDice(e:Event):void {
        e.stopImmediatePropagation();
        currentDice = (e.target as HeroDice);
        trace(char1);
        attacker = char1;
        trace(currentDice);
        trace(attacker);
        attacker.enableAttacks(currentDice);
        addEventListener(MouseEvent.CLICK, launchAttack);
    }

public function enableAttacks(dice:HeroDice):void {
        if (dice.getPower() > 2) {
            trace("attack enabled");
            portrait.alpha -= .1;
        }
    }

public function launchAttack(e:MouseEvent):void {
        //make sure that e.target is character first
        if(attacker != null && e.target != null && (e.target as Character) != attacker){
            var target:Character = (e.target as Character);
            attacker.attack(target);
            attacker = null;
            removeEventListener(MouseEvent.CLICK, launchAttack);
        }

    }

public function attack(target:Character):void {
        switch(chosenAttack) {
            case 0: 
                trace("error");
                break;
            case BASICATTACK:
                basicAttack(target);
                break;
        }
    }

public function basicAttack(target:Character):void {
        target.loseHealth(strength);
        trace("Health: " + target.getHealth());
    }

1 个答案:

答案 0 :(得分:0)

我仍然希望详细描述stopImmediatePropagation和stopPropagation是如何工作的,但我意识到我对这个特定代码的问题是什么。最初的mouseClick正在触发一个CustomEvent,这是传递给setDice的东西。所以当我在setDice中调用stopImmediatePropagation时,它在我的customEvent上调用它。通过将它添加到调度自定义事件的函数中,它工作正常。