Swift Pong (без SpriteKit): как рассчитать углы мяча для перемещения мяча - PullRequest
6 голосов
/ 29 июня 2019

Я пытаюсь сделать игру Pong используя Swift, но без использования SpriteKit.До сих пор я смог успешно нарисовать прямоугольник на своем виде, и я могу перетащить его по экрану.Это мой текущий код:

import UIKit

class PongView: UIView {
    lazy var paddle: CGRect = {
        return CGRect(x: 200,
                             y: 200,
                             width: self.frame.width / 6,
                             height: self.frame.height / 60)
    }()
    var movePaddle = false

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        let gesture = UIPanGestureRecognizer(target: self, action: #selector(dragPaddle(recognizer:)))
        addGestureRecognizer(gesture)
    }

    override func draw(_ rect: CGRect) {
        drawPaddle(rect)
    }

    func drawPaddle(_ rect: CGRect) {
        let path = UIBezierPath(rect: paddle)
        UIColor.black.set()
        path.fill()
    }

    func paddleInBounds() -> Bool {
        //padding vars are calculated in another file
        return (paddle.minX >= frame.minX + leftPadding) &&
               (paddle.maxX <= frame.maxX - rightPadding) &&
               (paddle.minY >= frame.minY + topPadding) &&
               (paddle.maxY <= frame.maxY - bottomPadding)
    }

    func setPaddleInBounds() {
        if (paddle.minX < frame.minX + leftPadding) {
            paddle.origin.x = frame.minX + leftPadding
        }
        if (paddle.maxX > frame.maxX - rightPadding) {
            paddle.origin.x = frame.maxX - rightPadding - paddle.width
        }
        if (paddle.minY < frame.minY + topPadding) {
            paddle.origin.y = frame.minY + topPadding
        }
        if (paddle.maxY > frame.maxY - bottomPadding) {
            paddle.origin.y = frame.maxY - bottomPadding - paddle.height
        }
    }

    @objc func dragPaddle(recognizer: UIPanGestureRecognizer) {
        print(paddle.origin)
        print(paddle.minX)
        print(paddle.minY)
        if paddleInBounds() {
            let translation = recognizer.translation(in: self)
            paddle.origin = CGPoint(x: paddle.minX + translation.x, y: paddle.minY + translation.y)
            recognizer.setTranslation(CGPoint.zero, in: self)
            setNeedsDisplay()
        } else {
            setPaddleInBounds()
        }
    }
}

Теперь я хотел бы создать шар.Я не уверен, как начать, хотя.Столкновения должны быть простыми:

if (ball coordinates are within boundaries) || 
   (ball coordinates touch paddle coordinates) {
    //collision detected
}

Но без SpriteKit я не уверен, как рассчитать углы отскока мяча и соответственно переместить шар, которые являются основными частями игры.Есть предложения?

1 Ответ

3 голосов
/ 02 июля 2019

Проще говоря, вам нужно изменить скорость мяча 'x', если достигнута x-граница, и 'y', если достигнута y-граница.

Учитывая отсутствие трения или ускорения и никаких других факторов, влияющих на скорость. Допустим, мяч движется на 60 градусов вниз вправо и попадает в правую границу. Он должен двигаться ниже с той же скоростью «y», возвращаясь влево с той же скоростью «x». И когда он достигнет нижней границы, он все равно будет двигаться влево, возвращаясь к вершине с той же скоростью 'y'.

var posX = 0
var posY = 0
var velX = 5
var velY = 8

func moveBall(){
    posX += velX
    posY += velY
    if collideOnXBoundary {
        velX = -velX
    }
    if collideOnYBoundary {
        velY = -velY
    }
}

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

...