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

wisconsin 04.10.2012 13:30

Как обратиться к объекту на которого нет ссылок
 
Как обратиться к объекту на которого нет ссылок?

Aquahawk 04.10.2012 13:31

Это как? Он есть на экране? Откуда вы знаете что он вообще есть?

wisconsin 04.10.2012 13:40

Код AS3:

var placeX:int = 0;
 
for (var i:int = 0; i < 5; i++)
{
      cellSprite = new mySprite();
      cellSprite.x = placeX;
 
      addChild(mySprite);
 
      placeX += 10;
}


Krusty 04.10.2012 13:43

ну, если он добавлен addChild, то может быть получен через getChild, очевидно.
Имена методов как бы намекают

wisconsin 04.10.2012 13:51

Цитата:

Сообщение от Krusty (Сообщение 1098455)
ну, если он добавлен addChild, то может быть получен через getChild, очевидно.
Имена методов как бы намекают

да неудачны пример, забыл про глубину отображения

приведу другой пример:
Код AS3:

new myObject();

что в этом случае?

УПД.

хотя и в первом коде плодятся объекты с перекрытыми ссылками

caseyryan 04.10.2012 13:53

Цитата:

Сообщение от wisconsin (Сообщение 1098454)
Код AS3:

var placeX:int = 0;
 
for (var i:int = 0; i < 5; i++)
{
      cellSprite = new mySprite();
      cellSprite.x = placeX;
 
      addChild(mySprite);
 
      placeX += 10;
}


Что это? Этот код не будет работать вообще.
Невозможно добавить в дисплей лист класс.

wisconsin 04.10.2012 13:59

Цитата:

Сообщение от caseyryan (Сообщение 1098458)
Что это? Этот код не будет работать вообще.
Невозможно добавить в дисплей лист класс.

не совсем понял суть


может быть
Код AS3:

var cellSprite:Sprite;
...
var myMap:Sprite = new Sprite();
...
myMap.addChild(mySprite);


spooner 04.10.2012 14:03

Зачем вы умышленно теряете ссылку на объект, если он вам нужен будет в будущем?
Если ссылок на объект не останется, то его GC съест.
Если объект добавлен в список отображения, то на него есть ссылка, которую можно получить через getChild и иже с ним, как уже выше было упомянуто.

PainKiller 04.10.2012 14:05

если на объект нет ссылок, он будет удален сборщиком мусора, и никак к нему обратиться нельзя. Если объект добавлен на сцену, а ссылок на него нет - getChildAt ()

Krusty 04.10.2012 14:06

Код у вас совершенно неверный, caseyryan правильно заметил. Добавляется объект.
Если объект добавлен через addChild, то на него есть ссылка, и его можно получить. add/get
Если на объект нету ссылок, то объект будет убран через некоторое время сборщиком мусора.

Добавлено через 44 секунды
Цитата:

Сообщение от PainKiller (Сообщение 1098462)
Если объект добавлен на сцену, а ссылок на него нет - getChildAt ()

Если объект добавлен на сцену, то на него уже есть ссылка, по определению :)

wisconsin 04.10.2012 14:10

Цитата:

Сообщение от spooner (Сообщение 1098461)
Зачем вы умышленно теряете ссылку на объект, если он вам нужен будет в будущем?
Если ссылок на объект не останется, то его GC съест.


myMap.addChild(new myPlayer()) //класс myPlayer потомок DisplayObject

на экране не отобразиться?

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

Сообщение от Krusty (Сообщение 1098463)
Код у вас совершенно неверный, caseyryan правильно заметил. Добавляется объект.

в чем код не верен?

Krusty 04.10.2012 14:16

Вы добавляете класс mySprite, это невозможно.
Нужно добавлять объект-экземпляр класса.
В вашем коде cellSprite-это объект, mySprite-класс.

wisconsin 04.10.2012 14:20

Код AS3:

var cellSprite:Sprite;
var myMap:Sprite = new Sprite();
var placeX:int = 0;
 
for (var i:int = 0; i < 5; i++)
{
      cellSprite = new mySprite();// mySprite наследник класса Sprite
      cellSprite.x = placeX;
 
      myMap.addChild(mySprite);
 
      placeX += 10;
}

так верно?

этот код создает пять объектов, так ведь? или...

и в конце концов переменная cellSprite будет ссылаться на последний, созданный циклом, экземпляр

spooner 04.10.2012 14:22

Не
Код AS3:

myMap.addChild(mySprite);

, а
Код AS3:

myMap.addChild(cellSprite);

наверное.

Aquahawk 04.10.2012 14:22

нет не создаёт. Идите и читайте Колина Мука. Объективно, в голове у вас ООП-каша. Вы путаете классы и объекты, и не понимя самого фундамента пытаете ползти дальше, не стоит так делать.

Krusty 04.10.2012 14:23

Нет, так неверно. Еще раз перечитайте.

spooner 04.10.2012 14:24

Если вы планируете работать с этими объектами сохраните ссылки на них например в массив.

Добавлено через 1 минуту
mySprite у вас - это имя Класса, его нельзя добавить в список отображения, можно только его экземпляр
Код AS3:

new mySprite ();


Isfet 04.10.2012 14:46

чтобы просмотреть всех детей нужен такой код:
Код AS3:

var myMapChildNum:int = myMap.numChildren;
for (var i:int = 0; i < myMapChildNum; i++)
{
      trace("координата cellSprite ="+ (myMap.getChildAt(i) as mySprite).x); //или можно вызвать какую-либо функцию описанную в классе mySprite
}


wisconsin 04.10.2012 15:29

Код AS3:

package 
{
        import flash.display.*;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        createMap();
                }
 
                private function createMap():void
                {
                        var placeX:int = 0; // Задаю начальную координату
 
                        for (var i:int = 0; i < 5; i++)
                        {
                                // Рисую квадрат
                                var square:Shape = new Shape();
                                square.graphics.lineStyle(1);
                                square.graphics.beginFill(0xFF0000, 1);
                                square.graphics.drawRect (0, 0, 25, 25);
 
                                // Отображаю квадрат на заданной координату
                                square.x = placeX;
                                addChild(square);
 
                                // Увеличиваю заданные координату
                                placeX += 25;
 
                        }
 
                //Двигаю последний добавленный квадрат
                var lastSquare:Shape = ( getChildAt ( numChildren - 1 ) as Shape );
                lastSquare.x += 10;
 
                }
 
        }
 
}


Aquahawk 04.10.2012 16:12

endfill кто будет делать?

Код AS3:

package 
{
        import flash.display.*;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        createMap();
                }
 
                private function createMap():void
                {
                        var placeX:int = 0; // Задаю начальную координату
                        var square:Shape;
 
                        for (var i:int = 0; i < 5; i++)
                        {
                                // Рисую квадрат
                                square = new Shape();
                                square.graphics.lineStyle(1);
                                square.graphics.beginFill(0xFF0000, 1);
                                square.graphics.drawRect (0, 0, 25, 25);
                                square.graphics.endFill();
 
                                // Отображаю квадрат на заданной координату
                                square.x = placeX;
                                addChild(square);
 
                                // Увеличиваю заданные координату
                                placeX += 25;
 
                        }
 
                //Двигаю последний добавленный квадрат
                square.x += 10; // он просто остался в этой переменной, его никто не портил и ссылку не терял.
 
                }
 
        }
 
}

вот как можно. Но повторяю, почитайте немного теории, у вас совсем плохо с общим пониманием программирования. Попробуйте более простые задачи.

caseyryan 04.10.2012 16:37

Я обычно храню созданные в циклах объекты в массивах, если в дальнейшем понадобится к ним обращаться

Newred 05.10.2012 11:16

Можно так:
Код AS3:

var placeX:int = 0;
 
for (var i:int = 0; i < 5; i++)
{
      var cellSprite:mySprite = new mySprite();
      cellSprite.x = placeX;
      cellSprite.name = "cell"+i ;
      addChild(cellSprite);
 
      placeX += 10;
}

А лучше так:
Код AS3:

var placeX:int = 0;
 
var cellSprite:mySprite ;
for (var i:int = 0; i < 5; i++)
{
      cellSprite = new mySprite();
      cellSprite.x = placeX;
      cellSprite.name = "cell"+i ;
      addChild(cellSprite);
 
      placeX += 10;
}

Ну и вылавливать и удалять можно так:
Код AS3:

removeChild(getChildByName("cell3")); //   cellSprite.name = "cell"+3, ниже метод работает быстрее

Код AS3:

removeChild(getChildAt(2)); //   index 0,1,2 - 3-й елемент


Frost47rus 06.10.2012 02:06

что мешает завести массив для отображаемых элементов в контейнере(которые, собственно, создаются динамично)? и таскать их из цикла по параметру.

Krusty 06.10.2012 10:55

Цитата:

Сообщение от Frost47rus (Сообщение 1098695)
что мешает завести массив для отображаемых элементов в контейнере(которые, собственно, создаются динамично)? и таскать их из цикла по параметру.

Тот факт, что массив уже и так есть.

Frost47rus 06.10.2012 12:40

Цитата:

Сообщение от Krusty (Сообщение 1098715)
Тот факт, что массив уже и так есть.

дисплейобъектлист - это одно.
другое же - если на сцене несколько контейнеров и доставать нужно из определённого.

caseyryan 06.10.2012 13:24

Цитата:

Тот факт, что массив уже и так есть.
Но он далеко не так удобен. Я бы лучше создал отедельный массив, и помещал в него только те объекты, с которыми предстоит работать


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

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