Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   linkage + циклы (http://www.flasher.ru/forum/showthread.php?t=128940)

zzz_dmg 20.08.2009 19:59

linkage + циклы
 
простите за глупый вопрос, но ничего не выходит
на ас2 все хорошо работает, когда linkage задаешь мувиклипам, а потом их аттачишь через i
Код AS1/AS2:

var i:Number = 1;
this.attachMovie (['s'+i], 's',1);

а в ас3 как туда "впихнуть" i, чтобы вместо s1 записи делилась на s + i?
Код AS3:

var s:s1 = new s1 ();
this.addChildAt(s);

спасибо

Dante 20.08.2009 20:32

Код AS3:

var class : Class = Class( getDefinitionByName("s"+i));
var s:*= new class ();
this.addChildAt(s);

примерно вроде так

BlooDHounD 20.08.2009 22:00

Dante, ну тогда уже так:
Код AS3:

var c:Class = getDefinitionByName( "s" + i ) as Class;
var s:Sprite = new c() as Sprite;
this.addChildAt( s );


MonkDead 21.08.2009 01:35

BlooDHounD, Sprite можно хранить в "библиотеке" :) Возможно вы подразумеваете, что MovieClip наследник Sprite, но все же наверное надо писать MovieClip.
Код AS3:

var c:Class = getDefinitionByName( "mc" + i ) as Class;
var mc:MovieClip = new c() as MovieClip;
this.addChildAt(mc);


igrayka 21.08.2009 01:48

Так друзья, это что-то очень круто, а как быть с этим ?

Код AS3:

for(i=1;i<house;i++) {
 
                        bigmap["BTN"+i]addEventListener(MouseEvent.ROLL_OVER, BTNrollOverHandler);
                        bigmap["BTN"+i]addEventListener(MouseEvent.ROLL_OUT, BTNrollOutHandler);
                        }

как добавить слушателей сразу ко всем кнопкам ?

MonkDead 21.08.2009 02:13

igrayka, наверно самое простое завести массив и в него добавлять ссылки на кнопки, пробегаемся по массиву подписываемся или отписываемся от слушателей.

BlooDHounD 21.08.2009 08:50

MonkDead, чего? Вы в порядке? зачем мне писать мувиклип, если, как вы написали, Sprite Тоже можно хранить в библиотеке, и тем самым один и тот же код у меня подойдёт на обо случая, а ваш придётся переписывать.

p.s.: лично я всегда указываю DisplayObject.

igrayka 21.08.2009 12:29

MonkDead,

Спасибо,попробую что-нибудь сейчас

Добавлено через 22 минуты
блин не могу понять как "пробежаться" по массиву и прявязать слушателей (

как используя массив ко всем его элементам добавить слушателей ?
1071: Syntax error: expected a definition keyword (such as function) after attribute rightbracket, not addEventListener.

Obi 21.08.2009 14:25

Цитата:

Сообщение от igrayka (Сообщение 844395)
MonkDead,

блин не могу понять как "пробежаться" по массиву и прявязать слушателей (

как используя массив ко всем его элементам добавить слушателей ?

Код AS3:

var a:Array = [new Sprite(),new Sprite(),new Sprite(),new Sprite(),new Sprite(),];
 
for(var i:uint = 0; i < a.length; i++) {
        var dObj:DisplayObject = a[i] as DisplayObject;
        dObj.addEventListener(MouseEvent.ROLL_OVER, trace);
        dObj.addEventListener(MouseEvent.ROLL_OUT, trace);
}


igrayka 21.08.2009 15:02

Код AS3:

for(i=1;i<60;i++) {
var ABTN:Array = new Array();
                                ABTN[i] = new Sprite("bigmap.BTN"+i);
                                var dObj:DisplayObject = ABTN[i] as DisplayObject;
                                dObj.addEventListener(MouseEvent.ROLL_OVER, BTNrollOverHandler);
                                dObj.addEventListener(MouseEvent.ROLL_OUT, BTNrollOutHandler);
                        }

или

Код AS3:

for(i=1;i<60;i++) {
var ABTN:Array = new Array();
                                ABTN[i] = "bigmap.BTN"+i;
                                var dObj:DisplayObject = ABTN[i] as DisplayObject;
                                dObj.addEventListener(MouseEvent.ROLL_OVER, BTNrollOverHandler);
                                dObj.addEventListener(MouseEvent.ROLL_OUT, BTNrollOutHandler);
                        }

все равно я не втыкаю (( жесть

1119: Access of possibly undefined property bigmap through a reference with static type flash.display:DisplayObject.


когда я делаю хотя бы так
Код AS3:

//for(i=1;i<60;i++) {
                                ABTN[0] = "bigmap.BTN1";
                                var dObj:DisplayObject = ABTN[0] as DisplayObject;
                                dObj.addEventListener(MouseEvent.ROLL_OVER, BTNrollOverHandler);
                                dObj.addEventListener(MouseEvent.ROLL_OUT, BTNrollOutHandler);
                        //}

он пишет - TypeError: Error #1009: Cannot access a property or method of a null object reference.
at AS::Control()


у меня MovieClip - карта, называется на сцене bigmap, в нем кнопки, 60 штук ...

bigmap.BTN(1-60).addEventListener( бла бла бла ) HOOW ?

хотелось бы слушать их в цикле, но я что-то никак не могу понять как

FlashRabbit 21.08.2009 15:41

Код AS3:

for(var i:int = 1; i < 61; i++)
{
        var obj:DisplayObject = bigmap.getChildByName("BTN"+i) as DisplayObject;
        obj.addEventListener(MouseEvent.CLICK, clickHandler);
}


zzz_dmg 21.08.2009 16:24

а как быть в такой ситуации. достою первый клип, задаю ему твин и энтерфрейм. как только клип по х превысит свою ширину, за ним достается следующий и т.д. а по MOTION_FINISH я пытаюсь этот клип удалить. но почему-то удаляется только первый, последующие на это не реагируют. почему клипы не реагируют, они все же привязаны к этому твину, может надо каждому свой твин задать?
Код AS3:

var img:Array = [];
function img_mod(){
var c:Class = getDefinitionByName(mov_name[i]) as Class;
var mov:MovieClip = new c() as MovieClip;
this.addChild(mov);
img[i] = mov;
img[i].x = -50;
img[i].y = 115;
var myTween:Tween = new Tween(img[i], "x", Elastic.easeOut, -50, 500,20, true);
myTween.addEventListener(TweenEvent.MOTION_FINISH, motion);
img[i].addEventListener(Event.ENTER_FRAME, enter_frame);
if (i == total-1){
        i = 0;
}
}
function motion (event:TweenEvent):void {
        removeChild(img[i]);
}
function enter_frame (event:Event):void {
        if (img[i].x > img[i].width+5){
                img[i].removeEventListener(Event.ENTER_FRAME, motion);
                i++;
                img_mod();
        }
}


igrayka 21.08.2009 16:38

получилось вот так . По другому вообще не работает пишет - TypeError: Error #1009: Cannot access a property or method of a null object reference.
at AS::Control()
Код AS3:

var BTNlistener:*;
for(i=1;i<bigmap.numChildren;i++)
{
        BTNlistener = bigmap.getChildAt(i);
        BTNlistener.addEventListener(MouseEvent.ROLL_OVER, BTNrollOverHandler);
        BTNlistener.addEventListener(MouseEvent.ROLL_OUT, BTNrollOutHandler)
                        }

вычитал вот тут http://siliren.ru/content/view/95/1/

Добавлено через 13 минут
а теперь вопрос )

как заставить в зависимости от того какая кнопка была нажата, определенные клипы менять свой тайм лайн ?

тоесть : у нас есть кнопка BTN34 и есть клип CLIP34 , если на кнопку навели мышку то клипчик выполняет gotoAndPlay(10) . мышку убрали gotoandStop(1) . Стандартная фичка

Добавлено через 10 часов 7 минут
решил эту штуку вот так

Код AS3:

protected function BTNrollOutHandler(event:MouseEvent):void {
                        //bigmap.shape_34.gotoAndPlay("stop");
                        stopShape(event.currentTarget);
                }
                function stopShape(BTNClip:*):void {
                        var index = bigmap.BTNContainer.getChildIndex(BTNClip);
                        bigmap.ShapeContainer["shape"+index].gotoAndPlay("stop");
                }


но пришлось создать 2 контэйнера ... и в них хранить только кнопки и клипы, строго хронологически их добавлять и называть, иначе ничего не работает ...

вот бы знать как имя клипа кнопки ( INSTANCE NAME ) считывать когда он событие передает !

cauchy 23.08.2009 19:39

Цитата:

Сообщение от BlooDHounD (Сообщение 844297)
Dante, ну тогда уже так:
Код AS3:

var c:Class = getDefinitionByName( "s" + i ) as Class;
var s:Sprite = new c() as Sprite;
this.addChildAt( s );


Что-то никак не врублюсь. Этот код создаёт переменную с именем "s" и типом "s1" (для i=1)? Или что он делает?
А хотелось бы узнать тогда, как создать переменную с именем ["s"+i] и типом sprite.

А код из цитаты я так и не смог заставить работать %)

BlooDHounD 23.08.2009 21:09

cauchy, Вы что пытались этим кодом сделать? этот код добавляет мувик из библиотеки ( "s1", где i=1 )

cauchy 23.08.2009 21:41

BlooDHounD, если честно я сам запутался что я пытался сделать :wacko: С getDefinitionByName я разобрался, это не то, что мне было нужно.
Лучше я здесь задам корректный вопрос, из за которого собственно я и забрёл в эту тему:
Мне необходимо программно создать, например, 100 объектов (пусть они являются экземплярами покласса Sprite), и затем их разместить на экране, добавить к ним слушателей и ещё как-либо ими управлять. Для этого необходимо использовать массив, в который и добавляются все эти объекты? Причём имён эти объекты иметь не будут, а получить доступ к ним можно только как к элементу массива по индексу?
Я правильно подхожу к решению данной задачи? Или есть способ лучше?

Надеюсь ничего страшного, что я решил это в данной теме спросить :)

FlashRabbit 23.08.2009 22:10

Будет быстрее если спрайты накидать в контейнер, а потом брать их от туда с помощью getChildAt().

BlooDHounD 23.08.2009 22:46

правильно подходите. закидывайте в массив и обращайтесь по индексу.

cauchy 24.08.2009 00:59

Спасибо за ответы, решил пока остановиться на массиве.


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

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