Форум 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=187176)

says 15.11.2012 01:09

Приемники событий не работают...
 
Двс.
Рисую 4 объекта в графе,в ас3 делаю 4 переменные,выставляю в координаты эти 4 картинки,завожу события для каждой кнопки с отдельной функцией,при попытке компилировать,выскакивает внутренняя ошибка

привожу код:
Код AS3:

package
{
import flash.display.*;
import flash.events.*;
        public class Tower extends Sprite
        {
                public function Tower
                {
                //создаю 4 переменных для соответсвующих стихий
                var fire:Fire = new Fire();
                var water:Water = new Water();
                var land:Land = new Land();
                var air:Air = new Air();
                fire.x=10;
                fire.y=10;
                water.x=110;
                water.y=10;
                land.x=10;
                land.y=110;
                air.x=110;
                air.y=110;
                //создаю 4 слушателя для 4 кнопок
                fire.addEventListener(MouseEvent.CLICK,clickFire);
                water.addEventListener(MouseEvent.CLICK,clickWater);
                land.addEventListener(MouseEvent.CLICK,clickLand);
                air.addEventListener(MouseEvent.CLICK,clickAir);
                }
                //функция срабатывающая при нажатии на огонь (удаляет все 4 картинки)
                private function clickFire(event.MouseEvent):void
                {
                var fire:Fire = targetCurrent as Fire();
                        if(fire)
                        {
                        removeChild(fire);
                        removeChild(water);
                        removeChild(land);
                        removeChild(air);
                        }
                }
                //функция срабатывающая при нажатии на вода (удаляет все 4 картинки)
                private function clickWater(event.MouseEvent):void
                {
                var water:Water = targetCurrent as Water();
                        if(water)
                        {
                        removeChild(fire);
                        removeChild(water);
                        removeChild(land);
                        removeChild(air);
                        }
                }
                //функция срабатывающая при нажатии на земля (удаляет все 4 картинки)
                private function clickLand(event.MouseEvent):void
                {
                var land:Land = targetCurrent as Land();
                        if(land)
                        {
                        removeChild(fire);
                        removeChild(water);
                        removeChild(land);
                        removeChild(air);
                        }
                }
                //функция срабатывающая при нажатии на воздух (удаляет все 4 картинки)
                private function clickAir(event.MouseEvent):void
                {
                var air:Air = targetCurrent as Air();
                        if(air)
                        {
                        removeChild(fire);
                        removeChild(water);
                        removeChild(land);
                        removeChild(air);
                        }
                }
        }
}

1)Кто подскажет в чем проблема,мне кажется что в currentTarget , я бы его не стал писать вообще?
2)И второй вопрос,можно ли сделать для 4-ех объектов один слушатель?

Wolsh 15.11.2012 01:29

А что за переменная targetCurrent?

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

public function Tower
{
А скобки где?

Добавлено через 2 минуты
Земля — Ground.

says 15.11.2012 02:24

Да скобки есть,я щас побыстрому в блокноте набросал.

Sintesis 15.11.2012 02:46

что за targetCurrent?
currentTarget у события вызывать нужно
Код AS3:

private function clickFire(event.MouseEvent):void{
                var fire:Fire = event.currentTarget as Fire();
}

и зачем проверяете что нажато если в условии одно и то-же?
Код AS3:

removeChild(fire);
                        removeChild(water);
                        removeChild(land);
                        removeChild(air);


says 15.11.2012 04:28

Дело в том ,чтоэтот код я накидал в спешке, вы правы.А в основном коде у меня всё написано верно,но currentTarget необходим так?
Если я убираю условие проверки на нажатие именно той кнопки которая нужна все равно выдает какую то не понятную ошибку,что то вроде аргумент не null,при этом ошибка не является ошибкой компиляции,я так понял какая то внутренняя.
з.ы.на чужом компьютере сижу просто.

Sintesis 15.11.2012 04:53

Цитата:

Сообщение от says (Сообщение 1104484)
currentTarget необходим так?

нет, и проверка не нужна и так понятно какая кнопка нажата.

Что за ошибку выдаёт и от каких классов наследуются классы
Fire(); Water(); Land(); Air();

Добавлено через 6 минут
в их дереве наследованья есть EventDispatcher?

says 15.11.2012 22:32

Хороший вопрос)
Я создаю переменные из кнопок нарисованных в флэше,то есть,грубо говоря 4 разных квадрата.

Sintesis 15.11.2012 22:44

Цитата:

Сообщение от says (Сообщение 1104611)
грубо говоря 4 разных квадрата.

Эти квадраты должны быть чем-то что может передовать события иначе .addEventListener бесполезен. Передавать события может или экземпляр EventDispatcher или что-то что наследует класс EventDispatcher, например Sprite или MovieClip

says 15.11.2012 23:25

Ну вот код
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        public class Towers extends Sprite
        {
                public function Towers():void
                {
                        var fire:Fire = new Fire();
                        var water:Water= new Water();
                        var land:Land= new Land();
                        var air:Air = new Air();
                        fire.x=20;
                        fire.y=20;
                        water.x=20;
                        water.y=300;
                        land.x=300;
                        land.y=20;
                        air.x=300;
                        air.y=300;
                        addChild(fire);
                        addChild(water);
                        addChild(land);
                        addChild(air);
                        fire.addEventListener(MouseEvent.CLICK,func_fire);
                        /*water.addEventListener(MouseEvent.CLICK,func);
                        land.addEventListener(MouseEvent.CLICK,func);
                        air.addEventListener(MouseEvent.CLICK,func);*/

                }
                public function func_fire(e:MouseEvent):void
                {
                        removeChild(water);
                        removeChild(air);
                        removeChild(land);
 
                }
        }
}

вот ошибки
1120: Access of undefined property water.
1120: Access of undefined property air.
1120: Access of undefined property land.

Wolsh 15.11.2012 23:51

Ну а откуда по-вашему func_fire может знать о каких-то water, air и land?
Это же ЛОКАЛЬНЫЕ переменные конструктора. Никто, кроме функции(-конструктора) Towers, ничего о них не знает.

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

package
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        public class Towers extends Sprite
        {
                private var fire:Fire;
                private var water:Water;
                private var land:Land;
                private var air:Air;
 
                public function Towers():void
                {
                        fire = new Fire();
                        water = new Water();
                        land = new Land();
                        air = new Air();
                        fire.x=20;
                        fire.y=20;
                        water.x=20;
                        water.y=300;
                        land.x=300;
                        land.y=20;
                        air.x=300;
                        air.y=300;
                        addChild(fire);
                        addChild(water);
                        addChild(land);
                        addChild(air);
                        fire.addEventListener(MouseEvent.CLICK,func_fire);
                        /*water.addEventListener(MouseEvent.CLICK,func);
                        land.addEventListener(MouseEvent.CLICK,func);
                        air.addEventListener(MouseEvent.CLICK,func);*/

                }
                public function func_fire(e:MouseEvent):void
                {
                        removeChild(water); //на самом деле надо проверять, есть ли такой чайлд
                        removeChild(air);
                        removeChild(land);
 
                }
        }
}

Добавлено через 8 минут
И да, надо отписываться наверное от события клика по fire после того, как его один раз кликнули, ибо удалять то уже некого.


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

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