PDA

Просмотр полной версии : НЕ получается вызвать функцию слушателя событий


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) что не так?

kackbip
21.09.2011, 09:41
А генерирует ли stage Event.ENTER_FRAME?

Vansimar
21.09.2011, 09:47
а как можно узнать?

Inet_PC
21.09.2011, 09:49
Генерирует, может stage == null ?

BuKT
21.09.2011, 09:50
У вас скорее всего на этапе конструктора инстанс Энимейта не добавлен в область отображения и 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 над новосозданным Энимейт

Inet_PC
21.09.2011, 09:53
может: 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 работает через раз

Inet_PC
21.09.2011, 10:01
ну да, просто запутали, тогда уж лучше countPers. addListeners -такой же обработчик события как и walking_pers, точка с запятой в принципе тут не обязательно, но лучше ее все таки ставить. Тогда скорее всего нет стейджа

BuKT
21.09.2011, 10:06
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;
}
вешаю на каждый объект в массиве слушатель,а он не работает

goodguy
21.09.2011, 10:46
а то почему то свойство 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 минут
все,сделал