AS3 - 获取调用函数的实例的引用

AS3 - Get reference of instance who called a function

我有两个 class,"player" 和 "Stickman","player" 扩展 "Stickman"。 class "Stickman" 包含所有角色在游戏中都会有的功能,例如移动和处理动画(都使用相同的动画),而 "player" class 包含玩家独有的功能动作。 当我从继承自 "Stickman" 基础 class 的播放器实例调用动作时,如何正确指向(从火柴人基础 class)调用该函数的播放器实例?

例如,处理运行个动画

player.as中的触发代码:

moveType("running");

Stickman.as 中的 moveType 函数:

public function moveType(type:String):void{
    this.gotoAndPlay("running");
    trace("testing");
}

开始播放播放器对象内带有帧标签 "running" 的帧(这是 Stickman 的扩展)。我知道 this 不起作用,所以我想替换 this 带有指向函数调用者的东西(即播放器对象)。trace 语句仍在运行,因此(应该)链接没有问题。有没有办法不传递播放器对象的 childId 来做到这一点?

就是所谓的inheritance。玩家 IS 实际上是 Stickman。因此,当您调用 moveType 时,您正在调用它 ON Player 对象。如果你里面没有这个函数,它会在继承链中查找,并在 Stickman.

中找到它

继承是单向的。这意味着 Player 知道 Stickman 的所有方法,但反之则不然 - Stickman 只能自己工作,不知道谁扩展了它,谁没有扩展它。

就是说 - 您必须使用 Player class 作为起点并决定从那里开始做什么。

长话短说 - 您需要 覆盖 函数从 StickmanPlayer,然后决定做什么和不做什么。示例:

Stickman:

public function move(type:String):void {
    this.gotoAndPlay(type); // regular workflow for reach Stickman
}

Player:

override public function move(type:String):void {
    if (type == 'player_specific') {
        this.gotoAndPlay('frameAvailableOnlyForPlayerClip');
        // maybe something else, player specific, like play sound or smth else
    } else {
        super.move(type); // calls whatever is inside Stickman::move
    }
}

记住 - this 始终是您为其调用函数的同一对象。但是您可以决定是想要特定的东西(玩家案例)还是想要非常平常的流程。 super.move 将调用父级 class 中的内容。

继承很重要,我为你决定使用它而欢呼!稍加练习,您就会掌握它!