Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как присвоить слушателя событий для 6 кнопок в контейнере имеющие одинаковые имена? (http://www.flasher.ru/forum/showthread.php?t=152255)

Кирилл63 14.03.2011 18:06

Как присвоить слушателя событий для 6 кнопок в контейнере, имеющие одинаковые имена?
 
Игра "Дурак" .
Как присвоить слушателя событий для 6 кнопок в контейнере, которые имеют одинаковые имена?
Cлушатель почему то присваивается только последней карте !
Код AS3:

package com.Script
{
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.display.SimpleButton;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
 
        public class Kart extends MovieClip
        {
                var shet:int = 0;
                var feuf:int;
                var movi:SimpleButton;
                var arr:Array = new Array(kresti6, kresti7, kresti8, kresti9, kresti10, kresti11, kresti12, kresti13, kresti14, love6, love7, love8,
                love9, love10, love11, love12, love13, love14, piki6, piki7, piki8, piki9, piki10, piki11, piki12, piki13, piki14, tref6, tref7, tref8, tref9,
                tref10,tref11,tref12,tref13,tref14);
                var arr2:Array = arr.slice(0,35) ;
                public function Kart()
                {
                }
                public function shest(dobavka:int):void
                {
                        for (var i:int = 0; i < dobavka; i++)
                        {
                                feuf = feuf + 60;
                                shet = Math.round((0 - (arr2.length-1)) * Math.random() + arr2.length-1);
                                movi = new arr2[shet  ];
                                trace(movi.name);
                                addChild(movi);
                                movi.x = feuf + 30;
                                movi.y = 350;
                                arr2.splice(shet,1);
                                arr2.filter(removeEmpty);
                                movi.addEventListener(MouseEvent.CLICK, click)
 
                        }
 
                }
                function removeEmpty(a:Object, index:int, source:Array):Boolean
                {
                        if (a is Number)
                        {
                                return true;
                        }
                        return false;
                }
                public function click(e:MouseEvent):void
                {
                        e.target.y -=  70;
                        e.target.removeEventListener(MouseEvent.CLICK, click);
 
                }
 
        }
}

Код AS3:

package com.Script
{
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.ui.Multitouch;
        import flash.events.MouseEvent;
 
        public class main extends MovieClip
        {
                var butto:circleflatbrown;//КнопКа из компонентов Flash IDE
                var _kart:Kart;
                var dobavka:int = 6;
                public function main()
                {
                        butto = new circleflatbrown ();
                        _kart = new Kart ();
                        addChild(_kart);
                        addChild(butto);
                        butto.x =200;
                        butto.y = 100;
                        butto.addEventListener(MouseEvent.CLICK, sdat);
                }
                public function sdat(events:MouseEvent):void
                {
 
                        if (_kart.cont.numChildren<=5)
                        {
                                dobavka -= _kart.numChildren; 
                                _kart.shest(dobavka);
                        }
                }
 
        }
}


3p.station 14.03.2011 18:34

1 - оформите код в AS3 а не PHP
2 - названия классов пишутся с большой буквы
3 - cont.addEventListener(MouseEvent.CLICK, click); нет необходимости делать много раз в цикле достаточно одного раза
4 - после первого же клика вы отписываетесь от события - вероятно в этом и ваша проблема

Добавлено через 1 минуту
и 5 - не пользуйтесь нативными кнопками

Добавлено через 7 минут
хотя по пункту 4 - я не прав, вы отписываетесь .. но не от того а вообще не понятно от чего,
вообщем трейс вам в руки и почитайте как работают слушатели
хелп

Кирилл63 14.03.2011 22:27

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

dimarik 14.03.2011 22:47

3p.station, Кирилл слабо знаком с основным языком общения.

Кирилл63 14.03.2011 23:04

Исправлюсь.

3p.station 14.03.2011 23:25

Перечитайте ваш вопрос. Вы пишете что "слушатель почему то присваивается только последней карте !". Несмотря на то, что сама формулировка стремная, продолжим...
Далее вы пишете что "При нажатии на любую карту координаты изменяются только у последней !", тоесть "слушатель почему то присваивается ВСЕМ картам !", но в вашем обработчике (function click (e:MouseEvent)) меняется координата movi, а что у вас movi ? посмотрите в коде - верно это последняя созданная карта в цикле.
попробуйте написать там e.target.y -= 70; и уберите отписывание непонятно от чего.
и еще все переделайте ( : и пообещайте понять что же такое e.target

успехов

expl 14.03.2011 23:26

Цитата:

Код AS3:

var cont:Sprite = new Sprite();


Потом в методе начинается цикл
а в теле цикла Вы 10 раз вызываете один и тот же cont:
Цитата:

Код AS3:

for (var i:int = 0; i < dobavka; i++)
                        {
                                feuf = feuf + 60;
                                shet = Math.round((0 - (arr2.length-1)) * Math.random() + arr2.length-1);
                                trace("МАТЕМАТ" + shet);
                                trace ("ДЛИНА"+arr2.length);
                                movi = new arr2[shet];
                                trace("МОВИ" + arr2[shet]);
                                cont.addChild(movi);
                                cont.addEventListener(MouseEvent.CLICK, click);
                                movi.x = feuf + 30;
                                movi.y = 350;
                                trace(movi.x);
                                arr2.splice(shet,1);
                                arr2.filter(removeEmpty);
 
                        }


Если кнопка - это movi, то может тогда на movi слушатель и вешать? Это не as2 - ту на кнопки все нормально вешается, или я ошибаюсь?

3p.station 14.03.2011 23:28

Вы 10 раз вызываете один и тот же cont - где ??

dimarik 14.03.2011 23:38

Хм, Кирилл исправился!

Цитата:

Как присвоить слушателя событий для 6 кнопок в контейнере, которые имеют одинаковые имена?
Кнопки имеют одинаковые имена, но они есть разные экземпляры. Подписывайте каждую кнопку к слушателю.
Пример
Код AS3:

button_1.addEventListener(MouseEvent.CLICK, handler_click);
button_2.addEventListener(MouseEvent.CLICK, handler_click);
...
button_N.addEventListener(MouseEvent.CLICK, handler_click);
 
function handler_click(event:MouseEvent):void {
    trace( (event.targer as DisplayObject).name ); // хаха, одинаковые имена )
}


orcpochta 15.03.2011 00:23

имена - это очень плохо
попробуйте сделать реализацию так, будто свойства .name в природе не существует


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

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