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

caseyryan 21.09.2017 16:48

Цитата:

На Desert/Jungle Strike чем-то похоже.
Это и была одна из игр, на которую мы ровнялись, когда делали (говорю мы, потому что графику делал не я). Второй игрой-рефом была сеговская Cannon Fodder.
Цитата:

А ссылку в студию?
Игра отключена уже несколько лет.

Nooob 22.09.2017 00:06

Цитата:

Сообщение от caseyryan (Сообщение 1201999)
Это ошибочное суждение. Не знаю почему многим так вбилось это в голову. Объекты могут и сами себя удалять из дисплей листа. Ничего плохого в этом нет, если на них нет каких-то дополнительных внешних ссылок. Часто вот такие "правильные" подходы приводят к дико нечитаемому и трудноподдерживаемому коду.
Взять какого-нибудь персонажа в игре. Врага. Игрок убивает этого врага, и вот тут возникает вопрос, а как его удалить? Если пользоваться подходом, что только родитель должен удалять дочерние объекты, то этот враг должен (согласно парадигме флеша) послать событие о том, что он дожен удалиться. Это событие должен слушать родитель. По событию родитель находит целевой объект, отписывается от его событий и удаляет объект.
Хотя все можно было сделать гораздо проще. Не оставлять никаких внешних ссылок на врага, а просто создать в нем метод destroy / dispose, в котором он может сам удалиться из дисплей листа. Никаких ненужных событий и лишних зависимостей.

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

caseyryan 22.09.2017 07:46

Цитата:

Если удаление было вызвано в момент итерации по детям
Это же синхронная операция, такого не может быть. А если ты имеешь в виду сравнение какого-то массива, в который добавлены эти объекты, со списком детей в контейнере, то тут, я бы просто выбрал другой подход.
Я в общем-то не говорю, что подход "родитель удаляет ребенка" плохой. Я просто говорю, что он не является единственным верным, как многие считают. И подход "ребенок удаляет сам себя" тоже вполне рабочий и допустимый во многих случаях.
А то у новичков может сложиться впечатление, что так делать ни в коем случае нельзя, а почему нельзя - не понятно.

Nooob 25.09.2017 23:11

Цитата:

Сообщение от caseyryan (Сообщение 1202027)
такого не может быть

Пример конечно странный, но тем не менее он отражает потерю контроля владельца
Код AS3:

//child
        public class Enemy extends Sprite
        {
                public var health:uint;
                //*....*//
                public function update():void
                {
                        if(health == 0)
                                parent.removeChild(this);
                }
        }
//parent
for (var i:int = 0; i < numChildren; i++)
{
    (getChildAt(i) as Enemy).update();
}

Дерево DisplayObject это лишь частный случай родитель-потомок, это может быть и список Enemy в родителе с методами addEnemy, removeEnemy

caseyryan 26.09.2017 09:30

Цитата:

Пример конечно странный
Да. Этим все сказано.
Я бы лучше сделал статический аниматор, который принимает объекты применяющие интерфейс IUpdatable из которого объект тоже сам удаляется.
Цитата:

это может быть и список Enemy в родителе с методами addEnemy, removeEnemy
Ну тут то получается, что архитектура приложения заточена на то, чтобы именно родитель удалял детей. В этом случае, конечно не нужно делать "самоудаление"

undefined 26.09.2017 11:39

я один не понимаю что страшного произойдет?Когда Enemy самоуничтожится,numChildren автоматически станет на 1 меньше и цикл либо продолжится дальше,либо остановится.

Добавлено через 24 минуты
Гараздо неприятнее что такое самоудаление сдвигает весь dl

Zebestov 26.09.2017 12:17

Покойник сам на кладбище не ходит, его хоронят, так заведено.
Развели тут =)

Wolsh 26.09.2017 12:37

Цитата:

numChildren автоматически станет на 1 меньше и цикл либо продолжится дальше,либо остановится.
при этом один ребенок проскочит без апдейта, так как встанет на текущий i вместо удалившегося, а цикл перейдет к следующему. Распространенная ошибка при чистке массивов.

Appleman 04.10.2017 19:05

Друзья!

Дошёл я до ввода-вывода, по заветам мэтров начал с программирования кнопочек и менюшек. Возник идиотский вопрос, даже группа вопросов.

Во-первых, файлы с растровыми изображениями можно загружать с помощью Loader-ов и с помощью тега метаданных [embed]. Разбирался, в чём их отличие. Пока единственное, что твёрдо усвоил и осознал, это тот факт, что Loader загружает изображение на этапе выполнения, а [embed] - на этапе компиляции. Делаю вывод, что если я планирую игру на flash, работающую в т.ч. оффлайн, то мой выбор, по всей видимости, - это "встраивание" графики на этапе компиляции, т.е. вариант [embed]. Верно?

Во-вторых, с этим самым [embed] какой-то стрёмный синтаксис. Вот из нашего отца родного Колина Мука:

Код AS3:

        public class MinigameView extends Sprite
        {
 
                [Embed(source = "../../Bitmaps/Eiffel-Tower-In-Paris-800x600.jpg")]
                private var Photo:Class;
 
                public function MinigameView()
                {
                        var photo:BitmapAsset = new Photo();
                        addChild(photo);
                }
        }

Что это за тип данных Class? Почему приватная переменная Photo записана с большой буквы в нарушение всех конвенций? Каким образом происходит связь загруженного через мета тег графического файла и переменной внутри программы?

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

Wolsh 04.10.2017 20:17

Синтаксис стремный, потому что это не язык AS3, а команда компилятору.
Photo c заглавной буквы, потому что все классы именуют с заглавной.
Компилятор создает автоматически класс-наследник Bitmap с "предустановленной" битмапдатой — Photo. Поэтому в дальнейшем ты можешь создавать сколько угодно экземпляров этого класса и обращаться с ними как с обычным Bitmap.
Цитата:

Что это за тип данных Class?
Все классы являются объектами типа Class. Их можно передавать между функциями, хранить в переменных и получать на них ссылки, зная только название класса (строку). Для удобства этих операций существует тип Class.
Код AS3:

var A:Class = flash.display.Sprite; // класс
var cont:Sprite = new A() as Sprite; // экземпляр

Думаю, понятно почему нельзя написать
Код AS3:

var A:Class = flash.display.Sprite; // класс
var cont:A = new A(); // экземпляр

Потому что на этапе компиляции такого типа "A" не существует, это всего-лишь имя переменной.

Цитата:

то это будет огромная простыня и сумасшедшее количество переменных
а при загрузке в рантайме — не будет простыни и переменных?
Многие по возможности собирают много маленьких в одну большую — спрайтшит или атлас — и в рантайме "нарезают" ее на маленькие. Это особенно удобно, когда картинки являются кадрами какой-то секвенции или например иконками графического интерфейса; удобно, когда не нужен КЛАСС для каждой картинки, и даже отдельная переменная — когда можно хранить их в массиве.


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

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