Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Событие не отслеживается (http://www.flasher.ru/forum/showthread.php?t=207984)

firefedot 24.05.2014 18:15

Событие не отслеживается
 
Доброе...
Переписываю код из кадров в классы. Столкнулся с проблемой, что если вызывать события, то они не отрабатываются.

Вот пример:


Код AS3:

btn_unlock_1.addEventListener(MouseEvent.CLICK, lvl_1_stage);
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, downPers);
stage.addEventListener(KeyboardEvent.KEY_UP, upPers);
 
function lvl_1_stage(event:MouseEvent):void{
        removeChild(game_menu);
        addChild(container_lvl_1);
        container_lvl_1.addChild(lvl_1);
        hero_1.x=190;
        hero_1.y=580;
        container_lvl_1.addChild(hero_1);
        trace("Создан первый уровень и персонаж");
        addEventListener(Event.ENTER_FRAME, speedPers);
 
}
 
function downPers(event:KeyboardEvent):void{
        trace(event.keyCode);
        if(event.keyCode==38){  //Up
                up=true;
        } else if(event.keyCode==40){ //Down
                down=true;
        }else if(event.keyCode==39){ //Right
                right=true;
        }else if(event.keyCode==37){ //Left
                //pers.gotoAndPlay("left");
                left=true;
        }
 
}
 
function upPers(event:KeyboardEvent):void{
        trace(event.keyCode);
        if(event.keyCode==38){  //Up
                up=false;
                hero_1.gotoAndStop(1);
        } else if(event.keyCode==40){ //Down
                down=false;
                hero_1.gotoAndStop(1);
        }else if(event.keyCode==39){ //Right
                right=false;
                hero_1.gotoAndStop(1);
        }else if(event.keyCode==37){ //Left
                left=false;
                hero_1.gotoAndStop(1);
        }
 
}
 
function speedPers(event:Event):void{
        if(up){  //Up
                speedY -= power;
                if(hero_1.currentLabel != "up"){
      hero_1.gotoAndPlay("up");               
                }
        }
        if(down){ //Down
                speedY += power;
                if(hero_1.currentLabel != "down"){
      hero_1.gotoAndPlay("down");               
                }
        }
        if(right){ //Right
                speedX += power;
                if(hero_1.currentLabel != "right"){
      hero_1.gotoAndPlay("right");               
                }
        }
        if(left){ //Left
                speedX -= power;
                if(hero_1.currentLabel != "left"){
      hero_1.gotoAndPlay("left");               
                }               
        }       
        speedX *= friction;
        speedY *= friction;
        hero_1.x += speedX;
        hero_1.y += speedY;
 
}

Получаю ошибки:

Код:

1120: Access of undefined property stage.
1120: Access of undefined property downPers.
1120: Access of undefined property stage.
1120: Access of undefined property upPers.

Как понимаю, надо как то stage прописать, ведь если он определится, то и все остальные ошибки уйдут.

Суть такая, нажимаю на кнопку и появляется уровень и персонаж, который реагирует на нажатие клавиш клавиатуры.

stage перенес в функцию кнопки и поменял на контейнер, ошибки ушли, но и нажатие кнопок не отслеживается

Подскажите пожалуйста.
Спасибо.

ZackMercury 24.05.2014 18:41

А зачем код из кадров переписывать в классы?
Ну, возможно, вам следует в конструкторе слушать событие Event.ADDED_TO_STAGE, и обрабатывать его в функции init, откуда и писать всю логику класса.
Ссылка на stage у экземпляра типа DisplayObject появляется только при добавлении на сцену, и удаляется при удалении со сцены.

firefedot 24.05.2014 18:48

Просто до этого часть кода была в кадрах и в другом проекте)
А так, спасибо, посмотрю, что можно сделать, следуя совету....
Спасибо...

ZackMercury 24.05.2014 18:52

В таком случае лучше уж оставить в кадрах, потому, что если код из кадров использовать для классов то получается полная каша, и лучше уже писать с нуля.

firefedot 24.05.2014 18:55

все переписал с нуля, а это место решил с копировать)
В общем написал
Код AS3:

container_lvl_1.addEventListener(Event.ADDED_TO_STAGE, added);
public function added(event:Event):void{
                        trace("ok!");                       
                }

И мои события заработали. Не понятно почему, но начали
Спасибо.

рано порадовался)))
работает через раз, именно через раз.

Добавлено через 9 минут
Точней работает, но после клика мышкой по любой области

ZackMercury 24.05.2014 19:09

Попробуйте
Код AS3:

stage.focus = stage;


firefedot 24.05.2014 19:18

Вот оно, спасибо.)
Мы этим тождеством указали, что все действия начинают работать разу на рабочей области?
В итоге вот это
Код AS3:

container_lvl_1.addEventListener(Event.ADDED_TO_STAGE, added);
public function added(event:Event):void{
                        trace("ok!");                       
                }

не пригодился.

ZackMercury 24.05.2014 19:23

Этим мы дали флешке фокус на области, к которой крепим слушатели клавиатуры. Если текущий фокус != тот элемент, к которому мы прикрепили слушатель клавиатуры, то событие не диспатчится.
А точнее диспатчится, но у того элемента, на котором фокус.

Это относится именно к событиям клавиатуры, но не мышки.

firefedot 24.05.2014 19:31

Понял, спасибо большое.


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

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