Заставьте спрайт двигаться со скоростью - PullRequest
0 голосов
/ 13 декабря 2018

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

В данный момент я использую движение, основанное на местоположении:

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
            print("x: \(ball.position.x), y: \(ball.position.y)")
        }
    }

как мне сделать так, чтобы он не перемещался вокруг других узлов спрайта и фактически реагировал с элементами categoryBitMask?

Я новичок во всем этом.Надеюсь, вы понимаете:)

REST OF МОЙ КОД:

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

    danger1.physicsBody = SKPhysicsBody()
    danger1.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory
    danger2.physicsBody = SKPhysicsBody()
    danger2.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory

    ball.physicsBody = SKPhysicsBody()
    ball.physicsBody?.categoryBitMask = PhysicsCategories.ballCategory
    ball.physicsBody?.contactTestBitMask = PhysicsCategories.dangerCategory
    ball.physicsBody?.collisionBitMask = PhysicsCategories.none

    goal.physicsBody = SKPhysicsBody(circleOfRadius: goal.size.width/2)
    goal.physicsBody?.categoryBitMask = PhysicsCategories.goalCategory

    danger1.physicsBody?.isDynamic = true
    ball.physicsBody?.isDynamic = true
    goal.physicsBody?.isDynamic = true
    danger2.physicsBody?.isDynamic = true
    danger2.physicsBody!.affectedByGravity = false
    danger1.physicsBody!.affectedByGravity = false
    goal.physicsBody!.affectedByGravity = false
    ball.physicsBody!.affectedByGravity = false
    setupPhysics()

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

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
        print("x: \(ball.position.x), y: \(ball.position.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 {
        ball.position = CGPoint(x: 0, y: 550)
    } else if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.goalCategory {
        print("Goal!")
    }
}

}

1 Ответ

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

Попробуйте закомментировать эту строку:

ball.physicsBody?.collisionBitMask = PhysicsCategories.none

, которая предотвращает столкновение мяча с чем-либо, т.е. на него не влияют столкновения с любым объектом.Примечание - это НЕ означает, что столкновение с мячом не влияет на другие объекты.Столкновение двухстороннее - учитывая 2 узла A и B, вы должны определить, сталкивается ли A с B и , если B сталкивается с A. Это не обязательно для контакта - достаточно определить, что контакты AB. Если на самом деле b переходит в A, didBegin() все равно будет вызвано.Вы не должны определять этот контакт B также.

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

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

Попробуйте ввести:

print("Contact") 

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

Если вы хотите перетащить спрайты пальцем, то заставить их отскочить (столкнуться) с другими спрайтами может быть непросто, поскольку перетаскивание подразумевает, что вы хотите установить их положение вручную, а отскоки подразумеваютчто вы хотите, чтобы спрайты перемещались с помощью движка Sprite-Kit, а 2 не совместимы на самом деле.

Вероятно, стоит указать, что «столкновения» - это спрайты, отскакивающие друг от друга и обрабатываемые движком SK,collisionBitMask контролирует, какие объекты отскакивают друг от друга.

«Контакты» - это просто способ получать уведомления при касании 2 объектов.Они контролируются contactTestBitMask.

Как контакт, так и коллизии полагаются на categoryBitMAsk

Моё пошаговое руководство для коллизий и контактов: https://stackoverflow.com/a/51041474/1430420

И руководство по коллизиям и контактамбитовые маски: https://stackoverflow.com/a/40596890/1430420

Управление битовыми масками для включения и выключения отдельных столкновений и контактов.https://stackoverflow.com/a/46495864/1430420

...