Просмотр полной версии : НЕ получается вызвать функцию слушателя событий
Vansimar
21.09.2011, 09:24
у меня есть функция которая размещает объекты на сцене Locate(); все объекты в массиве countPers
потом я хочу их двигать Enter_Frame'ом вот так public function Animate():void
{
stage.addEventListener(Event.ENTER_FRAME, walking_pers);
}
private function walking_pers(e:Event):void
{
for (var i:int = 0; i < contPers;i++ )
{
massPers[i].x += 10;
}
}
но на экране появляются только точки загрузки(1.2.3.4) что не так?
А генерирует ли stage Event.ENTER_FRAME?
Vansimar
21.09.2011, 09:47
а как можно узнать?
Генерирует, может stage == null ?
У вас скорее всего на этапе конструктора инстанс Энимейта не добавлен в область отображения и stage у него == undefined. Надо так:
public function Animate():void {
if (stage) {
addListeners();
} else {
addEventListener(Event.ADDED_TO_STAGE, addListeners);
}
}
private function addListeners(e:Event = null) {
e.currentTarget.removeEventListener(Event.ADDED_TO_STAGE, addListeners);
stage.addEventListener(Event.ENTER_FRAME, walking_pers);
}
private function walking_pers(e:Event):void {
for (var i:int = 0; i < contPers;i++ ) {
massPers[i].x += 10;
}
}
То есть в любом случае walking_pers не начнёт выполняться раньше, чем вы сделаете addChild над новосозданным Энимейт
может: for (var i:int = 0; i < contPers.length;i++ ) Если все объекты в массиве countPers
Vansimar
21.09.2011, 09:56
addListeners() а что это?никогда такого не видел?почему без точки с запятой?
Добавлено через 1 минуту
может: for (var i:int = 0; i < contPers.length;i++ ) Если
не,у меня там поле определено для количества в массиве,а то почему то свойство length работает через раз
ну да, просто запутали, тогда уж лучше countPers. addListeners -такой же обработчик события как и walking_pers, точка с запятой в принципе тут не обязательно, но лучше ее все таки ставить. Тогда скорее всего нет стейджа
addListeners() а что это?никогда такого не видел?почему без точки с запятой?Описка. Это просто приватный метод класса, который срабатывает при добавлении инстанса класса в область отображения.
Vansimar
21.09.2011, 10:07
а спасибо)понятно)кстати заработало )
Добавлено через 19 минут
а теперь не могу понять тутpublic function CheckPers():void
{
for (var i:int = 0; i < contPers; i++)
{
massPers[i].addEventListener(MouseEvent.CLICK, persClick);
}
}
private function persClick(e:MouseEvent):void
{
this.rotation=-rotation;
}
вешаю на каждый объект в массиве слушатель,а он не работает
а то почему то свойство length работает через раз
Ужас какой )
В этом коде вообще какой-то балаган. То функции называются с маленькой буквы, то с большой. Надо уже определиться как писать.
а теперь не могу понять тут
А что должно происходить?
Слушатель добавляется к какому-то персонажу, а свойство rotation меняется у экземпляра класса, в котором все это происходит.
Надо хотя бы так:
private function persClick(e:MouseEvent):void
{
e.currentTarget.rotation=-rotation; // и тут непонятное что-то отнимается. Если rotation == 0 то отнимая ноль, что мы видим?
}
Vansimar
21.09.2011, 11:05
ну massPers[i] это экземпляр-мувик на сцене,и я хотел ему rotation изменить на противоположную
Добавлено через 5 минут
блин..я и правда натупил..
PsixokoT
21.09.2011, 11:34
У вас скорее всего на этапе конструктора инстанс Энимейта не добавлен в область отображения и stage у него == undefined. Надо так:
public function Animate():void {
if (stage) {
addListeners();
} else {
addEventListener(Event.ADDED_TO_STAGE, addListeners);
}
}
private function addListeners(e:Event = null) {
e.currentTarget.removeEventListener(Event.ADDED_TO_STAGE, addListeners);
stage.addEventListener(Event.ENTER_FRAME, walking_pers);
}
private function walking_pers(e:Event):void {
for (var i:int = 0; i < contPers;i++ ) {
massPers[i].x += 10;
}
}
То есть в любом случае walking_pers не начнёт выполняться раньше, чем вы сделаете addChild над новосозданным Энимейт
private function addListeners(e:Event = null) {
if (e) e.currentTarget.removeEventListener(Event.ADDED_TO_STAGE, addListeners);
stage.addEventListener(Event.ENTER_FRAME, walking_pers);
}
Vansimar
21.09.2011, 14:40
private function persClick(e:MouseEvent):void
{
e.currentTarget.rotation=45;
} вот так сделал,не помогло
Добавлено через 30 минут
Кто нибудь подскажет?
Добавлено через 39 минут
попробовал трейсить private function persClick(e:MouseEvent):void
{
e.currentTarget.rotation=45;
trace("someTh");
} Ничего не выводит,значит слушатель не повесился,
а как не повесился если я тут вешаю public function CheckPers():void
{
for (var i:int = 0; i < contPers; i++)
{
massPers[i].addEventListener(MouseEvent.CLICK, persClick);
}
}
Добавлено через 47 минут
все,сделал
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.