【问题标题】:AS3 - Get reference of instance who called a functionAS3 - 获取调用函数的实例的引用
【发布时间】:2015-01-26 14:47:18
【问题描述】:

我有两个类,“玩家”和“火柴人”,“玩家”扩展了“火柴人”。 “火柴人”类包含游戏中所有角色都将拥有的功能,例如移动和处理动画(都使用相同的动画),而“玩家”类包含玩家专有的动作。 当我从继承自“火柴人”基类的播放器实例调用动作时,我如何正确地(从火柴人基类)指向调用该函数的播放器实例?

例如,处理正在运行的动画

player.as 中的触发代码:

moveType("running");

Stickman.as 中的 moveType 函数:

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

在播放器对象(它是 Stickman 的扩展)内开始播放帧标签“正在运行”的帧。我知道 this 不起作用,所以我想将 this 替换为指向函数的调用者(即播放器对象)。跟踪语句仍在运行,因此(应该)链接没有问题。有没有办法在不传递玩家对象的 childId 的情况下做到这一点?

【问题讨论】:

  • Stickman 是从 MovieClip 继承还是包含对包含时间线的 MovieClip 的引用?
  • 继承自包含时间线本身的电影剪辑...我想。它是包含动画时间轴的 Movieclip 的 AS 类链接

标签: actionscript-3 function class flash call


【解决方案1】:

这就是所谓的inheritance。播放器 IS 实际上是 Stickman。因此,当您调用 moveType 时,您将其称为 ON Player 对象。如果里面没有这样的函数,它会在继承链中查找,并在Stickman中找到它。

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

也就是说 - 您必须使用 Player 类作为起点,然后决定从那里开始做什么。

长话短说-您需要覆盖函数从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 将调用父类中的内容。

继承非常重要,我为你决定使用它而欢呼!再多练习一下,你就会掌握它!

【讨论】:

  • 谢谢,我不知道继承的单向属性。
  • 把它想象成现实生活中的分类:你是人类。您是男性(例如)。你可以做任何普通的human 做的事,但你的分类要多一些。你不同于female,后者又是一个human。如果你只说人类,你将无法确定性别,对吧?与Stickman 完全相同的方式不会带来有关Player 的任何信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多