ios - 奇怪的 Spritekit 碰撞错误取决于 SKSpriteNode 位置

标签 ios swift sprite-kit collision

我有一个奇怪的Spritekit我搬家的问题SKSpriteNode正在经过固定SKSpriteNode取决于固定的位置SKSpriteNode .

更新:代码可以在模拟器中运行,但不能在真实设备上运行。

示例:

放置我的垃圾箱 SKSpriteNode在位置 x: -500,y: 100 工作正常,我的移动 SKSpriteNode正如预期的那样发生碰撞。

放置我的垃圾箱 SKSpriteNode在位置 x:-600,y:100 不起作用,我的移动 SKSpriteNode不会与垃圾箱碰撞。

使用view.showsPhysics = true表明这两种情况都存在物理体。

Screenshot from real device showing physics bodies

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

与我的其他固定碰撞 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)
}

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)

}

最佳答案

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

关于ios - 奇怪的 Spritekit 碰撞错误取决于 SKSpriteNode 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49920399/

相关文章:

ios - 在 SceneKit 中跨球体绘制文本

swift - 在 Swift 4.2 中 - 如何在移动后保持 Sprite 大小(toParent : newParent)

ios - SpriteKit : Label 'jumps' when text changes

ios - 确定用户是否在我的 iOS 应用程序中授予了对 "Motion and Fitness"权限的访问权限

ios - 在应用程序启动/恢复时检测在线状态 - 网络可能会延迟启动?

ios - 如何将 ImageView 及其属性从一个 View Controller 传递到另一个 View Controller ?

ios - 我的 Sprites 在 Sprite Kit 中使用 Swift 被压缩

ios - 使用 CollectionView 删除 Core Data 中的记录

ios - 在 TableView 上显示名称

swift - SQLITE 和 Swift 3 挑战