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

kaetano 07.11.2009 02:04

Как узнать существует ли объект?
 
Знаю что есть метод contains, но почему-то он не действует. Пишет ошибку
Код AS3:

ReferenceError: Error #1069: Не удалось найти свойство point1_1To3_0 в src.Main; отсутствует значение по умолчанию.

Имя объекта задается динамически. И ругается даже при трассировании:

Код AS3:

trace("POINT: " + this.contains( this["point" + indMan1 + "To" + indMan2]))

Добавлено через 1 минуту
Переменные indMan1,2 берутся из XML, если это важно

MrPoma 07.11.2009 02:20

Вы про дисплей обжекты говорите?

wvxvw 07.11.2009 02:22

contains() - это в смысле метод DisplayObjectContainer'a? Если point1_1To3_0 не DisplayObject или this не DisplayObjectContainer, то будет ошибка.
А зачем такие неуклюжие манипуляции с названиями переменных?
Чтобы проверить, существует ли объект, нужно знать, какой объект проверять, а в вашем случае похоже, вы не знаете, что именно хотите проверить...

etc 07.11.2009 02:25

Оно не нашло указанное свойство, contains тут непричем ещё.

kaetano 07.11.2009 02:33

Цитата:

Сообщение от wvxvw (Сообщение 863944)
contains() - это в смысле метод DisplayObjectContainer'a? Если point1_1To3_0 не DisplayObject или this не DisplayObjectContainer, то будет ошибка.
А зачем такие неуклюжие манипуляции с названиями переменных?
Чтобы проверить, существует ли объект, нужно знать, какой объект проверять, а в вашем случае похоже, вы не знаете, что именно хотите проверить...

Неа, я знаю объект, это MovieClip.

Неуклюжие названия.... ну я даже не знаю почему, наверно потому что объектов достаточное кол-во (point...), а имя (объект которыый нам нужен в определенный момент) формируется в зав-ти от выбранных установок, которые сидят в XML. Мда, объяснила.....:wacko:

wvxvw 07.11.2009 02:35

MovieClip - это класс, и существует он всегда, более того, он не может не существотать, т.как встроен в плеер.
Не понятно зачем вообще давать имена, если они все равно не нужны... почeму нельзя просто сложить объекты в какой-нибудь список, типа массива, например.

kaetano 07.11.2009 02:46

Цитата:

Сообщение от wvxvw (Сообщение 863948)
Не понятно зачем вообще давать имена, если они все равно не нужны... почeму нельзя просто сложить объекты в какой-нибудь список, типа массива, например.

Может и можно. Только смотрите. В определенные шаги анимации (выбранные пользователем) будет появляться тот или иной объект и они появляются не по порядку, т.е. в зав-ти от индексов 1 и 2, а значит их все равно надо привязывать к этим индексам. Да и как не давать имена DisplayObject? Я еще учусь.... даже не знаю как к ним потом обратиться, без имени то....

А если потом этот пользователь в XML захочет изменить индекс на другой? А это предполагается....

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

Сообщение от wvxvw (Сообщение 863948)
MovieClip - это класс, и существует он всегда, более того, он не может не существотать, т.как встроен в плеер.

Почему-то я думала что MovieClip это частный случай DisplayObject (наследуется от него)

Firexel 07.11.2009 03:22

Цитата:

значит их все равно надо привязывать к этим индексам
Если вы их сложите в массив, то каждый из них будет привязан к собственному индексу в массиве.

kaetano 07.11.2009 03:40

Цитата:

Сообщение от Firexel (Сообщение 863953)
Если вы их сложите в массив, то каждый из них будет привязан к собственному индексу в массиве.

Слава богу это понятно :)
Только у меня не один индекс, а два, и они (идин или оба могут поменяться через неделю).

Чтоб было понятно вкратце - есть основные элементы, между которыми надо показывать линии связи (point), вот насчет них и говорим. На каждом этапе показа свои активные основные элементы, в зав-ти от того кто они такие - показываем определенную стрелку (point), но как уже сказала все может поменяться и надо будет на этом же этапе сделать активными другие элементы, а следовательно и стрелка будет уже не эта.

Для чего мне нужно узнать есть ли такой объект - для страховки от ошибки пользователя.

И все равно не понимаю как не давать элементам (разных визуально) имен и как их потом выискивать в ентом массиве. Даже если я выкручусь и не обзову их - что от этого выиграю?

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

wvxvw 07.11.2009 14:10

Код AS3:

var w:int = 5;
var h:int;
var a:Array = [];
var b:Array;
while (w--)
{
        h = 5;
        b = [];
        a[w] = b;
        while (h--)
        {
                b[h] = new Sprite();
        }
}
 
trace(a.join("\r"));

Ну вот вы создали двухмерный массив содержащий спрайты, зачем вам нужны имена?

kaetano 07.11.2009 20:30

Цитата:

Сообщение от wvxvw (Сообщение 863987)
Код AS3:

var w:int = 5;
var h:int;
var a:Array = [];
var b:Array;
while (w--)
{
        h = 5;
        b = [];
        a[w] = b;
        while (h--)
        {
                b[h] = new Sprite();
        }
}
 
trace(a.join("\r"));

Ну вот вы создали двухмерный массив содержащий спрайты, зачем вам нужны имена?

Спасибо огроменное, но я пока по старинке, с таким раскладом мне надо другие элементы класть в массивы так же, а эти получатся тогда 4-х мерными.... наверно. в общем пока нет времени разбираться, но как только появится - сразу попробую! Спасибо!

Как все таки распознать есть ли объект pointXX на сцене? Пока ни к чему толковому не пришла....

Добавлено через 1 час 3 минуты
И все-таки не удержусь и спрошу.

Если не даем имени объекту на экране, как его положить в массив и узнать что именно он там где надо лежит? (объекты находятся в разных местах, зававать местоположение программно нет смысла - очень трудоемко и возможно надо будет сдвинуть, и принадлежат разным классам, только род.класс совпадает).

mayakwd 08.11.2009 04:14

var contains : Boolean = this.getChildByName ("point" + indMan1 + "To" + indMan2) != null;

Цитата:

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

SamFR 08.11.2009 18:53

Цитата:

Сообщение от kaetano (Сообщение 864042)
Если не даем имени объекту на экране, как его положить в массив и узнать что именно он там где надо лежит? (объекты находятся в разных местах, зававать местоположение программно нет смысла - очень трудоемко и возможно надо будет сдвинуть, и принадлежат разным классам, только род.класс совпадает).

Вы же, когда создаёте эти объекты, делаете им addChild()? То есть добавляете их в определённый (один) контейнер. Так ведь? Если не так, то ни с помощью contains(), ни с помощью других операций просто сделать то, что вам нужно, не получится. В этом случае вам нужно срочно пересмотреть структуру своей программы.

Если же это так, то почему бы, одновременно с добавлением в контейнер, не добавлять этот объект в массив? Вы же в момент создания объекта уж точно имеете ссылку на него, вот, используя эту ссылку, и добавляйте...

Котяра 09.11.2009 10:24

можно создать хэш список, причем mc могут принадлежать любому контейнеру. при удалении просто занул
Код AS3:

private var movieСlipList:Object
{
public fucntion initMovieСlipList():void
  for(....)
  {
      var mc:MovieClip =...
      var key:String ="point" + i + "To" + j;
      movieСlipList[key] =mc
  }
}
// доступ
public fucntion getMovieClip(i,j):MovieClip
{
var key:String ="point" + i + "To" + j;
return movieСlipList[key];
// если нет , то вернёт null
}
// удаление
public fucntion deleteMovieClipFromList(i,j):void
{
var key:String ="point" + i + "To" + j;
movieСlipList[key] =null;
 
}


kaetano 10.11.2009 03:41

Цитата:

Сообщение от SamFR (Сообщение 864184)

Вы же, когда создаёте эти объекты, делаете им addChild()? То есть добавляете их в определённый (один) контейнер. Так ведь? Если не так, то ни с помощью contains(), ни с помощью других операций просто сделать то, что вам нужно, не получится. В этом случае вам нужно срочно пересмотреть структуру своей программы.

Если же это так, то почему бы, одновременно с добавлением в контейнер, не добавлять этот объект в массив? Вы же в момент создания объекта уж точно имеете ссылку на него, вот, используя эту ссылку, и добавляйте...

Нет, я не делаю addChild, я их добавляю прямо на сцену в разработке.

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

Цитата:

Сообщение от mayakwd (Сообщение 864132)
сформулируйте вопрос четче. цель такой задачи?

Есть объекты, к которым я обращаюсь с помощью индексов, которые беру из XML, если вдруг в XML записали ошибочный индекс - то получается такая ошибка. Как проверить что объект с таким именем существует.
Объекты уже добавлены на сцену и проименнованы

Может пойдет obj.parent.contains(obj)?

Gaen 10.11.2009 06:00

Подойдёт getChildByName()


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

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