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

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

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

Регистрация: Jun 2014
Сообщений: 558
По умолчанию классы, как правильно работать с ними

учусь работать с классами, до этого писал в первом кадре
собственно есть
Код AS3:
package {
 
	import flash.display.MovieClip;
	import package_cl.str_daub_cl;
	import package_cl.gl_ship_cl;
 
	public class main extends MovieClip {
		public var str_daub: str_daub_cl;
		public var gl_ship: gl_ship_cl;
 
		public function main() {
			str_daub = new str_daub_cl();
			this.addChild(str_daub);
		}
	}
}
Код AS3:
package package_cl {
 
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
 
	public class str_daub_cl extends Sprite {
 
		public var inkwar_str: inkwar_mc = new inkwar_mc(); 
		private var str_daub_1: str_daub_1_mc = new str_daub_1_mc();
		private var str_daub_2: str_daub_2_mc = new str_daub_2_mc();
		private var str_daub_3: str_daub_3_mc = new str_daub_3_mc();
		private var str_btn: str_btn_mc = new str_btn_mc();
		public var str_daub_Array: Array = new Array(str_daub_1,str_daub_3, str_daub_2, str_btn);
 
		public function str_daub_cl(): void {
			this.addEventListener(Event.ADDED_TO_STAGE, str_timer);
		}
 
		private var _timer: Timer = new Timer(600, 4);
 
		private function str_timer(e: Event): void {
			this.removeEventListener(Event.ADDED_TO_STAGE, str_timer);
			_timer.addEventListener("timer", fn_timer);
			_timer.start();
			inkwar_str.x = 800;
			inkwar_str.y = 300;
			this.addChild (inkwar_str);
		}
 
		private var i: Number = 0;
 
		private function fn_timer(e: TimerEvent): void {
			this.addChild(str_daub_Array[i]);
			if (i == 0) {
				str_daub_Array[i].x = 400;
				str_daub_Array[i].y = 500;
 
			}
			if (i == 1) {
				str_daub_Array[i].x = 1200;
				str_daub_Array[i].y = 350;
			}
			if (i == 2) {
				str_daub_Array[i].x = 900;
				str_daub_Array[i].y = 900;
			}
			if (i == 3){
				str_daub_Array[i].alpha = 0.1;
				str_daub_Array[i].scaleX = 0.7;
				str_daub_Array[i].scaleY = 0.7;
				str_daub_Array[i].x = 800;
				str_daub_Array[i].y = 500;
				this.addEventListener(Event.ENTER_FRAME, fn_str_btn);
				this.removeEventListener ("timer", fn_timer);
			}
			++i;
		}
 
		private function fn_str_btn (e: Event):void{
			if (str_daub_Array[3].alpha < 1){
				str_daub_Array[3].alpha *= 1.04;
			}
			else{
				this.removeEventListener(Event.ENTER_FRAME, fn_str_btn);
			}
		}
	}
}
через класс main вызываю str_daub_cl, он отрабатывает. Дальше мне нужно вызвать класс gl_ship_cl, если пользователь нажмёт на кнопку. Слушатели сделаю, не проблема. Вопрос как правильно сделать пересылку (не знаю как правильно выразиться), что пользователь нажал на кнопку, т.е. я могу конечно вызвать gl_ship_cl через слушателя в классе str_daub_cl, но мне этот класс больше не нужен (и зачем тогда мне main?), в идеале его полностью убрать (подскажите как правильно подчистить, нужно ли убивать таймер, если он уже отработал? или вообще можно ли сразу весь класс снести разом). вот и появился вопрос, как передать событие обратно в main, что бы через него вызвать следующий класс по сценарию, после завершения первого? Должно что-то получится типо слушателя события в main, который ждёт события от str_daub_cl.
п.с. так же читал, что стоит расширить класс main, где уже и писать все слушатели от других классов, но моя первая попытка не удалась, совсем всё перестало работать, потом ещё раз попробую, но если можно, покажите что и как на этом коде
заранее всем спасибо

Добавлено через 11 минут
самый дурацкий вопрос this - что это вообще? почти везде(или везде) его можно не писать и всё работать будет, как понимаю он указывает на объект. То бишь если я создаю класс и он наследует какой либо объект из библиотеки, то если я добавляю this к слушателю описания этого класса, то слушатель привязывается непосредственно к этому объекту из библиотеки? Но вроде даже без его использования происходит тоже самое. Хотя если this.addEventListener(Event.ENTER_FRAME, fn); заменить на object.addEventListener(Event.ENTER_FRAME, fn) - то тут непосредственно должен привязаться к указанному объекту

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

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
Простой пример по работе this.
Код AS3:
package {
	import flash.display.Sprite;
	public class TestThis extends Sprite {
		private var tText:String="Global";
		public function TestThis() {
			// constructor code
			fTest();
		}
		private function fTest():void {
			var tText:String="local";
			trace("this.tText "+this.tText);
			trace("tText "+tText);
		}
	}
}
Вывод
this.tText Global
tText local
__________________
Книги и желание лучшие учителя.

Старый 30.11.2014, 16:25
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 3  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Vektor не понял

Добавлено через 37 секунд
точнее понял что хотите показать, но я бы никогда так не стал писать

Добавлено через 2 часа 21 минуту
такс, со всеми вопросами разобрался

Добавлено через 2 часа 23 минуты
вопрос this.removeChild(str_daub); где str_daub - класс, мусорщик его уберёт полностью?


Последний раз редактировалось neonoviiwolf; 30.11.2014 в 20:01.
Старый 01.12.2014, 00:24
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Мусорщик не убирает классы.
Ваш str_daub — не класс, а ссылка на экземпляр.
removeChild() это метод, убирающий экземпляр только из Списка Отображения (дисплейлист). К мусорщику, освобождающему память, он не имеет никакого отношения.
__________________
Reality.getBounds(this);

Старый 01.12.2014, 06:49
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 5  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Wolsh спасибо!
Помогите разобраться, не могу заставить работать слушатель клавиатуры. Если писать в одном кадре, все прекрасно работает, а через классы - никак. Пробовал вызывать и через main и в теле класса (соответственно менял доступ public/private). Так же подставка в классе main вместо this - stage/gl_ship ничего не меняет
gl_ship_mc - это мувик, мне нужно заставить его двигаться
Код AS3:
package {
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import flash.events.Event;
	import flash.display.MovieClip;
	import package_cl.str_daub_cl;
	import package_cl.gl_ship_cl;
 
	public class main extends MovieClip {
		public var str_daub: str_daub_cl;
		public var gl_ship: gl_ship_cl;
 
		public function main() {
			str_daub = new str_daub_cl();
			this.addChild(str_daub);
			str_daub.str_daub_Array[3].addEventListener(MouseEvent.CLICK, fn_click_btn);
		}
		public function fn_click_btn(e: MouseEvent): void {
			str_daub.str_daub_Array[3].removeEventListener(MouseEvent.CLICK, fn_click_btn);
			this.removeChild(str_daub);
			gl_ship = new gl_ship_cl();
			this.addChild(gl_ship);
			this.addEventListener(KeyboardEvent.KEY_DOWN, gl_ship.fn_SetKeyPressed);
			this.addEventListener(KeyboardEvent.KEY_UP, gl_ship.fn_UnsetKeyPressed);
		}
	}
}
Код AS3:
package package_cl {
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import flash.events.Event;
	import package_cl.global_variable_cl;
 
	public class gl_ship_cl extends gl_ship_mc {
 
		private var upPressed: Boolean = false;
		private var leftPressed: Boolean = false;
		private var rightPressed: Boolean = false;
		public var gl_variable: global_variable_cl;
 
		public function gl_ship_cl() {
			gl_variable = new global_variable_cl();
			this.addEventListener(Event.ADDED_TO_STAGE, fn_str);
		}
		private function fn_str (e: Event): void{
			this.removeEventListener(Event.ADDED_TO_STAGE, fn_str);
			//this.addEventListener(KeyboardEvent.KEY_DOWN, fn_SetKeyPressed);
			//this.addEventListener(KeyboardEvent.KEY_UP, fn_UnsetKeyPressed);
		}
		public function fn_SetKeyPressed(event: KeyboardEvent): void {
			switch (event.keyCode) {
				case Keyboard.UP:
					{
						trace(upPressed);
						upPressed = true;
						break;
					}
				case Keyboard.LEFT:
					{
						leftPressed = true;
						break;
					}
				case Keyboard.RIGHT:
					{
						rightPressed = true;
						break;
					}
			}
		}
 
		public function fn_UnsetKeyPressed(event: KeyboardEvent): void {
			trace(1);
			switch (event.keyCode) {
				case Keyboard.UP:
					{
						upPressed = false;
						break;
					}
				case Keyboard.LEFT:
					{
						leftPressed = false;
						break;
					}
				case Keyboard.RIGHT:
					{
						rightPressed = false;
						break;
					}
			}
		}
	}
}


Последний раз редактировалось neonoviiwolf; 01.12.2014 в 07:25.
Старый 01.12.2014, 11:27
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 6  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
На событие клавиатуры нужно подписывать stage.
Код AS3:
stage.addEventListener(KeyboardEvent.KEY_DOWN, fn_SetKeyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, fn_UnsetKeyPressed);

Старый 01.12.2014, 14:50
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 7  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
samana пояснял же, что пробовал и со stage, никакого эффекта

Старый 01.12.2014, 15:36
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 8  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
А Вы точно кликали по "чему-то" прежде чем использовать клавиатуру?

Старый 01.12.2014, 16:12
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 9  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
весь сценарий работает до этого момента, выводятся все элементы, кнопка нажимается, предыдущий класс удаляется со сцены, появляется мувик от проблемного класса, вот и всё, слушатели объявляются, но функции не работают. Через трейс я вижу, что программа прошла момент объявления слушателя событий, но функции, к которым привязаны события не работают, почему не знаю, т.к. брал всё из рабочей моей программы, где все написано в одном кадре, собственно я её и переделываю. Я искал по инету, где используется аналогичный алгоритм, нашёл один в один, разница лишь в том, что он создаёт всё в классе main, а я создаю ссылку из класса main. Если б я понимал в чём проблема, я бы её смог решить, но я вообще не вижу проблемы, никаких предупреждений программа не выдаёт. Всё логично, то что я объявляю слушатели в main - это от безысходности, так как больше уже вариантов нет, но всё равно не работает

Добавлено через 8 минут
хотя если сделать вот так, то пишет, что:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at package_cl::gl_ship_cl()
at main/fn_click_btn()


Код AS3:
package package_cl {
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import flash.events.Event;
	import package_cl.global_variable_cl;
 
	public class gl_ship_cl extends gl_ship_mc {
 
		public var upPressed: Boolean = false;
		public var leftPressed: Boolean = false;
		public var rightPressed: Boolean = false;
		public var gl_variable: global_variable_cl;
 
		public function gl_ship_cl() {
			//gl_variable = new global_variable_cl();
			//this.addEventListener(Event.ADDED_TO_STAGE, fn_str);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, fn_SetKeyPressed);
			stage.addEventListener(KeyboardEvent.KEY_UP, fn_UnsetKeyPressed);
		}
		/*private function fn_str(e: Event): void {
			this.removeEventListener(Event.ADDED_TO_STAGE, fn_str);
 
		}*/
		private function fn_SetKeyPressed(event: KeyboardEvent): void {
			trace(222);
			switch (event.keyCode) {
 
				case Keyboard.UP:
					{
						trace(upPressed);
						upPressed = true;
						break;
					}
				case Keyboard.LEFT:
					{
						leftPressed = true;
						break;
					}
				case Keyboard.RIGHT:
					{
						rightPressed = true;
						break;
					}
			}
		}
 
		private function fn_UnsetKeyPressed(event: KeyboardEvent): void {
			trace(1);
			switch (event.keyCode) {
				case Keyboard.UP:
					{
						upPressed = false;
						break;
					}
				case Keyboard.LEFT:
					{
						leftPressed = false;
						break;
					}
				case Keyboard.RIGHT:
					{
						rightPressed = false;
						break;
					}
			}
		}
	}
}


Последний раз редактировалось neonoviiwolf; 01.12.2014 в 16:25.
Старый 01.12.2014, 16:27
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 10  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Если у Вас класс main установлен, как документ класс, то для работы кода выше
нужно в main исправить this на stage.
Код AS3:
stage.addEventListener(KeyboardEvent.KEY_DOWN, gl_ship.fn_SetKeyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, gl_ship.fn_UnsetKeyPressed);

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

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

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


 


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


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