|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
классы, как правильно работать с ними
учусь работать с классами, до этого писал в первом кадре
собственно есть 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); } } } 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, где уже и писать все слушатели от других классов, но моя первая попытка не удалась, совсем всё перестало работать, потом ещё раз попробую, но если можно, покажите что и как на этом коде заранее всем спасибо Добавлено через 11 минут самый дурацкий вопрос this - что это вообще? почти везде(или везде) его можно не писать и всё работать будет, как понимаю он указывает на объект. То бишь если я создаю класс и он наследует какой либо объект из библиотеки, то если я добавляю this к слушателю описания этого класса, то слушатель привязывается непосредственно к этому объекту из библиотеки? Но вроде даже без его использования происходит тоже самое. Хотя если this.addEventListener(Event.ENTER_FRAME, fn); заменить на object.addEventListener(Event.ENTER_FRAME, fn) - то тут непосредственно должен привязаться к указанному объекту |
|
|||||
Простой пример по работе this.
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
__________________
Книги и желание лучшие учителя. |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Vektor не понял
Добавлено через 37 секунд точнее понял что хотите показать, но я бы никогда так не стал писать Добавлено через 2 часа 21 минуту такс, со всеми вопросами разобрался Добавлено через 2 часа 23 минуты вопрос this.removeChild(str_daub); где str_daub - класс, мусорщик его уберёт полностью? Последний раз редактировалось neonoviiwolf; 30.11.2014 в 20:01. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Мусорщик не убирает классы.
Ваш str_daub — не класс, а ссылка на экземпляр. removeChild() это метод, убирающий экземпляр только из Списка Отображения (дисплейлист). К мусорщику, освобождающему память, он не имеет никакого отношения.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Wolsh спасибо!
Помогите разобраться, не могу заставить работать слушатель клавиатуры. Если писать в одном кадре, все прекрасно работает, а через классы - никак. Пробовал вызывать и через main и в теле класса (соответственно менял доступ public/private). Так же подставка в классе main вместо this - stage/gl_ship ничего не меняет gl_ship_mc - это мувик, мне нужно заставить его двигаться 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); } } } 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. |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
samana пояснял же, что пробовал и со stage, никакого эффекта
|
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
А Вы точно кликали по "чему-то" прежде чем использовать клавиатуру?
|
|
|||||
Регистрация: 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() 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. |
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
Если у Вас класс main установлен, как документ класс, то для работы кода выше
нужно в main исправить this на stage. |
Часовой пояс GMT +4, время: 19:23. |
|
« Предыдущая тема | Следующая тема » |
|
|