C #: Как я могу узнать, на какой стороне произошло столкновение? - PullRequest
0 голосов
/ 01 октября 2009

Я думаю, что название довольно самоочевидно, но просто чтобы прояснить, я пытаюсь выяснить, как определить, на какой стороне произошло столкновение.

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

Любая помощь приветствуется, и если есть лучший подход к этой проблеме, я полностью ее опробую.

Я надеюсь, что этого достаточно, но если вам нужно больше, спросите, и я отредактирую. Заранее спасибо.

[править] @viggity - Нет, я не использую какой-либо конкретный игровой движок, и я бы опубликовал текущий код «обнаружения», но он немного, нелепо, надежен.

@ Streklin - Я использую событие this.Paint, чтобы рисовать на самой форме, так как я рекомендовал начать с этого, чтобы лучше рисовать в реальном времени. Я также использую местоположение, которое обновляется каждый раз, когда срабатывает таймер в зависимости от того, что я нажимаю (влево, вправо, вверх, вниз). Да, лабиринт основан на плитке. В настоящее время он состоит только из 3 цветов. Я не очень продвинутый программист.

@ Эрик - Определенно однополая игра. Опять же, у меня есть только 3 цвета, линии черные, фон белый, а квадрат (пользователь) зеленый. Я использую DrawImage () с растровыми изображениями, чтобы рисовать на экране.

[редактировать сводку псевдокода]

foreach (стена в стенах) если (player.intersectsWith (_wall)) остановить движение;

@ JeffH - Я не совсем уверен, что вы спрашиваете, так как это почти все, кроме тестирования кода, который я использовал, чтобы попытаться заставить его работать. Единственное, что я пропустил, - это оператор if, чтобы проверить, была ли это ось x или нет, чтобы x и y могли перемещаться независимо друг от друга. Таким образом, вместо того, чтобы застрять, потому что вы коснулись стены, вы можете скользить по ней. Я не видел смысла в том, чтобы включить это, хотя, так как проблема возникает до этого.

Ответы [ 2 ]

4 голосов
/ 01 октября 2009

Предположим, вы говорите о 3D-игре здесь.

Норма лица, которую вы видите, указывает на вас, поэтому скалярное произведение вектора направления на нормали лица будет отрицательным. Если это положительно, то вы приближаетесь к лицу со спины.

Если это ноль, вы путешествуете под прямым углом к ​​лицу.

|              <---------- your direction of travel
|
|----------> <- face normal
|
| <- face

Если вы не находитесь в 3D, вы можете сохранить направление, в котором стоит стена (как 2D-вектор), и сделать то же произведение точек с вашим 2D-направлением движения.

0 голосов
/ 01 октября 2009

На основании ваших правок вы можете двигаться только в одном направлении за раз? Или вы можете пойти в диагональных направлениях? Если это позже, ChrisF предоставил вам ответ в 3D и соответствующую информацию для 2D. Если нет, вам просто нужно прекратить движение в направлении движения - поскольку существует только четыре варианта, достаточно просто проверить их все на предмет простой игры для начинающих.

...