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

elniko 20.10.2008 19:35

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

НО! у меня проблема - всем кнопкам назначается действие последней созданной кнопки, т.е. дайствия "затираются".

Вот код, подскажите, как эту проблему устранить. Заранее всем оргомное спасибо!

Код:

package {
       
import flash.net.FileReference;
import flash.display.*;
import flash.text.*;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.events.MouseEvent;

        public class elGetClipArt {

                public var artArr:Array = new Array();
                public var clpArr:Array = new Array();
               
                public function elGetClipArt(target:MovieClip, cl_cnt:Number, avatar_mc:MovieClip, glFlag:Object){
                       
            var clpArr:Array = new Array();
                       
                    for(i=1;i<=cl_cnt;i+=1){
                               
                                var uid:Number = Math.random();
                                var clipImg:String = "clip/"+i+".png";
                            clpArr[i]  = new Sprite();
                                clpArr[i].x = 45*(i-1)+5;
                                clpArr[i].y = 5;
                                var cl_ldr:Loader = new Loader();
                                var cl_url:String = clipImg;
                                var cl_urlReq:URLRequest = new URLRequest(cl_url);
                                cl_ldr.load(cl_urlReq);

                                target.addChild(clpArr[i]);
                                clpArr[i].addChild(cl_ldr);

                                clpArr[i].addEventListener(MouseEvent.MOUSE_UP,function(event:MouseEvent){
                                                trace(i);
                                                trace(clipImg);
                                                artArr[i] = new elClipArt(avatar_mc, glFlag, i);
                                                artArr[i].MakeClipArt(clipImg);
                                });
                       
                        }
                       
                }

        }
       
}


silin 20.10.2008 22:43

что происходит: у всех кнопок в обработчике клика одна и та же переменная i (итератор цикла), со всеми вытекающими отсюда последствиями..
как бы сделал:
clpArr[i] должен быть не Sprite'ом, а его наследником, имеющим свойство id , которое при создании в цикле и определим, а в обработчике клика его стало быть увидим
за вычетом несущественного:
Код:

package {
        import flash.display.*;
        import flash.events.*;

        public class elGetClipArt extends Sprite{
                public var clpArr:Array = [];
               
                public function elGetClipArt(){
                  for (var i:int = 0; i < 3; i++){
                          var clip:MySprite = new MySprite(i);
                          clip.x = 45 * i;
                          addChild(clip);
                          clip.addEventListener(MouseEvent.MOUSE_UP, clipClickHandler);
                          clpArr.push(clip);
                        }
                }
                private function clipClickHandler(event:MouseEvent):void {
                        var clip:MySprite = event.target as MySprite;
                        var id:int = clip.id;
                        trace( "id : " + id );

                }
        }
}

import flash.display.*;
class MySprite extends Sprite{
        public var id:int;
        public function MySprite(id:int) {
                this.id = id;
                //debug
                graphics.lineStyle(50);
                graphics.lineTo(1, 1);
        }
}


Felicast 20.10.2008 23:23

Цитата:

Код:

clpArr[i].addEventListener(MouseEvent.MOUSE_UP,function(event:MouseEvent){
        trace(i);
        trace(clipImg);
        artArr[i] = new elClipArt(avatar_mc, glFlag, i);
        artArr[i].MakeClipArt(clipImg);
        }
);


так делать очень-очень не хорошо

elniko 21.10.2008 00:09

привет! в твой код (программное создание кнопок) я подставил это:
Код:

        import flash.display.*;
        import flash.net.URLRequest;
        import flash.net.URLVariables;
       
        class MySprite extends Sprite{
               
                public var id:int;
                public function MySprite(id:int) {
                        this.id = id;
                        //debug
                        //graphics.lineStyle(50);
                        //graphics.lineTo(1, 1);
                                var cl_ldr:Loader = new Loader();
                                var cl_url:String = "clip/"+id+".png";
                                var cl_urlReq:URLRequest = new URLRequest(cl_url);
                                cl_ldr.load(cl_urlReq);
                                addChild(cl_ldr);
               
                }
        }

теперь компилятор ругается:

Цитата:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at elGetClipArt/clipClickHandler()
подскажи плиз, что не так я делаю? просто с флешем работаю 2-й день, ещё не понял всех примудростей )

Заранее спасибо!

silin 21.10.2008 00:53

в таком раскладе target это Loader, надо смотреть currentTarget
Код:

private function clipClickHandler(event:MouseEvent):void {
        var clip:MySprite = event.currentTarget as MySprite;
        if (clip) {
                var id:int = clip.id;
                trace( "id : " + id );
        }
}


elniko 21.10.2008 01:18

ОГРОМНОЕ спасибо за помощь!!!


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

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