2016-08-15 68 views
1

我有一名球員和一堵牆,每當球員走進牆壁將球推開。牆是靜態的,玩家是動態的,任何人都知道如何解決這個問題?爲什麼我的動態物理體能夠推動我的靜態物理體?在雨燕

播放器代碼:

player.texture = SKTexture(imageNamed: "player") 
player.position = CGPoint(x: 0 + player.frame.width/2,y:  self.frame.height + player.frame.height/2) 
player.zPosition = 2 
player.physicsBody?.affectedByGravity = true 
player.physicsBody?.dynamic = true 
player.physicsBody?.allowsRotation = false 
player.physicsBody?.pinned = false 
player.physicsBody?.mass = 0.18 
player.physicsBody?.restitution = 0 

代碼到移動玩家:

let moveForward = SKAction.moveByX(1, y: 0, duration: 0.01) 

牆代碼:

backWall = SKSpriteNode(imageNamed: "up") 
backWall.size = CGSize(width: 70, height: 70) 
backWall.position = CGPoint(x: 0 + 35, y: ground.frame.height) 
backWall.zPosition = 3 
backWall.physicsBody?.categoryBitMask = PhysicsCategory.backWall 
backWall.physicsBody?.contactTestBitMask = PhysicsCategory.backWall 
backWall.physicsBody?.collisionBitMask = PhysicsCategory.backWall 
backWall.physicsBody?.dynamic = false 
backWall.physicsBody?.affectedByGravity = false 
backWall.physicsBody?.allowsRotation = false 
backWall.physicsBody?.friction = 1.0 
backWall.physicsBody = SKPhysicsBody(rectangleOfSize: backWall.size) 
+0

這絕對是不正確的,物理仍然適用,從移動物體的0速度 – Knight0fDragon

回答

1

即使你的牆不是動態的,它仍然是一個具有體積和質量的物理體。你想使用SKPhysicsBody(edgeLoopFromRect:)如果你想要身體不能移動,不必擔心先進的物理被應用到它

1

當你初始化SKSpriteNode,其physicsBody爲零。

所以,你的代碼的這些行:

backWall.physicsBody?.categoryBitMask = PhysicsCategory.backWall 
backWall.physicsBody?.contactTestBitMask = PhysicsCategory.backWall 
backWall.physicsBody?.collisionBitMask = PhysicsCategory.backWall 
backWall.physicsBody?.dynamic = false 
backWall.physicsBody?.affectedByGravity = false 
backWall.physicsBody?.allowsRotation = false 
backWall.physicsBody?.friction = 1.0 

被忽略。

您可能需要分配SKPhysicsBody第一:

backWall.physicsBody = SKPhysicsBody(rectangleOfSize: backWall.size) 
backWall.physicsBody?.categoryBitMask = PhysicsCategory.backWall 
backWall.physicsBody?.contactTestBitMask = PhysicsCategory.backWall 
backWall.physicsBody?.collisionBitMask = PhysicsCategory.backWall 
backWall.physicsBody?.dynamic = false 
backWall.physicsBody?.affectedByGravity = false 
backWall.physicsBody?.allowsRotation = false 
backWall.physicsBody?.friction = 1.0 

我沒有測試你的代碼,所以你可能需要修正的其他部分。尤其是,如果您的playerphysicsBody設置正確,我很擔心。

+0

我這樣做了,但現在球員只是穿過牆壁 – Jason

+0

爲什麼牆壁要與​​牆壁碰撞?不應該爲collisionBitMask和contactBitMask指向播放器 – Knight0fDragon

+0

在某些情況下,如果某些情況是零時沒有合理的恢復行爲,那麼可能只是不安全地解包!,以便程序在進入不良狀態時可以更快地失敗,並且您可以儘早排除根本原因。 –