![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 187
|
Подскажите, как реализуется в аркадных играх сбор, к примеру, всяких монеток разбросанных по уровню?
Я себе тут придумал алгоритм, но, чувствую, но крив. Я бы делал так: 1. Повытаскивал бы на сцену в нужные места клип coin. 2. В поле Instance name вписал бы каждой монетке имя "coin01", "coin02" итд... 3. В классе игры создал бы функцию, которая бы в цикле перебирала все монетки и проверяла с помощью hitTest, не столкнулся ли клип герой с каждой из монеток. 4. Если столкнулся - удаляла бы со сцены клип монетки, на которой случилось событие hitTest Думаю, всё должно быть как-то иначе. Может быть делается всё гораздо изящнее, проще и быстрее в работе? А то, к примеру, если у меня несколько сотен таких монеток на уровне разбросано, я во-первых замучаюсь их наименовать, а во-вторых, цикл проверки в несколько сотен шагов, запускающийся в каждом кадре, будет здорово тормозить процесс. |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 1,195
|
Если расположить монетки на равномерной сетке с довольно крупными ячейками, то достаточно проверять ячейки, и уже по факту касания ячейки с монеткой делать нужные проверки и удалять клин. Гораздо меньше вычислительных затрат. Собственно, так всегда и делалось, когда ресурсы не измерялись в "гига..".
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Смысл в том, что монетки НЕ движутся, их координаты известны. Так зачем тогда хитТест? Сверяйте координаты и все.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Feb 2010
Сообщений: 95
|
А для чего давать название монетам? Проще при загрузке уровня делать перебор детей на сцене и при этом запихать нужные объекты монет в массив.
Последний раз редактировалось vinch; 06.07.2010 в 00:50. |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 187
|
VVall: тоесть не использовать хиттест, а просто проверять координаты? А тогда вот всё равно. Представьте 300 монеток на уровне. И делать в каждом кадре 300 проверок координат?
И ещё я не совсем понял. Ведь координаты - это положение по х и у одной точки? У меня герой движется попиксельно. Тоесть чтобы событие произошло, надо чтобы координата какой-то точки героя (скажем его центра) совпала с координатой центра монетки. Тоесть пиксель в пиксель чтобы. А такое же маловероятно. Или я неправильно понял что-то? vinch: не очень пока слёту понял. но попробую разобраться. спасибо. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
VVall как бы намекает, что в случае сетки мы проверяем только пересечённые телом клетки на предмет наличия в них монетки, а не все 300 монет.
PS: если 300 - реально максимальное число, то это не много, но если всё так на пересечение проверять, то могут начаться тормоза. |
|
|||||
|
Можно внутри каждой монетки создать обработчик события EnterFrame, в котором проверяется столкновение с героем. Это решит проблему с именами, они будут вообще не важны.
Что касается быстродействия... Там надо игровой мир разделить на экраны (если персонаж не слишком быстро движется) и динамически их подгружать и выгружать, но это уже высший пилотаж игроделов))) Поэтому просто сделайте внутри класса клипа обработчик EnterFrame и наслаждайтесь простым размещением и сбором монеток. P.S: Если возникнут проблемы с кодом, пишите в личку, помогу |
|
|||||
|
Регистрация: Feb 2010
Сообщений: 95
|
Jarproger, не раз встречал мнение, что лучше обновлять игровые объекты в одном месте (я не знаю, каким должен быть правильный игровой фреймворк, но у меня это делается в классе уровня), а не в каждом объекте по ENTER_FRAME.
In8Finity, наверное, за монетки будет отвечать какие-то отдельные символы? Тогда я бы делал так: при загрузке уровня прошелся по всем детям изображения уровня и добавлял нужные объекты в массив: , а потом по ENTER_FRAME перебирал монетки в массиве и обновлял их. В таком случае пропадает необходимость именовать монетки и грузить их по имени. |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:38. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|