Как правильно добавить SKPhysicsBody в нарисованную линию, используя SKShapeNode в Spritekit?

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

Какой лучший инициализатор SKPhysicsBody для нарисованной линии?

Правильны ли мои битовые маски категории?

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

import SpriteKit
import UIKit

class GameScene: SKScene, SKPhysicsContactDelegate {

var lines: [Line] = []
var lastTouch: CGPoint?
var touchLocation: CGPoint!
var linePhysics: CGPoint?
var ballCategory:UInt32 = 0b1
var lineCategory:UInt32 = 0b1 << 1
var goalCategory:UInt32 = 0b1 << 2
var floorCategory:UInt32 = 0b1 << 3

override func didMove(to view: SKView) {
    self.physicsWorld.contactDelegate = self
    // assigns metal ball that was a color Sprite node, and is now a SKSpriteNode
    let metalBall:SKSpriteNode = self.childNode(withName: "ball") as! SKSpriteNode
    //assigns physical properties
    metalBall.position = CGPoint(x: -150, y: 100)
    metalBall.physicsBody? = SKPhysicsBody(circleOfRadius: metalBall.size.width / 2)
    metalBall.physicsBody?.affectedByGravity = true
    metalBall.physicsBody?.isDynamic = true
    metalBall.physicsBody?.categoryBitMask = ballCategory
    metalBall.physicsBody?.collisionBitMask = floorCategory | lineCategory




    let floor: SKSpriteNode = self.childNode(withName: "floor") as! SKSpriteNode
    floor.position = CGPoint (x: 0, y: -76)
    floor.physicsBody = SKPhysicsBody(rectangleOf: floor.size)
    floor.physicsBody?.affectedByGravity = false
    floor.physicsBody?.isDynamic = false
    floor.physicsBody?.categoryBitMask = floorCategory
    floor.physicsBody?.collisionBitMask = ballCategory
}
/** 
 * Assigns the first touch location to a variable lastTouch
**/
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     if let firstTouch = touches.first {
          lastTouch = firstTouch.location(in: self)
    }
}
/**
 * Assigns a path to where the finger touches  then adds it to the line array and draws a path using shape nodes
**/
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let firstTouch = touches.first {
     touchLocation = firstTouch.location(in: self)
    //adds coordinates of lines to the line array
    lines.append(Line(start: lastTouch!, end: touchLocation))
    lastTouch = touchLocation
      }
    // path is a changeable variable that assigns a path depending on touch
    let path = CGMutablePath()
    for line in lines {
        path.move(to: CGPoint(x: line.start.x, y: line.start.y))
        path.addLine(to: CGPoint(x: line.end.x , y: line.end.y))
    }
    // colors in the path with ui color black
    let shape = SKShapeNode()
        shape.path = path
        shape.strokeColor = UIColor.black
        shape.lineWidth = 2
        addChild(shape)
        **shape.physicsBody = SKPhysicsBody(edgeChainFrom: shape.path!)**
        shape.physicsBody?.affectedByGravity = true
        shape.physicsBody?.isDynamic = false
        shape.physicsBody?.friction = 1
        shape.physicsBody?.restitution = 0.1
        shape.physicsBody?.angularDamping = 0.0
        shape.physicsBody?.linearDamping = 0
        **shape.physicsBody?.categoryBitMask = lineCategory
        shape.physicsBody?.collisionBitMask =  ballCategory**
}

}

0 ответов

Другие вопросы по тегам