Swift Pong (без SpriteKit): обнаружение стороны весла, в которую попал мяч - PullRequest
2 голосов
/ 02 июля 2019

В настоящее время я делаю игру в понг в Swift (без SpriteKit) для одного игрока: мяч может отскакивать от всех сторон обзора.После некоторых исследований я использовал этот алгоритм для обнаружения столкновений:

if (rect1.x < rect2.x + rect2.width &&
    rect1.x + rect1.width > rect2.x &&
    rect1.y < rect2.y + rect2.height &&
    rect1.y + rect1.height > rect2.y) {
        // collision detected!
}

Это прекрасно работает, но как я могу определить, на какую сторону весла попал мяч?

Мне нужно знатьэто потому что: если мяч коснется нижней или верхней стороны весла, я бы умножил приращение у на -1.Если мяч попадет в левую или правую часть лопатки, я умножу приращение x на -1.

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Я нашел достойное (но не очень хорошее) решение. Эта функция возвращает true, если мяч касается левой или правой стороны лопатки, и false, если мяч касается верхней или нижней части лопатки.

func touchHorizontalPaddle() -> Bool {
    if abs(ball.origin.x + ball.width - paddle.origin.x) < 1 || 
       abs(ball.origin.x - (paddle.origin.x + paddle.width)) < 1 {
        return true
    }
    return false
}

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

0 голосов
/ 03 июля 2019

Если rect1 и rect2 оба являются CGRect, то вы можете получить среднюю точку с помощью ...

rect1.midY

И

rect2.midY

Затем вы можете определить, находится ли средний шаровой шар (какой бы он ни был) выше или ниже, чем середина весла.

if rect1.midY >= rect2.midY

Etc ...

Кстати, вам лучше использовать для этого SpriteKit. Но если вы просто делаете это для развлечения, продолжайте. Надеюсь, это сработает. : -)

...