iPhone OpenGL ES: стрельба и обнаружение попадания предмета - PullRequest
0 голосов
/ 27 декабря 2010

Я разработал способ обнаружения прикосновения к объекту с помощью glReadPixels, но как я могу определить, попадет ли объект в другой объект (например, пуля).

Я не могу сделать это с обнаружением цветов.

Ответы [ 3 ]

3 голосов
/ 27 декабря 2010

Как уже говорили другие, делайте это в объектной модели, а не в графике.

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

for each bullet
  for each hittableObjectInWorld
    if ([hittableObject isTouchedBy:bullet]) {/*handle collision*/}
  endFor
endFor

hittableObject::isTouchedBy:(Sprite *)otherObject {
  xDistance = [self x] - otherObject.x;
  yDistance = [self y] - otherObject.y;
  totalDistance = sqrt((xDistance*xDistance) + (yDistance*yDistance));
  if (totalDistance <= [self size]) return YES;
  else return NO;
}

Теперь у вас есть простая система обнаружения столкновений. Здесь есть некоторые абстракции: мы воспринимаем каждый удаляемый объект, как если бы он был в форме сферы с радиусом в «размере». Пули очень малы, но вы можете исправить это, добавив радиус пули к радиусу каждого из объектов, которые могут быть хитовыми, и таким образом математика будет бегать чуть быстрее.

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

Удачи!

1 голос
/ 27 декабря 2010

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

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

Наконец, если вы найдете все это немного подавляющим, я бы порекомендовал использовать игровой движок, такой как cocos2d или Unity .

1 голос
/ 27 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...