Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 event.stopImmediatePropagation在AS3中如何工作?_Actionscript 3_Event Handling - Fatal编程技术网

Actionscript 3 event.stopImmediatePropagation在AS3中如何工作?

Actionscript 3 event.stopImmediatePropagation在AS3中如何工作?,actionscript-3,event-handling,Actionscript 3,Event Handling,所有相关代码发布在下面。我有一个基于骰子的战斗系统。掷骰子后,名为enableAttacks的事件将启用当前骰子允许的任何攻击(不同的组合创建不同的攻击)。目前,我正在使用一些快捷方式进行测试,例如只启用一个攻击并自动选择它作为所选攻击 问题就在这里。侦听MouseEvent.Click的侦听器调用SetDice方法。此事件获取骰子的当前状态并将其传递给攻击者enableAttack方法。之后,它会添加一个侦听器来启动所选的攻击。(在我完成这项工作后,实际上中间还会有一个步骤,但这并不影响这个测

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

问题就在这里。侦听MouseEvent.Click的侦听器调用SetDice方法。此事件获取骰子的当前状态并将其传递给攻击者enableAttack方法。之后,它会添加一个侦听器来启动所选的攻击。(在我完成这项工作后,实际上中间还会有一个步骤,但这并不影响这个测试)。然而,即使我在MouseEvent上调用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());
    }

我仍然希望详细描述stopImmediatePropagation和stopPropagation是如何工作的,但我意识到我在这段特定代码中的问题是什么。最初的鼠标点击触发了一个CustomEvent,这就是传递给setDice的内容。所以当我在setDice中调用stopImmediatePropagation时,它是在我的customEvent中调用的。通过将它添加到发送自定义事件的函数中,它工作得很好。

我处理软件设计的方法是使用一个中间“转换器”,为所有或至少大多数系统事件发送自定义事件,然后我监听这些事件。然后我停止或开始发送这些自定义事件。这样一来,一个地方的代码就不需要依赖另一个地方的代码来停止传播,这在一个大型系统中可能会变得很危险。