![]() |
Как узнать объекты на условной линии
Вложений: 1
Здравствуйте! Банальный пример: мужик стреляет в монстров, попал - убил. Времени на полет пули нет (тоесть в одном кадре выстрел и сразу смерть монстра). Просто кликать по монстрам и убивать того, на ком кликнул не подходит, потому что могут возникнуть следующие ситуации как на картинке ниже.
Подскажите, пожалуйста, как найти первый попавшийся объект на траектории пули. |
1. Даете импульс пули по вектору
2. Проверяете на hitTest с противниками 3. При столкновении уничтожаете пулю Добавлено через 4 минуты Цитата:
Цитата:
|
Цитата:
Код AS3:
Добавлено через 3 минуты strangedk, спасибо, но если скорострельность будет большая, то мне придется в каждом кадре проверять тысячи пуль на столкновения с массивом объектов. Так что это немного не то. Интересует именно - возможно ли создать какой-то цикл, который в момент выстрела, который, я даже не знаю что бы он делал... поэтому и спросил здесь. |
Если лазер, тогда это не траектория а вектор.
А вообще, смотреть в сторону пресечения луча, скорее всего. |
Цитата:
|
А не достаточно будет считать пересечения траектории пули и линий (диаметров) мишеней проведенных перпендикулярно линии с которой стреляют? Ну или для большего реализма перпендикулярно прямой проведенной от стрелка до центра круга?
|
Спасибо, я вижу, что без прохождения по каждому объекту здесь не обойтись в любом случае...
|
Я делал лазер так. Писал класс Laser, в его конструктор экэемпляра передавал массив целей. Сам класс приаттачивал к спрайту - полоске в IDE. При выстреле в классе Laser хиттестом перебирались цели, если по одной срабатывало true, до нее высчитывалось расстояние, и width полоски становился равным расстоянию до цели. Ну а в главном герое, при выстреле просто создавался new Laser с координатами, так, чтобы наложить его на пушку,и по таймеру я его его убирал. (независимо от того, попал герой или нет). Так делать удобно, если двухмерная игра и враги появляются только с одной стороны (т.е. развороты не предусмотрены), иначе конечно все усложняется. При таком подходе никаких проблем приведенных в первом топике не возникало. Если надо могу выложить код, но я думаю и так логика понятна.
|
Вложений: 1
Вот, собственно, накидал приме, но на Хексе, в качестве стимула к изучению :P
Код AS3:
Код:
-main ShootingGame |
wvxvw, спасибо, тоько вот как узнать какой из них был первым на пути?
Добавлено через 48 минут Вычислять дистанцию от круга до героя. Сортировать массив кругов по этой дистанции. И выбирать первый/последний? |
Коллижн луча и окружности
Все о наиболее популярных коллиженах есть здесь http://www.geometrictools.com/LibMat...ersection.html там на С++ но нужно практически только математика, она думаю будет понятна :) Луч - Круг смотрим это: Wm5IntrLine2Circle2.cpp |
Korchy, спасибо, но там только код без теории. С haxe-ом wvxvw я разобрался, но в С++ я ничего не понимаю :)
|
Вложений: 1
Цитата:
Код AS3:
Вложение 28012 |
Задача сводится к:
1) пересечению отрезков, это, я думаю очевидно 2) Оптимизации перебора отрезков В качестве оптимизации можно разбить видимое пространство на квадраты. К каждому квадрату приписывать массив объектов, содержащихся в них. Луч (который вообще-то можно сделать отрезком) в любом случае будет пересекать лишь часть квадратов. То есть берем квадраты, получаем общий список объектов на этих квадратах и эти объекты проверяем на пересечение с "лазером". Проверить пересечение отрезком можно так: - проверить на пересечение прямоугольники, описывающие отрезки - проверить что обе точки одного отрезка находятся по разные стороны другого отрезка |
Цитата:
Если мишеней не много (не много, это порядка сотни), то писать алгоритмы сортировки и разбиения на кластеры, построение деревьев и т.п. - я думаю, себя не оправдает. Но если бы это была карта звездного неба в натуральную величину ;) то наверное имело бы смысл например, проверять на попадание постепенно, сдвигая границу, по которой проверять горизонтально или вертикально. Как только зафиксировано попадение - можно быть уверенным, что оно ближе всего к стреляющему. Но для этого во время движения все мишени нужно было бы пересортировывать так. И тут нужно смотреть что чаще меняется, и избегать его менять :) Цитата:
|
Цитата:
|
| Часовой пояс GMT +4, время: 03:40. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.