|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Как осуществить простейший переход от одного "экрана" к другому?
Есть у меня класс Main, который при загрузке флешки подключает класс IntroPage, где изначальная текстовая заставка.. После клика в любом через IntroPage в Main происходит вызов функции:
public function changePage_toEnterName():void { while (numChildren) removeChildAt(0); var enterName:EnterName = new EnterName; addChild(enterName); } Такой вопрос.. Как мне грамотно осуществлять переходы? Вот такой метод мне не подошел: private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var introPage:IntroPage = new IntroPage; addChild(introPage); } вызывает ошибку доступа к свойству. Не знаю, что делать.. Может посоветуете литературу какую-нибудь, которая учит мыслить классово? На всякий случай привожу коды классов. MAIN package { import flash.display.Sprite; import flash.events.Event; /** * ... * @author Volodin A.S. */ public class Main extends Sprite { public static var THIS:Main = null; private var USER_NICK:String = ''; public var upPanel:UpPanel = new UpPanel; public function Main():void { THIS = this; if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var introPage:IntroPage = new IntroPage; addChild(introPage); } public function changePage_toEnterName():void { while (numChildren) removeChildAt(0); var enterName:EnterName = new EnterName; addChild(enterName); } public var connectServer:ConnectServer = new ConnectServer; public function changePage_toConnectServer():void { while (numChildren) removeChildAt(0); addChild(connectServer); } public function setUserNick(nick:String):void { this.USER_NICK = nick; } } } package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFormatAlign; /** * ... * @author Volodin A.S. */ public class IntroPage extends Sprite { public function IntroPage() { var ttf:TextFormat = new TextFormat; ttf.color = 0x000000; ttf.size = 30; ttf.align = TextFormatAlign.CENTER; ttf.font = 'Tahoma'; var tf:TextField = new TextField; tf.defaultTextFormat = ttf; tf.text = 'PERSONS\nClick for continue...'; tf.width = Main.THIS.stage.stageWidth; tf.mouseEnabled = false; var tf_halfHeight:Number = 0; tf_halfHeight = tf.height / 2; tf.y = Main.THIS.stage.stageHeight/2 - tf_halfHeight; addChild(tf); var spr:Sprite = new Sprite; spr.graphics.beginFill(0,0); spr.graphics.drawRect(0, 0, Main.THIS.stage.stageWidth, Main.THIS.stage.stageHeight); addChild(spr); spr.addEventListener(MouseEvent.MOUSE_UP, function (e:Event):void { Main.THIS.changePage_toEnterName(); }); } } } package { import flash.events.KeyboardEvent; import flash.text.TextFieldType; import flash.display.Sprite; import flash.text.TextField; import flash.events.Event; import flash.text.TextFormat; import flash.text.TextFormatAlign; /** * ... * @author Volodin A.S. */ public class EnterName extends Sprite { public static var THIS:EnterName = null; public function EnterName():void { THIS = this; if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point var ttf:TextFormat = new TextFormat; ttf.color = 0x000000; ttf.size = 30; ttf.align = TextFormatAlign.CENTER; ttf.font = 'Tahoma'; var ttf_input:TextFormat = new TextFormat; ttf_input.color = 0x000000; ttf_input.size = 30; ttf_input.align = TextFormatAlign.CENTER; ttf_input.font = 'Tahoma'; var tf:TextField = new TextField; tf.defaultTextFormat = ttf; tf.text = 'Enter your name here:'; tf.width = Main.THIS.stage.stageWidth; tf.mouseEnabled = false; var tf_halfHeight:Number = 0; tf_halfHeight = tf.height / 2; tf.y = Main.THIS.stage.stageHeight/2 - tf_halfHeight/2; addChild(tf); var input:TextField = new TextField(); input.defaultTextFormat = ttf_input; input.width = 300; input.height = 40; //input.y = 20; input.type = TextFieldType.INPUT; input.border = true; var input_halfWidth:Number = 0; input_halfWidth = input.width / 2; input.x = Main.THIS.stage.stageWidth/2 - input_halfWidth; var input_halfHeight:Number = 0; input_halfHeight = tf.height / 2; input.y = Main.THIS.stage.stageHeight/2 + input_halfHeight/2; addChild(input); stage.focus = input; input.addEventListener(KeyboardEvent.KEY_UP, function(e:KeyboardEvent):void { var textField:TextField = e.target as TextField; var str:String = textField.text; if (e.keyCode == 13) { if (str.length > 3) { Main.THIS.setUserNick(input.text); Main.THIS.upPanel.setUserNamePanel(input.text); Main.THIS.changePage_toConnectServer(); } } }); } } } UPD. Цитата:
нет доступа и я не могу удалить его через removeChild(). А если как раз-таки сделать через public var - будет ошибка доступа Добавлено через 28 минут Решил удалять по индексу...
__________________
Надо сменить подпись... |
|
|||||
Сложно понять в чем проблема.
Этот код убирает с дисплея все элементы. Возможно тебе стоит разобраться с тем как он работает. |
|
|||||
Ололошеньки. Родитель управлять должен детьми.
Удаляйте THIS вообще. У всех визуальных объектов есть ссылка на stage, так что ловите в IntroPage то же событие ADDED_TO_STAGE. Если хотите, чтобы Main для ENTERNAME что-то сделал, то либо кидайте из ENTERNAME событие, по которому мейн будет решать, что делать.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
Регистрация: Jan 2013
Сообщений: 126
|
Думаю для вашей задачи подошел бы паттерн Фабричный метод. Если еще не знакомы с этим шаблоном, есть такой фреймворк Flashflowfactory https://code.google.com/archive/p/stroep/, можно взять на изучение, или оптимизировать под свои задачи.
|
|
|||||
.
|
В принципе, вы никуда не денетесь от того, что нужно что-то удалять и что-то добавлять в дисплейлист, чтобы что-то показать или чтобы что-то скрыть. Ну, нормальная практика делать removeChild. И в отличие от смены DisplayObject::visible на false имеет свои преимущества в виде освобождения памяти. Т.е. идеологически вы правы.
Цитата:
Конструкция для современных Flash player (Версии среды выполнения:AIR 3.0, Flash Player 11) заменяется на DisplayObjectContainer::removeChildren() Ну и на слова "у меня есть класс, который бла бла бля", типа вашего , я всегда говорю, что нужно различать класс, и объект, принадлежащий этому типу (классу и его цепочки надклассов и интерфейсов). Когда возникнет понимание что есть класс, а что объект этого класса (на самом деле объект имеет тип этого класса и еще множество типов, как я говорил, надклассов и интерфейсой), будет полегче. Я постиг эту тайну, прочитав внимательно прелюдию к основным паттернам в книжеце, которая изменила мой мир. В конце концов, каждый сам приходит к ООП через что-то своё. |
Часовой пояс GMT +4, время: 20:39. |
|
« Предыдущая тема | Следующая тема » |
|
|