2012-04-27 2 views
1

Я искал темы обнаружения столкновений, но все они касались самого обнаружения. Мой вопрос больше о до и после процесса обнаружения. Я пишу свою первую большую игру, и я хочу сделать ее настолько эффективной, насколько это возможно.Настройка обнаружения столкновений, а затем столкновение в 2D-игре

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

Моя идея для настройки теста состоит в том, чтобы объекты каким-то образом загружались в очередь и список. Затем игра будет принимать все, что находится на передней панели очереди, и проверять все в списке. Сначала будет проверяться, чтобы убедиться, что вещь в списке не сама (что создавало бы столкновение за все время lol). Затем игра проверит, есть ли конфликт между объектом в очереди и объектом в списке. Если есть столкновение, то он будет отмечать объекты, говорящие, что они столкнулись, и сохранить ссылку или что-то из того, с чем столкнулся объект.

Например, если А столкнулся с В, игра сказали бы, чтобы запустить функцию столкновения, B, чтобы запустить функцию столкновения, и будет хранить в A ссылки на B и B будет хранить ссылку на А.

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

Например, если в одном и том же кадре были выбраны три шара A, B и C, а A и A должны были быть удалены как B, так и C, то A изменит свою скорость на B, а затем на C и B и C будут иметь свои скорости, измененные A.

Будет ли это разумным способом сделать это? Я не беспокоюсь о фактическом обнаружении коллизий прямо сейчас, есть много статей или учебных пособий, а также мое собственное мышление для решения этой проблемы. Я не сталкивался с чем-либо, что говорит до и после. Я не уверен, сколько вещей в очереди и списке начнет вызывать большую нагрузку и замедлить игру. Сейчас мои объекты - это всего лишь x, y-позиции, x, y скорости, в каком направлении они находятся, и еще несколько вещей.

Теперь я думаю, что я начинаю болтать о несвязанных вещах. Было бы оценено любое понимание или мудрость.

+0

Являются ли векторы движения обновленными по мере прохождения очереди? Кажется, что B и C будут иметь свои векторы движения, модифицированные A _after_ A, изменил ли его вектор движения. –

+0

Он сохранит старые значения и новые значения, запустит процесс обнаружения, а затем все объекты будут обновляться, если потребуется. Таким образом, в примере A будет взаимодействовать с B и A, чтобы сохранить новые скорости. Затем он будет взаимодействовать с C, который изменит и сохранит еще более новые скорости. Затем, как только игра завершает обнаружение, она запускает процесс обновления объектов, которые будут использовать их новые скорости или делать что угодно. – Azaral

+0

Да, но не будет ли C использовать более новые скорости A, когда вы вычисляете новые скорости для C? Предполагая самый простой ответ на столкновение, я могу думать о том, что A имеет начальную скорость (0,1), а C имеет (0, -1), B также имеет (0, -1), A сталкивается с B и C в тот же кадр, сначала он модифицирован B, давая скорость A (0, -1), затем он сталкивается с C, но поскольку они имеют один и тот же вектор скорости, ни изменения (или оба они не увеличивают скорость в одном направлении). Или вы имели в виду, что новые скорости сохраняются в новом списке, а списки меняются местами после выполнения всех вычислений? –

ответ

2

Что касается многих тем игра-развития, нет общего ответа на этот вопрос, и это зависит от типа игры, но держать некоторые вещи в виду, когда речь идет о обходе ваших объектов:

  • Try подумать о том, как вы будете делать фактическую реакцию после обнаружения столкновения (будете ли вы использовать двойную диспетчерскую, посетитель, downcasting/rtti, сохраняя черты, которые можно использовать в карте функций, ...). Существует несколько методов, и все они имеют свои преимущества и недостатки. Метод, который вы выбираете, может отражать то, как вы совершаете фактический обход.
  • Попытайтесь разделить свои сцены на типы объектов. Например, если у вас много статических объектов, которые никогда не будут перемещаться, было бы смешно проверять все это друг против друга, вы должны их разделить. Но, как правило, не пытайтесь специализироваться на этом слишком много, имея что-то вроде static vs dynamic, вероятно, даст большие преимущества, имея 100 типов, создаст адский черт, обычно не имеющий реального выигрыша.
  • Это может быть связано с вашим механизмом закупорки.Например, если он основан на базе портала, маловероятно, что объекты из разных ячеек будут сталкиваться.

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

+0

Есть ли ссылки на хороший учебник для некоторых из этих вещей, желательно что-то, что идет действительно шаг за шагом? Мне труднее всего пытаться учиться, просто читая их, нужно увидеть, как это происходит, и объяснить это. – Azaral

+0

@Azaral: Большая часть того, что я знаю о обнаружении столкновения, - это опыт или чтение отдельных статей. Я не могу рекомендовать книгу или учебник. – KillianDS

+0

Хорошо, спасибо в любом случае. – Azaral

Смежные вопросы