Перемещайте спрайт со скоростью, чтобы следовать за пальцем - PullRequest
0 голосов
/ 17 декабря 2018

Есть ли способ использовать скорость, чтобы спрайт следовал за вашим пальцем?Я хочу, чтобы спрайт следовал за моим пальцем, но я не хочу, чтобы его перетаскивали.Я хочу, чтобы он мог взаимодействовать с другим спрайтом со свойствами делегата.

Например: я хочу, чтобы мяч сбрасывался при ударе о стену.У меня есть код для сброса мяча.Когда мяч попадает в стену, он не сбрасывается.Я вставил оператор печати, чтобы увидеть, регистрирует ли он столкновения.Когда мяч ударяется о стену, он печатает утверждение.

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

Или может быть ошибка с моим кодом.

Код:

import SpriteKit
import GameplayKit



class GameScene: SKScene {

    var ball = SKSpriteNode()
    var danger1 = SKSpriteNode()
    var danger2 = SKSpriteNode()
    var goal = SKSpriteNode()


    override func didMove(to view: SKView) {

        physicsWorld.contactDelegate = self
        ball = self.childNode(withName: "ball") as! SKSpriteNode
        danger1 = self.childNode(withName: "danger1") as! SKSpriteNode
        danger2 = self.childNode(withName: "danger2") as! SKSpriteNode
        goal = self.childNode(withName: "goal") as! SKSpriteNode

        let border = SKPhysicsBody(edgeLoopFrom: self.frame)
        border.friction = 0
        border.restitution = 0

        danger1.physicsBody = SKPhysicsBody(rectangleOf: danger1.size)
        danger1.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory
        danger1.physicsBody?.isDynamic = false

        danger2.physicsBody = SKPhysicsBody(rectangleOf: danger2.size)
        danger2.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory
        danger2.physicsBody?.isDynamic = false

        ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2)
        ball.physicsBody?.categoryBitMask = PhysicsCategories.ballCategory
        ball.physicsBody?.contactTestBitMask = PhysicsCategories.dangerCategory | PhysicsCategories.goalCategory
        ball.physicsBody?.collisionBitMask = PhysicsCategories.none
        ball.physicsBody?.isDynamic = true
        ball.physicsBody!.affectedByGravity = false

        goal.physicsBody = SKPhysicsBody(rectangleOf: goal.size)
        goal.physicsBody?.categoryBitMask = PhysicsCategories.goalCategory
        goal.physicsBody?.isDynamic = false


        setupPhysics()
        startGame()
    }
    func setupPhysics() {
        physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0)
        physicsWorld.contactDelegate = self
    }


    func startGame() {
        ball.position = CGPoint(x: 0, y: 550)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            ball.position.x = location.x
            ball.position.y = location.y

        }
    }

    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered
    }
}

extension GameScene: SKPhysicsContactDelegate {



    func didBegin(_ contact: SKPhysicsContact) {
        let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

        if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.dangerCategory {
            print("Contact")
        } else if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.goalCategory {
            print("goal contact")
        }
    }

}

1 Ответ

0 голосов
/ 17 декабря 2018

Как вы упомянули, вы должны использовать скорость вместо позиции.

Вы должны применить разницу позиций.Чтобы сделать его немного более плавным, вы должны также прибавить вес к вашей скорости.

Это не было проверено и больше похоже на псевдокод, но это то, что вы должны делать в основном.

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let destination = touch.location(in: self)
        let position = ball.position
        let direction = destination - position // the vector of the difference
        let weight = 0.95 // 0.0 to 1.0 

        ball.velocity = CGVector(direction * weight) // multiply the vector by the weight
    }
}

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

...