如何使用Spritekit中的SKShapeNode将SKPhysicsBody正确添加到绘制线?

时间:2017-08-13 01:37:39

标签: swift xcode sprite-kit bitmask skshapenode

我正在创建一个游戏,用户必须绘制一条线与球碰撞,将其从一个位置移动到另一个位置。我似乎无法找到一种方法来放置与另一个物体碰撞的物理体。绘制的线条通过其他对象。我已经在我的形状上尝试过几种不同的SKPhysicBody init,但它们似乎都不起作用。

绘制线的最佳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 个答案:

没有答案