为什么我不能访问其他类的公共变量?
问题描述:
我想在我的游戏文档类中定义我的变量,然后在我的Movement类中使用其中的一些变量。但是,当我在运动类中使用这些变量时,我收到了大量的编译错误,说它们都是未定义的。为什么我不能访问其他类的公共变量?
因此我的问题是,为什么我的公共变量不会传递给我的其他类?我通过做import game;
来导入课程,所以这让我感到困惑。我可能只是做错了,但非常感谢帮助。
时间轴
addChild((new Movement));
游戏文档类
package
{
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class game extends MovieClip
{
public var area1:Boolean = true;
public var area2:Boolean = false;
public var area3:Boolean = false;
public var player1:Boolean = true;
public var playerPosKeeper_mc:MovieClip = new mc_PlayerPosKeeper();
public var up_dpad:MovieClip = new dpad_Up();
public var down_dpad:MovieClip = new dpad_Down();
public var left_dpad:MovieClip = new dpad_Left();
public var right_dpad:MovieClip = new dpad_Right();
public var menu_dpad:MovieClip = new dpad_Menu();
public var run_dpad:MovieClip = new dpad_Menu();
public var barrierRoof1_game:MovieClip = new game_BarrierRoof();
public var barrierRoof2_game:MovieClip = new game_BarrierRoof();
public var barrierSide1_game:MovieClip = new game_BarrierSide();
public var barrierSide2_game:MovieClip = new game_BarrierSide();
public function game()
{
trace("SUCCESS | Constructed Game Class");
}
}
}
运动类
package
{
import game;
import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TouchEvent;
import flash.net.dns.AAAARecord;
import flash.ui.Multitouch;
import flash.ui.MultitouchInputMode;
public class Movement extends MovieClip
{
var inMotion:Boolean = false;
public function Movement()
{
trace("SUCCESS | Constructed Movement Class");
addChild(playerPosKeeper_mc);
playerPosKeeper_mc.x = 384;
playerPosKeeper_mc.y = 46;
addChild(up_dpad);
up_dpad.x = 55;
up_dpad.y = 336;
addChild(down_dpad);
down_dpad.x = 57;
down_dpad.y = 432;
addChild(left_dpad);
left_dpad.x = 19;
left_dpad.y = 372;
addChild(right_dpad);
right_dpad.x = 118;
right_dpad.y = 372;
addChild(menu_dpad);
menu_dpad.x = 61;
menu_dpad.y = 377;
addChild(run_dpad);
run_dpad.x = 684;
run_dpad.y = 369;
addChild(barrierRoof1_game);
barrierRoof1_game.x = 0;
barrierRoof1_game.y = 0;
addChild(barrierRoof2_game);
barrierRoof2_game.x = 0;
barrierRoof2_game.y = 470;
addChild(barrierSide1_game);
barrierSide1_game.x = 0;
barrierSide1_game.y = 0;
addChild(barrierSide2_game);
barrierSide2_game.x = 790;
barrierSide2_game.y = 0;
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
up_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, moveUpTouchBEGIN);
up_dpad.addEventListener(TouchEvent.TOUCH_END, moveUpTouchEND);
}
public function moveUpTouchBEGIN(e:TouchEvent):void
{
trace("Touch Began")
}
public function moveUpTouchEND(e:TouchEvent):void
{
trace("Touch Ended")
}
}
}
答
你困惑因为“公共”并不意味着“全球”。声明变量为公共意味着您想授予对任何实体的访问权限,因为实体知道,其中该变量是。
让我们看看你有什么。
- 顶部展示对象:舞台。
- 主要时间表:游戏是一个阶段的孩子。
- MovieClip up_dpad,down_dpad等等,都是游戏实例的字段。
- 运动:实例是游戏的一个孩子。
在运动中,您尝试访问up_dpad和其他人,但他们保留为游戏实例的字段,并且与Movement实例无关。这就是为什么他们不在运动的地址范围内。
所以,如果你想把这些变量声明为游戏场,你需要以正确的方式从运动中解决它们。
忘记时间表。在游戏中(为求的缘故永远不会调用类的小写,除非在枪口下),这是,我认为,一个根文档类:
public function Game()
{
trace("SUCCESS | Constructed Game Class");
// Pass reference to this instance to the constructor.
var aMove:Movement = new Movement(this);
// Add it as a child.
addChild(aMove);
}
运动:
public function Movement(main:Game)
{
trace("SUCCESS | Constructed Movement Class");
// Access variables inside Game instance via given reference.
addChild(main.playerPosKeeper_mc);
main.playerPosKeeper_mc.x = 384;
main.playerPosKeeper_mc.y = 46;
// ...and so on
}
这些都是基础知识面向对象编程。如果你想访问对象内的任何东西,你需要先访问对象。
谢谢你一步一步的解释。非常感激。 – UnAlpha
@ user2712413它让我想起2001年,当我被困在基本相同的东西时为什么我的代码在时间线A上看不到变量声明在时间线B上,那是Flash 5和奇怪的ActionScript,甚至不是AS1。在我终于获得MovieClip层次结构和直接寻址后,它变得相当容易。 – Organis