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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.04.2013, 00:53
Wazzabi вне форума Посмотреть профиль Отправить личное сообщение для Wazzabi Найти все сообщения от Wazzabi
  № 1  
Ответить с цитированием
Wazzabi

Регистрация: Apr 2012
Сообщений: 70
По умолчанию Платформер. Как получить ссылку на тайл в текущих координатах

Добрый вечер!

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

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

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

Старый 24.04.2013, 13:25
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 2  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
DisplayObjectContainer#getObjectsUnderPoint()

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

Старый 24.04.2013, 13:47
Wazzabi вне форума Посмотреть профиль Отправить личное сообщение для Wazzabi Найти все сообщения от Wazzabi
  № 3  
Ответить с цитированием
Wazzabi

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

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

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

Старый 24.04.2013, 13:58
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 4  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Цитата:
т.е. надо будет перебирать массив с объектами игрового мира и сравнивать их координаты с координатами персонажа? в кажом 1-5 кадрах? Как сильно это скажется на быстродействии всего приложения?
Оптимизацией займетесь после решения проблемы столкновения :о) Тем более тут полно вариантов.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 24.04.2013, 14:41
Wazzabi вне форума Посмотреть профиль Отправить личное сообщение для Wazzabi Найти все сообщения от Wazzabi
  № 5  
Ответить с цитированием
Wazzabi

Регистрация: Apr 2012
Сообщений: 70
Код:
Тем более тут полно вариантов.
Может Вы подскажете пару вариантов? =)

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

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Я написал уже не одну кучу платформеров и могу сказать что нет какого-то одного универсального решения которое бы подходило для всех игр. Приведу парочку на мой взгляд самых рациональных алгоритмов.

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)];
Достоинства: Высокая производительность, возможность быстрого доступа к объектам уровня.
Недостатки: Путаница с массивами если у вас по ним мало знаний.


Последний раз редактировалось Bletraut; 24.04.2013 в 19:17.
Старый 24.04.2013, 16:27
Wazzabi вне форума Посмотреть профиль Отправить личное сообщение для Wazzabi Найти все сообщения от Wazzabi
  № 7  
Ответить с цитированием
Wazzabi

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

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Bletraut прав насчет универсальности. И выступлю как КО - "А зная, где стоит персонаж, вам максимум надо проверить 9 тайлов" :о)
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

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

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


 


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


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