Просмотр полной версии : Платформер. Как получить ссылку на тайл в текущих координатах
Добрый вечер!
Заранее извиняюсь если подобные темы поднимались, но я долго искал на форуме - не нашел. Пытаюсь разобраться в написании платформера. Вопрос такой: Как получить ссылку на объект (тайл), находящийся под MovieClip'ом персонажа? Нужно для проверки, например, стоит ли персонаж у двери или лестницы. На сцене имеется:
1) gameScreen:MovieClip
1) gameScreen.levelView:MovieClip
2) gameScreen.char:MovieClip
Я попытался сделать это проверкой с помощью hitTestObject:
У персонажа имеется 4 вспомогательных объекта для определения столкновении с игровым миром (подсмотрено на xitri.com) и каждый экземпляр объекта (например "Дверь") проверят на 4 hitTestObject с персонажем. Код получился оч. большим и в конце сам запутался в нем... Есть ли примеры решения данной задачи?
Заранее благодарен!
DisplayObjectContainer#getObjectsUnderPoint() (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#getObjectsUnderPoint())
Если я правильно понял, у вас не платформер, для которого был приведен пример на xitri, а что-то типа рогалика. В этом случае лучше все-таки сделать модель игрового мира, отвязанную от отображения. Чтобы тайл можно было получить по координатам игрока, не трогая никакие мувиклипы. И чтобы столкновения можно было проверять по этой же модели.
getObjectsUnderPoint() я пробовал, но... На сцену добавляется лестница из экземпляров объекта класса Stairs_mc, импортированный из CS6. Там нарисовал из прямоугольников тайл лестницы, конвертировал в символ, унаследовал от МувиКлип. getObjectsUnderPoint() возвращает массив из одного объекта типа Shape. В итоге не смог разобраться почему.
а что-то типа рогалика
а что это означает?
Чтобы тайл можно было получить по координатам игрока, не трогая никакие мувиклипы
т.е. надо будет перебирать массив с объектами игрового мира и сравнивать их координаты с координатами персонажа? в кажом 1-5 кадрах? Как сильно это скажется на быстродействии всего приложения?
т.е. надо будет перебирать массив с объектами игрового мира и сравнивать их координаты с координатами персонажа? в кажом 1-5 кадрах? Как сильно это скажется на быстродействии всего приложения?
Оптимизацией займетесь после решения проблемы столкновения :о) Тем более тут полно вариантов.
Тем более тут полно вариантов. Может Вы подскажете пару вариантов? =)
Bletraut
24.04.2013, 15:39
Я написал уже не одну кучу платформеров и могу сказать что нет какого-то одного универсального решения которое бы подходило для всех игр. Приведу парочку на мой взгляд самых рациональных алгоритмов.
1) Т.к все тайлы игрового мира имеют определенную высоту и ширину и скорее всего имеют форму квадрата, то можно просто перебирать все тайлы и сравнивать их с текущими координтами перса. Естественно данный способ не слишком хорош в плане быстродействия. Пути оптимизации следующие: 1) необходимо убирать с экрана те объекты которые не входят на данный момент в поле зрения персонаха 2) сокращать число необходимых проверок.
2) Все игровые тайлы запихиваются в двумерный массив. т.е у нас массив с уровнем назовем его levelArr, в нем еще несколько массивов с блоками в итоге он имеет такой вид.
levelArr = [
row1[block1,block1,block2],
row2[block1,block1,block2],
row3[block1,block1,block2],
];
Т.к все тайлы квадраты, то мы можем легко определить у какого блока стоит персонаж для этого делим координаты персонажа на длину и ширину нашего тайла и округляем их. В итоге формула будет выглядеть так.
blockHit = levelArr[Math.floor(player.y/blockHeight)][Math.floor(player.x/blockWidth)];
Достоинства: Высокая производительность, возможность быстрого доступа к объектам уровня.
Недостатки: Путаница с массивами если у вас по ним мало знаний.
Все игровые тайлы запихиваются в двумерный массив. т.е у нас массив с уровнем назовем его levelArr, в нем еще несколько массивов с блоками в итоге он имеет такой вид.
Спасибо большое, как раз начал переделывать под такой способ.
Bletraut прав насчет универсальности. И выступлю как КО - "А зная, где стоит персонаж, вам максимум надо проверить 9 тайлов" :о)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.