Фазирование спрайтов - PullRequest
       13

Фазирование спрайтов

0 голосов
/ 11 декабря 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) {

        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

        print("x: \(ball.position.x), y: \(ball.position.y)")

    }

    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
    }
}

Снимок экрана игры: Уровень лабиринта

Ответы [ 2 ]

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

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

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

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        //set the location's coordinate system to match the ball
        let location = touch.location(in: ball.parent)
        let angle = atan2(location.x,location.y)
        let velocity = 1.0f //(change this to whatever speed you want your ball to move at)
        ball.velocity =  CGVector(velocity * cos(angle),velocity * sin(angle)) // you may have to swap around the sin/-sin/cos/-cos to get it the way you like it,  I am assuming at angle 0 your ball is facing right, and it rotates in a counter clockwise direction)

    }
}

Теперь ваш шар будет навсегда перемещен в сторону точки касания.

Чтобы избежать отскока, убедитесь, что вы установили восстановление на 0 на теле физики так, чтобыон теряет всю свою энергию при ударе о стену.

Также проверьте, что categoryBitmask имеет некоторую степень 2 на всех объектах, которые требуют физики (1 работает в вашем примере), чтобы он мог столкнуться с чем угодно.в своем роде

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

Вам необходимо установить collisionBitMask для своих узлов и соответственно настроить желаемые правила столкновения (т.е. не допустить, чтобы мяч обрезался сквозь стены лабиринта или опасности):

Я бы рекомендовал взглянуть наСоответствующие документы Apple для разработчиков: https://developer.apple.com/documentation/spritekit/skphysicsbody/1520003-collisionbitmask

Этот другой вопрос также может оказаться полезным: Что такое "Категория маски" и "Маска столкновения" Sprite Kit?

Этобыло также видео, которое я нашел полезным, когда узнал о битовых масках для обнаружения столкновений и контактов между SKSpriteNode s: https://youtu.be/467Doas5J6I?t=1114

* Редактировать *

Вам также необходимо настроить обнаружение контакта с помощью contactTestBitMask, чтобы вы знали, когда мяч коснулся стены, и в этот момент вы можете реализовать логику, чтобы «отбросить» его из жеста перетаскивания.Как правильно заметил @Steve Ives, перетаскивание переопределит физику столкновений, и вы все равно получите отсечение без этого.

...