Обнаружение столкновений в OpenGL ES на iPhone

Кажется, у меня странная проблема с 2D-игрой, над которой я работаю. Чтобы определить, приземляется ли спрайт моего игрового персонажа на платформу, я сначала выполняю оператор if, проверяющий CGRectIntersectsRect, и как только я определил, что спрайт игрока и спрайт платформы пересеклись, я затем проверяю, чтобы центральная точка (плюс половина высота игрока) находятся над платформой, если это так, я устанавливаю скорость игрока 'y' на ноль.

playerVelocity.x=5;

playerVelocity.y+=gravity;

if (CGRectIntersectsRect([turtle getBounds], [platform getBounds])) {

 if ([player getPosition].y>p.position.y+([player getBounds].size.height/2)) {
  if (playerVelocity.y>0) {
   playerVelocity.y=0;
   inJump=NO;
  }

 }else {
  inJump=YES;
 }
}

[player setPosition:CGPointMake([player getPosition].x+playerVelocity.x, [player getPosition].y-playerVelocity.y)];

Большую часть времени этот код работает в течение игрового цикла, однако время от времени второй «оператор if» игнорируется, и мой спрайт игрока проходит через платформу. Я создаю эту игру в OpenGL ES 1.1 с собственным классом спрайтов.

Любое понимание этого вопроса будет оценено!


person Scott    schedule 07.07.2010    source источник
comment
Какой балл вам дает [player getPosition]? Верхний левый? Центр? А как насчет p.position?   -  person Anon.    schedule 07.07.2010
comment
Они оба дают центральную точку.   -  person Scott    schedule 07.07.2010


Ответы (2)


Одна вещь, которую нужно проверить, это убедиться, что игрок на самом деле не проходит через платформу. Какая высота платформы? Если высота платформы невелика, то игрок может находиться над платформой (в одном кадре), а затем в следующем кадре (player.y + playerVelocity.y) более чем наполовину через платформу на другом. Это означало бы, что он никогда не «попадет» на платформу, хотя визуально кажется, что это так.

Одна вещь, которую вы можете сделать, это распечатать значения с помощью NSLog(). таким образом, когда вы пропустите, вы можете проверить журналы, чтобы увидеть, какие значения данных были пропущены.

Есть много способов справиться с «приземлением на платформы». Один из них заключается в том, чтобы убедиться, что персонаж достиг достаточно большой высоты, чтобы быть «над» платформой, а затем, если он когда-либо пересекает ее, вы сбрасываете его местоположение, чтобы он находился на платформе.

person christophercotton    schedule 07.07.2010

Если вы делаете платформер, вам придется столкнуться с множеством подобных проблем. Избавьте себя от головной боли и прочитайте учебные пособия MetaNet по физике платформеров: N учебных пособий. Упомянутая вами проблема решается, в частности, наряду с несколькими другими проблемами, с которыми вы, вероятно, столкнетесь.

person cc.    schedule 12.07.2010