Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.09.2017, 16:48
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 31  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
На Desert/Jungle Strike чем-то похоже.
Это и была одна из игр, на которую мы ровнялись, когда делали (говорю мы, потому что графику делал не я). Второй игрой-рефом была сеговская Cannon Fodder.
Цитата:
А ссылку в студию?
Игра отключена уже несколько лет.
__________________
Ко мне можно и нужно обращаться на ты)

Старый 22.09.2017, 00:06
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 32  
Ответить с цитированием
Nooob
 
Аватар для Nooob

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

Старый 22.09.2017, 07:46
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 33  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Если удаление было вызвано в момент итерации по детям
Это же синхронная операция, такого не может быть. А если ты имеешь в виду сравнение какого-то массива, в который добавлены эти объекты, со списком детей в контейнере, то тут, я бы просто выбрал другой подход.
Я в общем-то не говорю, что подход "родитель удаляет ребенка" плохой. Я просто говорю, что он не является единственным верным, как многие считают. И подход "ребенок удаляет сам себя" тоже вполне рабочий и допустимый во многих случаях.
А то у новичков может сложиться впечатление, что так делать ни в коем случае нельзя, а почему нельзя - не понятно.
__________________
Ко мне можно и нужно обращаться на ты)

Старый 25.09.2017, 23:11
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 34  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
Цитата:
Сообщение от caseyryan Посмотреть сообщение
такого не может быть
Пример конечно странный, но тем не менее он отражает потерю контроля владельца
Код 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
__________________
RocketJump


Последний раз редактировалось Nooob; 26.09.2017 в 01:44.
Старый 26.09.2017, 09:30
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 35  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Пример конечно странный
Да. Этим все сказано.
Я бы лучше сделал статический аниматор, который принимает объекты применяющие интерфейс IUpdatable из которого объект тоже сам удаляется.
Цитата:
это может быть и список Enemy в родителе с методами addEnemy, removeEnemy
Ну тут то получается, что архитектура приложения заточена на то, чтобы именно родитель удалял детей. В этом случае, конечно не нужно делать "самоудаление"
__________________
Ко мне можно и нужно обращаться на ты)

Старый 26.09.2017, 11:39
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 36  
Ответить с цитированием
undefined

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

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

Старый 26.09.2017, 12:17
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 37  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Покойник сам на кладбище не ходит, его хоронят, так заведено.
Развели тут =)
__________________
Поймай яблоко 2!

Старый 26.09.2017, 12:37
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 38  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
numChildren автоматически станет на 1 меньше и цикл либо продолжится дальше,либо остановится.
при этом один ребенок проскочит без апдейта, так как встанет на текущий i вместо удалившегося, а цикл перейдет к следующему. Распространенная ошибка при чистке массивов.
__________________
Reality.getBounds(this);

Старый 04.10.2017, 19:05
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 39  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Друзья!

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

Во-первых, файлы с растровыми изображениями можно загружать с помощью 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 записана с большой буквы в нарушение всех конвенций? Каким образом происходит связь загруженного через мета тег графического файла и переменной внутри программы?

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

Старый 04.10.2017, 20:17
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 40  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Синтаксис стремный, потому что это не язык 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" не существует, это всего-лишь имя переменной.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:56.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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