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

Wazzabi 24.04.2013 00:53

Платформер. Как получить ссылку на тайл в текущих координатах
 
Добрый вечер!

Заранее извиняюсь если подобные темы поднимались, но я долго искал на форуме - не нашел. Пытаюсь разобраться в написании платформера. Вопрос такой: Как получить ссылку на объект (тайл), находящийся под MovieClip'ом персонажа? Нужно для проверки, например, стоит ли персонаж у двери или лестницы. На сцене имеется:
1) gameScreen:MovieClip
1) gameScreen.levelView:MovieClip
2) gameScreen.char:MovieClip

Я попытался сделать это проверкой с помощью hitTestObject:
У персонажа имеется 4 вспомогательных объекта для определения столкновении с игровым миром (подсмотрено на xitri.com) и каждый экземпляр объекта (например "Дверь") проверят на 4 hitTestObject с персонажем. Код получился оч. большим и в конце сам запутался в нем... Есть ли примеры решения данной задачи?

Заранее благодарен!

Gaen 24.04.2013 13:25

DisplayObjectContainer#getObjectsUnderPoint()

Если я правильно понял, у вас не платформер, для которого был приведен пример на xitri, а что-то типа рогалика. В этом случае лучше все-таки сделать модель игрового мира, отвязанную от отображения. Чтобы тайл можно было получить по координатам игрока, не трогая никакие мувиклипы. И чтобы столкновения можно было проверять по этой же модели.

Wazzabi 24.04.2013 13:47

getObjectsUnderPoint() я пробовал, но... На сцену добавляется лестница из экземпляров объекта класса Stairs_mc, импортированный из CS6. Там нарисовал из прямоугольников тайл лестницы, конвертировал в символ, унаследовал от МувиКлип. getObjectsUnderPoint() возвращает массив из одного объекта типа Shape. В итоге не смог разобраться почему.

Цитата:

а что-то типа рогалика
а что это означает?

Код:

Чтобы тайл можно было получить по координатам игрока, не трогая никакие мувиклипы
т.е. надо будет перебирать массив с объектами игрового мира и сравнивать их координаты с координатами персонажа? в кажом 1-5 кадрах? Как сильно это скажется на быстродействии всего приложения?

GBee 24.04.2013 13:58

Цитата:

т.е. надо будет перебирать массив с объектами игрового мира и сравнивать их координаты с координатами персонажа? в кажом 1-5 кадрах? Как сильно это скажется на быстродействии всего приложения?
Оптимизацией займетесь после решения проблемы столкновения :о) Тем более тут полно вариантов.

Wazzabi 24.04.2013 14:41

Код:

Тем более тут полно вариантов.
Может Вы подскажете пару вариантов? =)

Bletraut 24.04.2013 15:39

Я написал уже не одну кучу платформеров и могу сказать что нет какого-то одного универсального решения которое бы подходило для всех игр. Приведу парочку на мой взгляд самых рациональных алгоритмов.

1) Т.к все тайлы игрового мира имеют определенную высоту и ширину и скорее всего имеют форму квадрата, то можно просто перебирать все тайлы и сравнивать их с текущими координтами перса. Естественно данный способ не слишком хорош в плане быстродействия. Пути оптимизации следующие: 1) необходимо убирать с экрана те объекты которые не входят на данный момент в поле зрения персонаха 2) сокращать число необходимых проверок.

2) Все игровые тайлы запихиваются в двумерный массив. т.е у нас массив с уровнем назовем его levelArr, в нем еще несколько массивов с блоками в итоге он имеет такой вид.

Код AS3:

levelArr = [
row1[block1,block1,block2],
row2[block1,block1,block2],
row3[block1,block1,block2],
];

Т.к все тайлы квадраты, то мы можем легко определить у какого блока стоит персонаж для этого делим координаты персонажа на длину и ширину нашего тайла и округляем их. В итоге формула будет выглядеть так.

Код AS3:

blockHit = levelArr[Math.floor(player.y/blockHeight)][Math.floor(player.x/blockWidth)];

Достоинства: Высокая производительность, возможность быстрого доступа к объектам уровня.
Недостатки: Путаница с массивами если у вас по ним мало знаний.

Wazzabi 24.04.2013 16:27

Код:

Все игровые тайлы запихиваются в двумерный массив. т.е у нас массив с уровнем назовем его levelArr, в нем еще несколько массивов с блоками в итоге он имеет такой вид.
Спасибо большое, как раз начал переделывать под такой способ.

GBee 24.04.2013 19:08

Bletraut прав насчет универсальности. И выступлю как КО - "А зная, где стоит персонаж, вам максимум надо проверить 9 тайлов" :о)


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

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