奇怪的Spritekit碰撞Bug取决于SKSpriteNode位置

时间:2018-04-19 11:49:23

标签: ios swift sprite-kit collision

我有一个奇怪的Spritekit问题,我的移动SKSpriteNode正在通过固定SKSpriteNode,具体取决于固定SKSpriteNode的位置。

更新:代码在模拟器中运行,但在真实设备上无效。

示例:

将我的bin SKSpriteNode放置在x:-500位置,y:100正常工作,我的移动SKSpriteNode会按预期发生碰撞。

将我的箱子SKSpriteNode放在x: - 600,y:100处不起作用,我的移动SKSpriteNode不会与箱子发生碰撞。

使用view.showsPhysics = true表明两种情况都有物理主体。

Screenshot from real device showing physics bodies

-500和-508之间的x值按预期工作。我尝试的所有其他值都不起作用。

与我的其他固定SKSpriteNodes的碰撞按预期工作。

enum CollisionTypes: UInt32 {
    case Plane = 1
    case FloorAndRoof = 2
    case OtherObject = 4
    case FinishPoint = 8
}

创建级别的代码

func createLevel(level: Int) {
    switch level {
    case 1:
        createFloor()
        createRoof()
        createTable(position: CGPoint(x: 750, y: 150))
        createCeilingFan(position: CGPoint(x: 750, y: 560))
        createCeilingFan(position: CGPoint(x: 2000, y: 560))
        createWaterDispenser(position: CGPoint(x: 1500, y: 212))
        createBin(position: CGPoint(x: -500, y: 100)) // THIS IS THE PROBLEM LOCATION

        createFinishPoint(position: CGPoint(x: -500, y: 100))
        break
    case 2:
        createFloor()
        createRoof()
        createTable(position: CGPoint(x: 250, y: 150))
        createCeilingFan(position: CGPoint(x: 750, y: 560))
        createCeilingFan(position: CGPoint(x: 2000, y: 560))
        createWaterDispenser(position: CGPoint(x: 1500, y: 212))
        createBin(position: CGPoint(x: -600, y: 100))

        createFinishPoint(position: CGPoint(x: -300, y: 200))
        break
    default:
        break
    }
}

移动SKSpriteNode

func createPlane() {
    plane = SKSpriteNode(imageNamed: "plane1")
    plane.name = "plane1"
    //plane.position = CGPoint(x: -UIScreen.main.bounds.width + plane.size.width , y: 0)
    plane.position = CGPoint(x: 0, y: 300)
    plane.zPosition = 1
    //plane.physicsBody = SKPhysicsBody(texture: plane.texture!, size: plane.texture!.size())
    plane.physicsBody = SKPhysicsBody(texture: planeTexture, size: planeTexture.size())
    plane.physicsBody?.allowsRotation = true
    plane.physicsBody?.categoryBitMask = CollisionTypes.Plane.rawValue
    plane.physicsBody?.collisionBitMask = CollisionTypes.FloorAndRoof.rawValue | CollisionTypes.OtherObject.rawValue // dont collide with finish point
    plane.physicsBody?.contactTestBitMask = CollisionTypes.FloorAndRoof.rawValue | CollisionTypes.OtherObject.rawValue | CollisionTypes.FinishPoint.rawValue
    plane.physicsBody?.usesPreciseCollisionDetection = true
    plane.physicsBody?.isDynamic = true
    plane.physicsBody?.friction = 1
    plane.physicsBody?.restitution = 0
    plane.physicsBody?.mass = 0.1  // customise for different planes
    plane.physicsBody?.angularDamping = 1
    plane.physicsBody?.linearDamping = 0.2 // customise for different planes
    liftFactor = 0.1 // customise for different planes
    addChild(plane)

    flightMode = 4 // dead, should drop to floor and change to mode 0 when at rest
    //print(flightMode)
}

移动Plane应该碰撞的Bin SKSpriteNode

func createBin(position: CGPoint) {

    binFront = SKSpriteNode(imageNamed: "binFront")
    binFront.name = "binFront"
    binFront.setScale(0.15)
    binFront.position = position
    binFront.zPosition = 2 // in front of plane
    addChild(binFront)

    binBack = SKSpriteNode(imageNamed: "binBack")
    binBack.name = "binBack"
    binBack.setScale(0.15)
    binBack.position = position
    binBack.zPosition = 0 // behind plane
    addChild(binBack)

    binPhysicsBody = SKSpriteNode(imageNamed: "binPhysicsBody")
    binPhysicsBody.name = "binPhysicsBody"
    binPhysicsBody.physicsBody = SKPhysicsBody(texture: binPhysicsBody.texture!, size: binPhysicsBody.texture!.size())
    binPhysicsBody.setScale(0.15)
    binPhysicsBody.physicsBody?.allowsRotation = false
    binPhysicsBody.physicsBody?.categoryBitMask = CollisionTypes.OtherObject.rawValue
    binPhysicsBody.physicsBody?.collisionBitMask = CollisionTypes.Plane.rawValue
    binPhysicsBody.physicsBody?.contactTestBitMask = CollisionTypes.Plane.rawValue
    binPhysicsBody.physicsBody?.usesPreciseCollisionDetection = false
    binPhysicsBody.physicsBody?.isDynamic = false
    binPhysicsBody.physicsBody?.friction = 1
    binPhysicsBody.physicsBody?.restitution = 0
    binPhysicsBody.physicsBody?.mass = 50
    binPhysicsBody.position = position
    binPhysicsBody.zPosition = 0
    addChild(binPhysicsBody)

}

1 个答案:

答案 0 :(得分:0)

我仍然不知道我的问题的原因,但我通过改变用于创建我的物理体的图像来解决它。我使用了稍厚的壁厚'在垃圾箱上。