Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Добавление на передний план экзмпляров 1 класса (http://www.flasher.ru/forum/showthread.php?t=181827)

Tetraeon 03.07.2012 20:16

Добавление на передний план экзмпляров 1 класса
 
Приветствую, прошу снова вашей помощи....
Есть куча одинаковых экземпляров 1го класса(без имен) движущихся по сцене, нужно перемещать на передний план (swapChildren) те объекты которые находятся ниже всех остальных по оси Y. При попытке это сделать выдает ошибку.
В EnterFrame пишу:
Код AS3:

for (var q:int=0; q<Enemy.enAll.length; q++)
{
        if(enAll[q].enemyPositionPoint.y>this.enemyPositionPoint.y) //Массив объектов
        { // ниже конкретного экзепляра
                if(oc==false) // данные значения останавливают процесс swapChildren
                {// и  перезапускают в нужный момент
                        swapChildren(this, enAll[q]); // тут ошибка, как исправить?
                        oc=true;
                }
        }
        else
        {
                oc=false;
        }
 
}

Код:

Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
        at flash.display::DisplayObjectContainer/swapChildren()
        at Enemy/onLine()


strangedk 03.07.2012 20:25

Код AS3:

swapChildren(this, enAll[q])

полностью аналогично:

Код AS3:

this.swapChildren(this, enAll[q])

т.е. вы родитель пытаете поменять местами с ребенком.
а параметры swapChildren должны быть в одном контейнере, как понимаю

Tetraeon 03.07.2012 20:32

Тогда сразу вопрос возникает, если я буду проводить эту процедуру из главного класса на котором все и находится.. как я могу обратится к экземплярам класса с объектами выше указанным образом? Ко всем обращусь без проблем.. Enemy.enAll[q] (массив статический), а вот к 1 экземпляру который пересекся с остальными как? (Enemy.enemys.y ? если public static var enemys = this; таким образом не выходит)

Wolsh 03.07.2012 21:24

Зачем здесь вообще swapChildren? Чем не подходит addChild?

Tetraeon 03.07.2012 21:52

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

Wolsh 04.07.2012 00:58

Насколько я понял Ваш код, здесь должно быть обращение к контейнеру, содержащему всех этих врагов:
Код AS3:

this.parent.swapChildren(this, enAll[q]);
// или просто забрасываем врага из массива наверх контейнера
// this.parent.addChild(enAll[q]);

Координаты x и y конечно не изменятся, с чего бы.. Не ищите в программировании мистики.. иногда конечно кажется, что все происходит не так как было задумано)) Но это обычно от того, что вместо чтения справки мы начинаем сами выдумывать правила, которые кажутся нам очевидными. Но на деле ситуаций гораздо, гораздо больше, чем мы можем себе представить, и правила придуманы так, чтобы работать максимально предсказуемо во всех этих ситуациях, даже когда кажется, что вот "здесь и сейчас было бы удобнее", если бы было "вот так")))

Добавлено через 1 минуту
И да.. В будущем никогда так не делайте. Просто запомните, что нельзя. Почему, поймете когда-нибудь попозже.

Tetraeon 04.07.2012 07:51

Спасибо, все получилось =)

strangedk 04.07.2012 14:27

Цитата:

Сообщение от Wolsh (Сообщение 1087191)
this.parent

боже упаси от такого кода)

Wolsh 04.07.2012 14:52

Я итак уже прослыл здесь писателем-моралистом. Если Вы чувствуете в себе силы объяснить, как переписать всю игру с учетом тру ООП человеку, еще не очень-то понимающему, что в его собственном коде this, что контейнер, и кто что должен делать даже с синтаксической точки зрения — то просто сделайте это. Я объяснил ошибку кода и сделал приписку об ошибке подхода (архитектуры). Распинаться в n-надцатый раз на пяти страницах все о том же "дети и родители" уже не хватает задора))))
Как можно прочитать сообщение со словами "никогда так не делайте" как рекомендацию "сделать именно так", я не знаю. Я лишь показал, чего тут не хватает в смысле языка, синтаксиса если хотите.

Tetraeon 04.07.2012 18:31

Все правильно иногда нужно объяснять на том же уровне на котором задан вопрос))
В итоге все свелось к элементарным нескольким строчкам.
Код AS3:

for (var q:int=0; q<enAll.length; q++)
{
        if(enemys.y<enAll[q].y)
        {
                parent.addChild(enAll[q]);
        }
}

Работает только с 1м видом экземпляров родительского класса, что странно по логике т.к. в массиве enAll содержатся все экземпляры подклассов (я трейсил). Думаю со временем разберусь. Спасибо за ваше терпение и за любые подсказки в нужном направлении.


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

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