如果玩家留在设定的位置而没有移动,物体将不会检测到碰撞

If the player is left at the set location without being moved, objects won't detect a collision

我正在制作我的第一个 iOS 游戏并且已经取得了很大的进步。我有碰撞检测,但是如果我 运行 游戏并且不将玩家从它的设置位置 player.position = CGPoint(x: size.width/2, y: size.height/2) 移动,那么敌人将直接穿过玩家并且不会检测到碰撞。如果我将玩家从那个地方移到敌人身上,那就是它开始工作的时候。

我不知道问题出在我生成玩家的顺序还是我的碰撞检测,但这是一些代码,希望您能提供帮助。

struct PhysicsCategory {
    static let None      : UInt32 = 0
    static let All       : UInt32 = UInt32.max
    static let Player   : UInt32 = 0b1
    static let Bee: UInt32 = 0b10
}

func didBeginContact(contact: SKPhysicsContact) {
    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }
    if ((firstBody.categoryBitMask & PhysicsCategory.Player != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.Enemy != 0)) {
            collision(firstBody.node as SKSpriteNode, Player: secondBody.node as SKSpriteNode)
    }
}

我不确定你是否需要它,但这是给玩家的

class GameScene: SKScene, SKPhysicsContactDelegate {
  let player = SKSpriteNode(imageNamed: "Spaceship")
  player.position = CGPoint(x: size.width/2, y: size.height/2)
  addChild(player)
  physicsWorld.gravity = CGVectorMake(0, 0)
  physicsWorld.contactDelegate = self
}

编辑 我忘记了:

    player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
    player.physicsBody?.dynamic = true
    player.physicsBody?.categoryBitMask = PhysicsCategory.Player
    player.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy
    player.physicsBody?.collisionBitMask = PhysicsCategory.None
    player.physicsBody?.usesPreciseCollisionDetection = true

    enemy.physicsBody = SKPhysicsBody(rectangleOfSize: enemy.size)
    enemy.physicsBody?.dynamic = true
    enemy.physicsBody?.categoryBitMask = PhysicsCategory.Enemy
    enemy.physicsBody?.contactTestBitMask = PhysicsCategory.Player
    enemy.physicsBody?.collisionBitMask = PhysicsCategory.None 

您的代码中哪里是您之前忘记 post 的代码部分?您为播放器设置碰撞位掩码和 contactTestBitMask 的部分?

如果碰撞仅在您移动播放器时起作用,听起来这部分代码在 touchesEnded 方法中,是吗?

您可以尝试将那部分代码移动到 class init 中,这样它就会在开始时执行,而不仅仅是在玩家移动时执行。