碰撞检测不一致

时间:2018-10-23 05:19:53

标签: swift xcode collision-detection physics

我的碰撞检测大部分时间都在工作,但是有时候一个物理物体会在另一个发生碰撞时进入另一个物理物体。我有一辆具有物理特性的汽车,而路边则具有物理特性。汽车偶尔会吹过马路。我要按位置向前移动汽车,但是我也尝试过用力向前移动,同样的事情也会发生。有谁知道这是什么原因造成的?

我已经这样定义了我的物理类别;

struct PhysicsCategory: OptionSet {
let rawValue: UInt32
init(rawValue: UInt32) { self.rawValue = rawValue }

static let CarCategory =            PhysicsCategory(rawValue: 0b00001)
static let RoadSidesCategory =      PhysicsCategory(rawValue: 0b00010)
static let NoCollisionsCategory =   PhysicsCategory(rawValue: 0b00000)
} 

像这样赋予汽车物理性

func giveCarPhysics(physics: Bool) {
    //give physicsBody to the car and set to collide with the background
    if physics {
        self.size = CGSize(width: self.size.width, height: self.size.height)
        self.physicsBody = SKPhysicsBody(rectangleOf:  CGSize (width: self.size.width * 0.6, height: self.size.height * 0.9), center: CGPoint(x: self.anchorPoint.x, y: self.anchorPoint.y + self.size.height / 2))
        self.physicsBody?.mass = vehicleMass
        self.physicsBody?.usesPreciseCollisionDetection = true
        self.physicsBody?.friction = 0.5
        self.physicsBody?.restitution = 0.2
        self.physicsBody?.affectedByGravity = false
        self.physicsBody?.isDynamic = true
        self.physicsBody?.linearDamping = airResistance
        self.physicsBody?.categoryBitMask = PhysicsCategory.CarCategory.rawValue
        self.physicsBody?.collisionBitMask = PhysicsCategory.RoadSidesCategory.rawValue
        self.physicsBody?.contactTestBitMask = PhysicsCategory.RoadSidesCategory.rawValue 
    }
}

然后给出路边的物理信息;

func createPhysicsRight() {
        for (index, backgroundImageRight) in self.physicsRight.enumerated() {

            let roadSpriteR = SKSpriteNode()
            roadSpriteR.anchorPoint = CGPoint(x: 0.5, y: 0.5)
            roadSpriteR.position = CGPoint(x: 0, y: CGFloat(self.physicsCounterR) * self.frame.size.height)
            roadSpriteR.zPosition = 0
            roadSpriteR.name = "RoadR \(index)"

            print(roadSpriteR.name as Any)

            roadSpriteR.physicsBody = SKPhysicsBody(polygonFrom: backgroundImageRight)
            roadSpriteR.physicsBody?.mass = backgroundMass
            roadSpriteR.physicsBody?.affectedByGravity = false
            roadSpriteR.physicsBody?.isDynamic = false
            roadSpriteR.physicsBody?.categoryBitMask = PhysicsCategory.RoadSidesCategory.rawValue
            roadSpriteR.physicsBody?.collisionBitMask = PhysicsCategory.CarCategory.rawValue
            roadSpriteR.physicsBody?.contactTestBitMask = PhysicsCategory.CarCategory.rawValue
            roadSpriteRArray.append(roadSpriteR)
    }  
}

func createPhysicsLeft() {
    for (index, backgroundImageLeft) in self.physicsLeft.enumerated() {

        let roadSpriteL = SKSpriteNode()
        roadSpriteL.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        roadSpriteL.position = CGPoint(x: 0, y: CGFloat(self.physicsCounterL) * self.frame.size.height)
        roadSpriteL.zPosition = 0
        roadSpriteL.name = "RoadL \(index)"
        roadSpriteL.physicsBody = SKPhysicsBody(polygonFrom: backgroundImageLeft)
        roadSpriteL.physicsBody?.mass = backgroundMass
        roadSpriteL.physicsBody?.affectedByGravity = false
        roadSpriteL.physicsBody?.isDynamic = false
        roadSpriteL.physicsBody?.categoryBitMask = PhysicsCategory.RoadSidesCategory.rawValue
        roadSpriteL.physicsBody?.collisionBitMask = PhysicsCategory.CarCategory.rawValue
        roadSpriteL.physicsBody?.contactTestBitMask = PhysicsCategory.CarCategory.rawValue 
        roadSpriteLArray.append(roadSpriteL)
    }
 }

0 个答案:

没有答案
相关问题