2015-11-14 79 views
0

我创建了两个对象,一个墙壁和一个可以碰撞的玩家。如果他们碰撞,球员不应该能够移入或移过墙壁。如果我设置massWall >> massPlayer,玩家有时可以在墙上移动。如果我没有设置质量,那么球员和墙会朝一个方向移动。我想要让墙壁静止不动,球员不能穿过墙壁。 我的代码:Swift/SpriteKit碰撞检测

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(){}我在它没有代码,因为我不知道现在该怎么做吧。我无法撤销这一运动,因为我没有跟踪最后一步。

回答

1

有两件事情需要改变。第一个是解决玩家穿墙的问题。这是通过使在playerNode这样精确的碰撞检测固定的(只是把这个了与physicsBody配置的其余部分):

playerNode.physicsBody!.usesPreciseCollisionDetection = true 

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

wallNode.physicsBody!.dynamic = false