【问题标题】:Why is my dynamic physics body able to push my static physics body? In Swift为什么我的动态物理体能够推动我的静态物理体?在斯威夫特
【发布时间】:2016-08-15 22:02:12
【问题描述】:

我有一个玩家和一面墙,每当玩家走进墙壁时,它都会将其推开。墙是静态的,玩家是动态的,有人知道如何解决这个问题吗?

玩家代码:

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

标签: ios swift xcode sprite-kit physics


【解决方案1】:

即使你的墙不是动态的,它仍然是一个具有体积和质量的物理体。如果您想要无法移动且不必担心应用高级物理的物体,您想使用SKPhysicsBody(edgeLoopFromRect:)

【讨论】:

    【解决方案2】:

    当您实例化一个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 设置正确,恐怕。

    【讨论】:

    • 我这样做了,但现在玩家只是穿过墙
    • 墙为什么要撞墙呢?不应该碰撞位掩码和联系位掩码指向玩家
    • 在没有合理的恢复行为的情况下,当某些东西为零时,您最好用 ! 不安全地打开包装,这样程序在进入不良状态时可以更快地失败,并且您可以获得尽快排除根本原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2017-06-10
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多