Обнаружение столкновений в Java для игры - PullRequest
3 голосов
/ 05 марта 2011

Я делаю игру на Java с несколькими другими людьми, но мы застряли на одной ее части, делая обнаружение столкновений.Игра представляет собой RPG, и я знаю, как сделать обнаружение столкновений с персонажами, использующими Rectangles, но я не знаю, как это сделать, это обнаружение столкновений для карт.Под этим я подразумеваю, что персонаж не может ходить по деревьям или воде и тому подобному, но использование прямоугольников здесь не кажется лучшим вариантом.

Чтобы объяснить, как будут выглядеть игровые карты, вотпример http://i980.photobucket.com/albums/ae287/gordsmash/7-8.jpg

Теперь я мог бы использовать прямоугольники, чтобы получить границы и помешать игроку ходить по деревьям и воде, но это заняло бы много из них.способ запретить игроку ходить по деревьям и препятствиям, кроме использования прямоугольников?

Ответы [ 3 ]

1 голос
/ 05 марта 2011

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

0 голосов
/ 05 марта 2011

Существует много способов решения этой проблемы, но я думаю, что для того, что вы делаете, лучшим способом было бы использовать движок плиток. В прошлом это часто использовалось в подобных играх (например, в любой RPG на SNES), и это дает вам быстрые и простые средства как для создания уровня / карты, так и для обнаружения столкновений.

Основная концепция движка плиток состоит в том, что объекты хранятся в двумерном массиве, и когда ваш игрок (или любой другой движущийся игровой объект) пытается перейти в новую плитку, вы выполняете простую проверку, чтобы увидеть, находится ли объект в этом плитка доступна или нет (например, если это трава, игрок может двигаться; если это сундук с сокровищами, игрок не может двигаться). Это значительно упростит проверку на коллизии (поскольку наивная проверка списка сущностей будет иметь производительность O (n ^ 2)). Эта картинка может дать вам представление о том, о чем я говорю. Линии были добавлены, чтобы проиллюстрировать точку, но, конечно, когда вы играете в игру, вы не воспринимаете все активно как отдельные элементы размером 32x32 пикселя.

Хотя у меня лично нет опыта работы с движками плиток в Java, похоже, Mappy поддерживает Java, и я слышал хорошие вещи о PulpCore . Конечно, вы более чем можете создать свой собственный двигатель, но вы должны решить, лучше ли потратить свои силы на переизобретение колеса (но, конечно, тогда это будет ваше колесо, и это довольно приятно) или потратьте время на создание лучшей игры.

0 голосов
/ 05 марта 2011

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

ТАКЖЕ! Предполагая, что у вас есть многочисленные плитки, с которыми вы сталкиваетесь, рассмотрите некоторый метод пространственного разбиения. Позвольте мне привести простой пример - разделить вашу карту на несколько прямоугольников (http://www.staff.ncl.ac.uk/qiuhua.liang/Research/Pic_research/mine_grid.jpg), а затем в зависимости от того, в какой прямоугольной области сейчас находится ваш игрок - проверяйте столкновение только с тайлами, расположенными в этой области.

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

Идея, лежащая в основе такого подразделения, называется Quadtree, и существует огромное количество статей и учебных пособий по этому вопросу, которые вы очень быстро поймете.

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

...