Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 31.01.2016, 00:48
EndoCrinologist вне форума Посмотреть профиль Отправить личное сообщение для EndoCrinologist Найти все сообщения от EndoCrinologist
  № 1  
Ответить с цитированием
EndoCrinologist
 
Аватар для EndoCrinologist

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
По умолчанию Как осуществить простейший переход от одного "экрана" к другому?

Есть у меня класс Main, который при загрузке флешки подключает класс IntroPage, где изначальная текстовая заставка.. После клика в любом через IntroPage в Main происходит вызов функции:
Код AS3:
public function changePage_toEnterName():void
{
	while (numChildren) removeChildAt(0);
	var enterName:EnterName = new EnterName;
	addChild(enterName);
}
В классе EnterName юзер вводит свое имя. Это имя я хочу отобразить на верхней панели, которая находится в классе UpPanel. При нажатии на Enter после того, как юзер закончил вводить имя, оно должно отобразиться на ней в текстовом поле на панели UpPanel. Но этого не происходит, так как у меня все функции перехода от экрана к экрану содержат это:
Код AS3:
while (numChildren) removeChildAt(0);
Такой вопрос.. Как мне грамотно осуществлять переходы?
Вот такой метод мне не подошел:
Код AS3:
private function init(e:Event = null):void 
{
	removeEventListener(Event.ADDED_TO_STAGE, init);
 
	var introPage:IntroPage = new IntroPage;
	addChild(introPage);
}
Потому что в IntroPage такая вот строка
Код AS3:
tf.width = Main.THIS.stage.stageWidth;
вызывает ошибку доступа к свойству.

Не знаю, что делать.. Может посоветуете литературу какую-нибудь, которая учит мыслить классово?

На всякий случай привожу коды классов.
MAIN
Код AS3:
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;
		}
 
	}
 
}
INTROPAGE
Код AS3:
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();
			});
		}
 
	}
 
}
ENTERNAME
Код AS3:
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();
					}
				}
			});
		}
 
	}
 
}
P.S. А тут есть спойлеры, чтобы сжать содержимое поста?

UPD.
Цитата:
Потому что в IntroPage такая вот строка
tf.width = Main.THIS.stage.stageWidth;
вызывает ошибку доступа к свойству.
Перепутал, не из-за этого. А из-за того, что к этой переменной
Код AS3:
var introPage:IntroPage = new IntroPage;
нет доступа и я не могу удалить его через removeChild().
А если как раз-таки сделать через public var - будет ошибка доступа

Добавлено через 28 минут
Решил удалять по индексу...
__________________
Надо сменить подпись...

Старый 31.01.2016, 01:28
MoHaX вне форума Посмотреть профиль Отправить личное сообщение для MoHaX Найти все сообщения от MoHaX
  № 2  
Ответить с цитированием
MoHaX
 
Аватар для MoHaX

Регистрация: Aug 2004
Сообщений: 422
Отправить сообщение для MoHaX с помощью ICQ
Сложно понять в чем проблема.

Код AS3:
while (numChildren) removeChildAt(0);
Этот код убирает с дисплея все элементы. Возможно тебе стоит разобраться с тем как он работает.

Старый 31.01.2016, 01:48
EndoCrinologist вне форума Посмотреть профиль Отправить личное сообщение для EndoCrinologist Найти все сообщения от EndoCrinologist
  № 3  
Ответить с цитированием
EndoCrinologist
 
Аватар для EndoCrinologist

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
да я знаю, как он удаляет.. удаляет всех детей, начиная с первого, пока на сцене есть дети... ладно. Сложно мне пока в этом всём разобраться..
__________________
Надо сменить подпись...

Старый 31.01.2016, 03:02
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 4  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Ололошеньки. Родитель управлять должен детьми.
Удаляйте THIS вообще. У всех визуальных объектов есть ссылка на stage, так что ловите в IntroPage то же событие ADDED_TO_STAGE.
Если хотите, чтобы Main для ENTERNAME что-то сделал, то либо кидайте из ENTERNAME событие, по которому мейн будет решать, что делать. Либо прокидывайте в детей ссылку на мейн, и потом жутко мучайтесь.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 16.02.2016, 03:54
EndoCrinologist вне форума Посмотреть профиль Отправить личное сообщение для EndoCrinologist Найти все сообщения от EndoCrinologist
  № 5  
Ответить с цитированием
EndoCrinologist
 
Аватар для EndoCrinologist

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
Спасибо за ответ
__________________
Надо сменить подпись...

Старый 25.02.2016, 19:08
namespaces вне форума Посмотреть профиль Отправить личное сообщение для namespaces Найти все сообщения от namespaces
  № 6  
Ответить с цитированием
namespaces
 
Аватар для namespaces

Регистрация: Jan 2013
Сообщений: 126
Думаю для вашей задачи подошел бы паттерн Фабричный метод. Если еще не знакомы с этим шаблоном, есть такой фреймворк Flashflowfactory https://code.google.com/archive/p/stroep/, можно взять на изучение, или оптимизировать под свои задачи.

Старый 25.02.2016, 21:35
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 7  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
В принципе, вы никуда не денетесь от того, что нужно что-то удалять и что-то добавлять в дисплейлист, чтобы что-то показать или чтобы что-то скрыть. Ну, нормальная практика делать removeChild. И в отличие от смены DisplayObject::visible на false имеет свои преимущества в виде освобождения памяти. Т.е. идеологически вы правы.

Цитата:
Сообщение от EndoCrinologist Посмотреть сообщение
Потому что в IntroPage такая вот строка
Код AS3:
tf.width = Main.THIS.stage.stageWidth;
вызывает ошибку доступа к свойству.
Тут только три варианта: на момент исполнения либо не определено tf, либо Main.THIS, либо, что более часто встречается, Main.THIS.stage.

Код AS3:
while (numChildren) removeChildAt(0);
Конструкция для современных Flash player (Версии среды выполнения:AIR 3.0, Flash Player 11) заменяется на DisplayObjectContainer::removeChildren()

Ну и на слова "у меня есть класс, который бла бла бля", типа вашего
Код:
Есть у меня класс Main, который при загрузке флешки подключает класс IntroPage,
,
я всегда говорю, что нужно различать класс, и объект, принадлежащий этому типу (классу и его цепочки надклассов и интерфейсов). Когда возникнет понимание что есть класс, а что объект этого класса (на самом деле объект имеет тип этого класса и еще множество типов, как я говорил, надклассов и интерфейсой), будет полегче. Я постиг эту тайну, прочитав внимательно прелюдию к основным паттернам в книжеце, которая изменила мой мир. В конце концов, каждый сам приходит к ООП через что-то своё.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 03:29.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.