РЕДАКТИРОВАТЬ: если подумать, вам не нужно этого делать, если ваше BaseMenu является производным от спрайта или MovieClip, я вполне уверен. поэтому просто измените stageRef.removeChild () на stage.removeChild ()
ваш stageRef на самом деле не указывает на реальную сцену. (вроде)
Также вы должны попытаться привыкнуть к использованию событий ADDED_TO_STAGE.
package src
{
import flash.display.Sprite;
import flash.events.Event;
public class MainDocument extends Sprite
{
private var myMenus:BaseMenu;
public function MainDocument()
{
addEventListener(Event.ADDED_TO_STAGE, initMain);
}
private function initMain(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, initMain);
myMenus = new BaseMenu();
addChild(myMenus);
}
}
}
package src
{
import flash.display.Sprite;
import flash.events.Event;
public class BaseMenu extends Sprite
{
public function BaseMenu()
{
addEventListener(Event.ADDED_TO_STAGE, initBanseMenu);
}
private function initBanseMenu(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, initBanseMenu);
trace(stage.stageHeight);
}
}
}
Как видно из трассировки, сцена доступна без ссылки.
Это также должно работать нормально. (фактически этап - это «этап», а не «этап», поэтому обязательно отправьте «этап» в конструктор BaseMenu.
public var stageRef:Stage;
public function BaseMenu(stageRef:Stage)
{
this.stageRef = stageRef;
alpha = 0;
}
Хорошо, здесь вы можете поместить эти файлы в проект flashdevelop или что вы используете и протестировать его; -).
package src
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class MainDocument extends Sprite
{
public var myMenuTest:BaseMenu;
public var mySubMenuTest:SubMenu;
public function MainDocument()
{
addEventListener(Event.ADDED_TO_STAGE, initMain);
}
private function initMain(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, initMain);
myMenuTest = new BaseMenu(stage);
myMenuTest.x = stage.stageWidth / 2;
myMenuTest.y = stage.stageHeight / 2;
//myMenuTest.Load(); // we can load our Main menu now if we want.
mySubMenuTest = new SubMenu(stage);
mySubMenuTest.x = 100;
mySubMenuTest.y = 100;
stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp);
}
// for testing purposes.
private function handleKeyUp(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.UP)
myMenuTest.Unload(mySubMenuTest);
else if (e.keyCode == Keyboard.DOWN)
mySubMenuTest.Unload(myMenuTest);
else
trace(e.keyCode);
}
}
}
package src
{
import flash.display.Sprite;
import flash.display.Stage;
public class BaseMenu extends Sprite
{
public var stageRef:Stage;
public var loadNext:BaseMenu;
public function BaseMenu(stageRef:Stage)
{
this.stageRef = stageRef;
}
public function Unload(loadMe:BaseMenu = null):void
{
if (loadMe != null)
{
loadNext = loadMe;
}
Remove(); // add your tween.
}
public function Load():void
{
// this is just so we can have something to see for the test.
drawTest();
stageRef.addChild(this);
// add your tween
}
public function Remove():void
{
if (stageRef.contains(this))
stageRef.removeChild(this);
if (loadNext != null)
loadNext.Load();
}
protected function drawTest():void
{
graphics.clear();
graphics.lineStyle(1, 0);
graphics.beginFill(0xccccff);
graphics.drawCircle(0, 0, 20);
graphics.endFill();
}
}
}
package src
{
import flash.display.Stage;
public class SubMenu extends BaseMenu
{
public function SubMenu(stageRef:Stage)
{
super(stageRef);
}
}
}
Это должно объяснить, как я имел в виду.
Чтобы протестировать эту программу, просто загрузите ее в режиме отладки и используйте клавиши со стрелками вверх или вниз для переключения между двумя классами меню. нажатие любой другой клавиши вне зависимости от того, какое меню находится, приведет к тому, что код клавиши станет стандартным. (отладочное окно вывода).
Очевидно, 1 класс на файл.
Надеюсь, это прояснит ситуацию.