Swift/SpriteKit碰撞检测



我创建了两个对象,一个墙和一个可以碰撞的播放器。如果他们确实发生了碰撞,玩家应该无法进入或越过墙壁。如果我设置了massWall>>massPlayer,玩家有时可以越过墙壁。如果我没有设置质量,玩家和墙就会朝着一个方向移动。我想做到墙是静止的,球员不能越过墙。我的代码:

    func addWall(xPos: CGFloat, yPos: CGFloat){
    let wallNode = SKSpriteNode(imageNamed: "wall")
    wallNode.physicsBody = SKPhysicsBody(circleOfRadius: width/2)
    wallNode.physicsBody!.affectedByGravity = false
    wallNode.physicsBody!.categoryBitMask = ColliderType.Wall.rawValue
    wallNode.physicsBody!.contactTestBitMask = ColliderType.Player.rawValue
    wallNode.physicsBody!.collisionBitMask = ColliderType.Player.rawValue
    wallNode.physicsBody!.mass = 1000000
    let wall = Wall(node: wallNode)
    Walls.append(wall)
    wallNode.position.x = xPos
    wallNode.position.y = yPos
    wallNode.size = CGSize(width: width, height: width)
    addChild(wallNode)
}
func addPlayer(xPos: CGFloat, yPos: CGFloat){
    playerNode = SKSpriteNode(imageNamed: "player")
    playerNode.physicsBody = SKPhysicsBody(circleOfRadius: width/2)
    playerNode.physicsBody!.affectedByGravity = false
    playerNode.physicsBody!.categoryBitMask = ColliderType.Player.rawValue
    playerNode.physicsBody!.contactTestBitMask = ColliderType.Wall.rawValue
    playerNode.physicsBody!.collisionBitMask = ColliderType.Wall.rawValue
    playerNode.physicsBody!.mass = 1

    let player = Player(node: playerNode, healthPoints: 100, attack: 10)
    playerNode.position.x = xPos
    playerNode.position.y = yPos
    playerNode.size = CGSize(width: width, height: width)
    addChild(playerNode)
}

func didBeginContact(){}中,我没有任何代码,因为我现在不知道该怎么处理它。我无法撤消移动,因为我没有跟踪最后一步。

有两件事需要更改。第一个是解决玩家穿过墙壁的问题。这是通过在playerNode上实现精确的碰撞检测来解决的(只需将其与physicsBody配置的其余部分一起使用):

playerNode.physicsBody!.usesPreciseCollisionDetection = true

接下来,你需要让你的墙没有动态物理,这将阻止它在你的playerNode碰到它时做出反应。你不需要设置wallNodemass,你也不需要它。所以应该添加这样的东西(只需将其与physicsBody的其余配置一起使用):

wallNode.physicsBody!.dynamic = false

最新更新