2016-08-15 66 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

在某些情况下,如果某些情况是零时没有合理的恢复行为,那么可能只是不安全地解包!,以便程序在进入不良状态时可以更快地失败,并且您可以尽早排除根本原因。 –