Обнаружение столкновения iPhone Pong - PullRequest
0 голосов
/ 14 октября 2009

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

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

if (CGRectIntersectsRect (ball.frame, playerPaddle.frame))
    {
        if (ball.center.y < playerPaddle.center.y) //hits the "top" of the computer paddle
        {
            AudioServicesPlaySystemSound (hitSound);
            ballVelocity.y = -ballVelocity.y; // turn ball around if collide
        }
    }

    if (CGRectIntersectsRect (ball.frame, computerPaddle.frame))
    {
        if (ball.center.y > computerPaddle.center.y) //hits the "bottom" of the computer paddle
        {
            AudioServicesPlaySystemSound (hitSound);
            ballVelocity.y = -ballVelocity.y; // turn ball around if collide
        }
    }

Спасибо за помощь.

Ответы [ 5 ]

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

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

3 голосов
/ 14 октября 2009

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

В частности:

if (CGRectIntersectsRect (ball.frame, playerPaddle.frame))
{
    AudioServicesPlaySystemSound (hitSound);
    CGRect frame = ball.frame;
    frame.origin.y = playerPaddle.frame.origin.y - frame.size.height;
    ball.frame = frame;
    ballVelocity.y = -ballVelocity.y; // turn ball around if collide
}

if (CGRectIntersectsRect (ball.frame, computerPaddle.frame))
{               
    AudioServicesPlaySystemSound (hitSound);
    CGRect frame = ball.frame;
    frame.origin.y = CGRectGetMaxY(computerPaddle.frame);
    ball.frame = frame;
    ballVelocity.y = -ballVelocity.y; // turn ball around if collide
}
0 голосов
/ 01 февраля 2010

Эта проблема была похожа на проблему, с которой я столкнулся, когда мяч попал в ракетку. Чтобы решить эту проблему, я создал логическое значение. Когда происходит столкновение, логическое значение устанавливается в true. Когда мяч попадает в стену, логическое значение устанавливается в false. Внутри условного оператора, где мы проверяем Rectangle Intersection, я добавляю проверку, чтобы убедиться, что столкновение установлено на false.

Итак, в конечном итоге произойдет следующее:

  • Мяч попадает на весло, а логическое значение установлено на true.
  • Скорость на мяче обратная
  • Когда обнаружение столкновения пытается выполнить, это не так, потому что логическое значение истинно
  • Мяч отскакивает от стены, а логическое значение сбрасывается на false
  • Мяч сталкивается с другим веслом, и логическое значение снова устанавливается в значение true

Попробуйте и дайте мне знать, как это работает.

-Brandon

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

Я думаю, что самый простой способ справиться с этим - это добавить в логику, чтобы после столкновения с веслом вектор скорости мяча всегда был направлен в сторону от центральной точки весла. Таким образом, даже если мяч «снова столкнется» с веслом (поскольку он зашел слишком далеко, чтобы снова выйти на следующий такт цикла событий), он просто продолжит движение в сторону от весла после второго «отскока» .

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

Требуется дополнительное условие.

if (ballVelocity.y > 0 && CGRectIntersectsRect (ball.frame, playerPaddle.frame))
    {
        if (ball.center.y < playerPaddle.center.y) //player
        {
            AudioServicesPlaySystemSound (volleyFileID);
            ballVelocity.y = -ballVelocity.y;
        }
    }

    if (ballVelocity.y < 0 && CGRectIntersectsRect (ball.frame, computerPaddle.frame)) //computer
    {
        if (ball.center.y > computerPaddle.center.y)
        {
            AudioServicesPlaySystemSound (volley2FileID);
            ballVelocity.y = -ballVelocity.y;
        }
    }
...