【问题标题】:Swift 3 Physicsbody Collisions doesn't workSwift 3 Physicsbody 碰撞不起作用
【发布时间】:2017-05-05 15:06:25
【问题描述】:

这是我的播放器类

我的玩家不会与他们只是相互穿过的游戏场发生碰撞。 我不希望他们在彼此之上。 我试图用谷歌搜索解决方案,但对我来说,我似乎做得很好。

请帮忙:

class Player: SKShapeNode {
    static public let length: CGFloat = 50
    static public let rect = CGRect(x: -length/2, y: -length/2, width: length, height: length)

    var life = 100

    override init() {
        super.init()
        self.fillColor = SKColor.blue
        self.strokeColor = SKColor.black
        self.position = CGPoint(x: 50, y: 50)

        self.physicsBody = SKPhysicsBody(edgeLoopFrom: Player.rect)
        self.physicsBody?.isDynamic = true
        self.physicsBody?.allowsRotation = false
        self.physicsBody?.categoryBitMask = PhysicsCategory.Robot
        self.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile
        self.physicsBody?.collisionBitMask = PhysicsCategory.Gamefield
        self.physicsBody?.usesPreciseCollisionDetection = true
    }; required init?(coder aDecoder: NSCoder) {fatalError("init(coder:) has not been implemented")}

    func moveBy(vect: CGVector) {
        self.position.x += vect.dx
        self.position.y += vect.dy
        //print(vect.dx, vect.dy)
    }
}

这是我的游戏场景类

struct PhysicsCategory {
    static let None         : UInt32 = UInt32.min
    static let All          : UInt32 = UInt32.max
    static let Robot        : UInt32 = 0b0001      // 1
    static let Gamefield    : UInt32 = 0b0010      // 2
    static let Monster      : UInt32 = 0b0011      // 3
    static let Projectile   : UInt32 = 0b0100      // 4
}

class GameScene: SKScene, SKPhysicsContactDelegate {
    var player = Player(rect: Player.rect)
    var controlL: Control
    var controlR: Control

    var cam = SKCameraNode()

    override init(size: CGSize) {
        controlL = Control(posX: 0, size: size, direction: 1)
        controlR = Control(posX: size.width, size: size, direction: -1)

        super.init(size: size)

    }; required init?(coder aDecoder: NSCoder) {fatalError("init(coder:) has not been implemented")}

    override func didMove(to view: SKView) {
        self.backgroundColor = SKColor.white

        physicsWorld.gravity = CGVector.zero
        physicsWorld.contactDelegate = self

        cam.xScale = 1
        cam.yScale = 1
        self.camera = cam
        player.addChild(cam)

        let gameFieldRect = CGRect(x: 0, y: 0, width: 1000, height: 600)
        let gameField = SKShapeNode(rect: gameFieldRect)
            gameField.fillColor = SKColor.clear
            gameField.strokeColor = SKColor.black
            gameField.position = CGPoint(x: 0, y: 0)

            gameField.physicsBody = SKPhysicsBody(edgeLoopFrom: gameFieldRect)
            gameField.physicsBody?.isDynamic = true
            gameField.physicsBody?.allowsRotation = false
            gameField.physicsBody?.categoryBitMask = PhysicsCategory.Gamefield
            gameField.physicsBody?.contactTestBitMask = PhysicsCategory.None
            gameField.physicsBody?.collisionBitMask = PhysicsCategory.Robot
        self.addChild(gameField)

        self.addChild(player)

        cam.addChild(controlL.add())
        cam.addChild(controlR.add())

我希望有人看到这个错误。我已经花了很长时间。

【问题讨论】:

    标签: swift swift3 sprite-kit skphysicsbody


    【解决方案1】:

    您需要将您的机器人更改为不同的物理体类型(rectangleOf)吗?:

    SpriteKit 支持两种物理实体,基于体积的实体和基于边缘的实体。当你创建一个物理体时,它的种类、大小和形状由你调用的构造方法决定。基于边缘的物体没有质量或体积,并且不受系统中的力或脉冲的影响。基于边缘的实体用于表示物理模拟中的无体积边界或空心空间。相比之下,基于体积的物体用于表示具有质量和体积的物体。

    另外,您是否使用冲动或力量来移动您的机器人?不是 .move(to:) 或 .position =? move 和 position 会破坏你的物理世界(在某些情况下会通过它)

    此外,您似乎需要将类别掩码更改为适当的系列(对于 didBegin(contact:))

    应该是 1, 2 , 4, 8, 16,等等...这就是您获得唯一联系人命中的方式。现在您可以获得“4”的命中从 0+4 或 1+3... 因此,不是唯一的碰撞。

    不过你的 collisionBitMask 看起来不错.. 他们应该会互相碰撞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多