AS3:如何从 parent object 访问变量?
AS3: How do I access a variable from a parent object?
我是 AS3 的新手,我的代码可能看起来有点不对。
基本上,我的程序是如何工作的,我在舞台上有一个 "Level" 的实例,它是一个包含其他几个 objects 的 MovieClip,它们也是具有自己文档的 MovieClips class。在 "Level" class 中,我可以从 "Player" 的实例访问 X 和 Y 位置,但在我的 "Arrow" class 中,这也是一个 child 级别,我无法访问 "Player" 的 X 和 Y。我尝试做的是在 Level class 中设置一个名为 playerX 和 playerY 的 public 静态变量,并将其分配给玩家每帧的 x 和 y 位置,然后我尝试访问 Arrow class 通过执行 "var x:Number = Object(parent).playerX,我也试过 MovieClip(parent).playerX 和 parent.playerX只有玩家 X,他们都不起作用。
总而言之,我需要从 parent class 访问一个变量,但我尝试过的每一种方法都只是 returns 一个错误。
抱歉,如果这有点不清楚,我们将不胜感激!
您需要了解什么是静态变量,什么不是。静态变量是 Class 变量,静态变量不是实例变量。因此,如果我在名为 "Level" 的 class 中创建一个名为 "playerX" 的静态变量,我现在可以这样做:
Level.playerX = 0;
因为 Level 是 class 而 playerX 是 class 的变量。
我不能这样做:
Object(parent).playerX
因为 'parent' 不是 class 并且没有名为 'playerX' 的变量,父级可能是 class 'Level' 的实例但是class 'Level' 的实例没有名为 'playerX' 的变量,class 本身 "Level" 就是具有该变量的变量。
听起来您正在使用 FlashPro Timelines,并且有两个兄弟对象(它们具有相同的父对象 MovieClip/timeline)并且您希望能够从另一个对象中引用一个对象(如果没有,请告诉我)无法正确总结您的问题)。
因为听起来你有 class 文件附加到你的 Arrow
和 Player
classes,你需要确保任何代码引用 parent
or stage
or root
vars 是 运行 AFTER item has been added to the display list as those vars are only populated after该项目已放在舞台上。 (这不是时间线代码的问题)。
所以,像这样:
public class Arrow extends MovieClip {
public var player:Player; //a var to hold a local reference to the player
public function Arrow():void {
//right now parent/stage/root are null
//listen for the added to stage event, so you know when it's safe to use the parent and stage and root keywords
this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}
private function addedToStageHandler(e:Event):void {
player = MovieClip(parent).playerInstanceName;
//where player instance name is the instance name of your player on the parent timeline
}
private function doSomethingWithPlayer():void {
if(player){
player.x = 5;
}
}
}
现在,如果您想改用静态变量(可能比 parent 关键字更简单),并且只有 1 个播放器实例,您可以执行以下操作:
public class Player extends MovieClip {
//create a static var to hold a reference to the player instance
public static var me:Player;
public function Player():void {
me = this; //now assign the instance to the static var.
}
}
现在,您可以通过执行 Player.me
(无论上下文如何)从应用中的任何位置访问播放器实例
Player.me.x = 5;
我是 AS3 的新手,我的代码可能看起来有点不对。
基本上,我的程序是如何工作的,我在舞台上有一个 "Level" 的实例,它是一个包含其他几个 objects 的 MovieClip,它们也是具有自己文档的 MovieClips class。在 "Level" class 中,我可以从 "Player" 的实例访问 X 和 Y 位置,但在我的 "Arrow" class 中,这也是一个 child 级别,我无法访问 "Player" 的 X 和 Y。我尝试做的是在 Level class 中设置一个名为 playerX 和 playerY 的 public 静态变量,并将其分配给玩家每帧的 x 和 y 位置,然后我尝试访问 Arrow class 通过执行 "var x:Number = Object(parent).playerX,我也试过 MovieClip(parent).playerX 和 parent.playerX只有玩家 X,他们都不起作用。
总而言之,我需要从 parent class 访问一个变量,但我尝试过的每一种方法都只是 returns 一个错误。
抱歉,如果这有点不清楚,我们将不胜感激!
您需要了解什么是静态变量,什么不是。静态变量是 Class 变量,静态变量不是实例变量。因此,如果我在名为 "Level" 的 class 中创建一个名为 "playerX" 的静态变量,我现在可以这样做:
Level.playerX = 0;
因为 Level 是 class 而 playerX 是 class 的变量。
我不能这样做:
Object(parent).playerX
因为 'parent' 不是 class 并且没有名为 'playerX' 的变量,父级可能是 class 'Level' 的实例但是class 'Level' 的实例没有名为 'playerX' 的变量,class 本身 "Level" 就是具有该变量的变量。
听起来您正在使用 FlashPro Timelines,并且有两个兄弟对象(它们具有相同的父对象 MovieClip/timeline)并且您希望能够从另一个对象中引用一个对象(如果没有,请告诉我)无法正确总结您的问题)。
因为听起来你有 class 文件附加到你的 Arrow
和 Player
classes,你需要确保任何代码引用 parent
or stage
or root
vars 是 运行 AFTER item has been added to the display list as those vars are only populated after该项目已放在舞台上。 (这不是时间线代码的问题)。
所以,像这样:
public class Arrow extends MovieClip {
public var player:Player; //a var to hold a local reference to the player
public function Arrow():void {
//right now parent/stage/root are null
//listen for the added to stage event, so you know when it's safe to use the parent and stage and root keywords
this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}
private function addedToStageHandler(e:Event):void {
player = MovieClip(parent).playerInstanceName;
//where player instance name is the instance name of your player on the parent timeline
}
private function doSomethingWithPlayer():void {
if(player){
player.x = 5;
}
}
}
现在,如果您想改用静态变量(可能比 parent 关键字更简单),并且只有 1 个播放器实例,您可以执行以下操作:
public class Player extends MovieClip {
//create a static var to hold a reference to the player instance
public static var me:Player;
public function Player():void {
me = this; //now assign the instance to the static var.
}
}
现在,您可以通过执行 Player.me
(无论上下文如何)从应用中的任何位置访问播放器实例
Player.me.x = 5;