Обработка столкновений 2d-спрайтов сверху вниз с движущимися спрайтами?

Я делаю простую 2D-игру сверху вниз на С# с xna 4.0 и использую метод обнаружения столкновений AABB. Я определенно новичок в программировании, поэтому прошу прощения, если этот вопрос очень простой.

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

Спасибо за любую помощь!


person Ryan Endacott    schedule 01.02.2012    source источник


Ответы (2)


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

Вместо этого вы могли бы подумать о ОТталкивании объекта от сталкивающегося объекта.

Эта статья находится в OpenTK, который не основан на XNA, но чертовски похож на него, и его легко адаптировать:

http://www.opentk.com/node/869

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

Помните о порядке; здесь в игру вступает ваш контроль за приоритетом столкновений. Когда AABB вашего игрока сталкивается с другим, вы бы предпочли, чтобы вашего игрока «толкали» ПЕРВЫМ или врага? Эти детали могут зависеть от вас в вашей реализации.

person Community    schedule 01.02.2012
comment
Итак, я попытался реализовать эту штуку обработки столкновений... И, похоже, это работает, но иногда мои спрайты случайным образом прыгают... Думаю, это связано с тем, когда я на самом деле вызываю обработчик столкновений. Когда я должен быть? Также спасибо за помощь :) - person Ryan Endacott; 13.02.2012
comment
вам нужно вызывать его в обновлении каждый кадр, один раз за каждые два AABB, которые вы хотите столкнуть. - person ; 13.02.2012
comment
Я сделал это... И у меня есть это, когда никакие объекты не сталкиваются после его вызова.. Но это заканчивается исправлением странным образом.. Спрайты часто меняются местами. - person Ryan Endacott; 13.02.2012
comment
Аааа это такая боль. Кажется, ничего не работает, а я так много пробовал! - person Ryan Endacott; 13.02.2012

Почему бы не использовать Farseer Physics Engine, который автоматически обрабатывает столкновения (и другую физику)? Farseer Physics Engine — это система обнаружения столкновений с реалистичными физическими реакциями.

Farseer может справиться с любым столкновением, и вы можете сосредоточиться на своем игровом дизайне! (Не изобретайте велосипед :)

Это проект с открытым исходным кодом и широко используется! Там много образцов

Вы можете скачать с http://farseerphysics.codeplex.com/.

person Vackup    schedule 01.02.2012