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

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

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

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
Question Как использовать KeyboardEvent в классах?

Не могу понять структуру кода. Как использовать наследование к KeyboardEvent ?
у меня есть основной класс Engine - вход в игру.
Далее имеется класс Ship - он размещается, я так понимаю на stage ( сцене ) класса Engine, так как он главный класс.
Я прописал события клавиатуры в классе Ship, только ничего не работает. Как правильно расположить KeyboardEvent в классе Ship ?
Код AS3:
addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
 
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
 
this.addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
не понимаю.. По идее сцена stage - одна. и Слушателе должны размещаться на ней а не на мувике Ship. В чем проблема?
За ранее спасибо.

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

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Как только будет создан экземпляр класса Ship, доступа к stage не будет и подписаться на событие KeyboardEvent.KEY_DOWN в конструкторе не получится. Нужно дождаться, пока Ship не будет добавлен на stage. В конструкторе класса Ship напишите:
Код AS3:
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
И далее напишите:
Код AS3:
private function init(event:Event = null):void
{
    stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
}

Старый 19.05.2013, 20:29
zCHESNOKz вне форума Посмотреть профиль Отправить личное сообщение для zCHESNOKz Посетить домашнюю страницу zCHESNOKz Найти все сообщения от zCHESNOKz
  № 3  
Ответить с цитированием
zCHESNOKz
 
Аватар для zCHESNOKz

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
да, все работает, огромное спасибо. а можете конкретней объяснить, почему так происходит ?

Код:
Как только будет создан экземпляр класса Ship, доступа к stage не будет

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Потому что он еще не добавлен в список отображения во время инициализации конструктора. Ссылка на стейдж появляется только после того, как объект добавили в дисплей лист через addChild.

Старый 19.05.2013, 20:43
zCHESNOKz вне форума Посмотреть профиль Отправить личное сообщение для zCHESNOKz Посетить домашнюю страницу zCHESNOKz Найти все сообщения от zCHESNOKz
  № 5  
Ответить с цитированием
zCHESNOKz
 
Аватар для zCHESNOKz

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
я думаю в последующем мне придется часто использовать данный код, так как я не смогу работать объектами, можно сказать, не оттянув время для его инициализации на сцене, верно?

Добавлено через 1 минуту


а нужно ли после писать ?
Код AS3:
removeEventListener(Event.ADDED_TO_STAGE, init);

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
а нужно ли после писать ?
Если не предполагается, что экземпляр будет повторно добавляться, и не нужно чтобы вызывался какой-то код при добавлении на сцену, то да, желательно.

Старый 19.05.2013, 22:11
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 7  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
то да, желательно
Обязательно. Иначе хендлер сработает два раза.
__________________
тут я

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Иначе хендлер сработает два раза.
Сань, с чего ты это взял?
Один раз он сработает.
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
 
 
	public class Main extends Sprite {
 
 
		public function Main() {
			var test:Test = new Test();
			addChild(test);
		}	
	}
}
 
import flash.display.Sprite;
import flash.events.Event;
 
internal class Test extends Sprite {
 
	public function Test() {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
	}	
 
	private function init(e:Event = null):void {
		trace("Добавлено"); // выводится только один раз
 
	}
}
Плюс, не обязательно же при добавлении будут какие-то инициализации. У меня часто бывает так, что при добавлении добавляется энтерфрейм слушатель, к примеру, а при удалении из дисплей листа и энтерфрейм слушатель удаляется.

Старый 20.05.2013, 08:55
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 9  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
энтерфрейм лучше использовать для мувиклипов, а для для однофреймовых спрайтов сетинтервал

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
чем лучше?
Цитата:
Вместо использования метода setInterval() рекомендуется создавать объект Timer с заданным интервалом, в котором в качестве параметра repeatCount используется значение 0 (то есть таймер выполняется бесконечно).
Из официальной справки.
А вообще, это
Цитата:
энтерфрейм лучше использовать для мувиклипов, а для для однофреймовых спрайтов сетинтервал
не правда. Энтерфрейм и количество (или вообще наличие кадров) у объекта, не имеют ничего общего.
Для спрайта так же можно использовать энтер фрейм, как и для мувиклипа и для других дисплей объектов

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

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

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


 


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


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