Ios 为什么我的动态物理体能够推动我的静态物理体?迅速地

Ios 为什么我的动态物理体能够推动我的静态物理体?迅速地,ios,swift,xcode,sprite-kit,physics,Ios,Swift,Xcode,Sprite Kit,Physics,我有一个玩家和一堵墙,每当玩家走进墙,它就会把墙推开。墙是静态的,玩家是动态的。有人知道如何修复吗 玩家代码: 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.physicsBo

我有一个玩家和一堵墙,每当玩家走进墙,它就会把墙推开。墙是静态的,玩家是动态的。有人知道如何修复吗

玩家代码:

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)

实例化
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

我还没有测试你的代码,所以你可能需要修复其他部分。特别是,我担心如果您的
播放器的
物理体
设置正确。

当您实例化一个
SKSpriteNode
时,它的
物理体
为零

那么,代码的以下几行:

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

我还没有测试你的代码,所以你可能需要修复其他部分。特别是,我担心如果你的
播放器
物理体
设置正确。

即使你的墙不是动态的,它仍然是一个具有体积和质量的物理体。如果您想要不能移动的物体,并且不必担心高级物理被应用到它身上,那么您需要使用
SKPhysicsBody(edgeLoopFromRect:)
即使您的墙不是动态的,它仍然是一个具有体积和质量的物理体。如果你想要不能移动的物体,而不必担心高级物理会被应用到它身上,你可以使用
SKPhysicsBody(edgeLoopFromRect:)
,我这样做了,但现在玩家只是穿过墙,为什么墙会想与墙碰撞?冲突BitMask和contactBitMask不应该指向播放者吗?在这种情况下,如果某个内容为零,则没有合理的恢复行为,您也可以不安全地打开它!,因此,当程序进入不良状态时,它可以更快地失败,并且您可以更快地排除根本原因。我这样做了,但现在播放器只是穿过墙。为什么墙要与墙碰撞?冲突BitMask和contactBitMask不应该指向播放者吗?在这种情况下,如果某个内容为零,则没有合理的恢复行为,您也可以不安全地打开它!,因此,当程序进入不良状态时,它可以更快地失败,并且您可以更快地找到根本原因。这绝对不是真的,物理仍然适用,如果移动对象的速度为0,那么物理仍然适用,移动对象的速度为0