【问题标题】:Swift SpriteKit Physics Collision IssueSwift SpriteKit 物理碰撞问题
【发布时间】:2015-01-26 14:23:44
【问题描述】:

我正在制作一个简单的基于物理的游戏。除碰撞检测外,一切正常。感觉 didBeginContact 方法被忽略了。

我尝试了几种配置“PhysicsCategory”结构的方法(甚至使用枚举)和几种 bodyA/bodyB 联系语句的形式。

我完全没有想法。我可以让 2 个物体发生碰撞,但它们只是相互反弹。没有错误,也没有记录到控制台。我希望我犯了一个我忽略的小错误。

以下是所有相关代码。万一这很重要... setupPhysics() 在 didMoveToView 中被调用

PhysicsCategory 结构

struct PhysicsCategory {
static let None: UInt32 = 0
static let Fish: UInt32 = 0b1
static let Bird: UInt32 = 0b10
static let BottomEdge: UInt32 = 0b100}    

物理设置方法

//MARK: - Physics Methods
func setupPhysics() {
    /* Physics World */
    physicsWorld.gravity = CGVectorMake(0, -9.8)
    physicsWorld.contactDelegate = self
    physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)

/* Bottom Collision Rect */
    let bEdge = CGRect(x: CGPointZero.x, y: CGPointZero.y, width: size.width, height: size.height * 0.005)
    let bottomEdge = SKShapeNode(rect: bEdge)
    bottomEdge.physicsBody = SKPhysicsBody(edgeLoopFromRect: bEdge)
    bottomEdge.physicsBody!.categoryBitMask = PhysicsCategory.BottomEdge
    bottomEdge.physicsBody!.collisionBitMask  = PhysicsCategory.Fish
    bottomEdge.physicsBody!.dynamic = false
    gameLayer.addChild(bottomEdge)

    /* Fish */
    fish.physicsBody = SKPhysicsBody(circleOfRadius: blowfish.size.height / 2.1)
    fish.physicsBody!.allowsRotation = false
    fish.physicsBody!.categoryBitMask = PhysicsCategory.Fish
    fish.physicsBody!.collisionBitMask = PhysicsCategory.Bird | PhysicsCategory.BottomEdge

    /* Left Random Bird */
    randomLeftBird.physicsBody = SKPhysicsBody(rectangleOfSize: randomLeftBird.size)
    randomLeftBird.physicsBody!.affectedByGravity = false
    randomLeftBird.physicsBody!.allowsRotation = false
    randomLeftBird.physicsBody!.categoryBitMask = PhysicsCategory.Bird
    randomLeftBird.physicsBody!.collisionBitMask = PhysicsCategory.Fish

    /* Random Right Bird */
    randomRightBird.physicsBody = SKPhysicsBody(rectangleOfSize: randomRightBird.size)
    randomRightBird.physicsBody!.affectedByGravity = false
    randomRightBird.physicsBody!.allowsRotation = false
    randomRightBird.physicsBody!.categoryBitMask = PhysicsCategory.Bird
    randomRightBird.physicsBody!.collisionBitMask = PhysicsCategory.Fish
}

didBeginContact 设置

func didBeginContact(contact: SKPhysicsContact!) {
    let collision: UInt32 = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    if collision == PhysicsCategory.Fish | PhysicsCategory.Bird {
        println("COLLISON WITH BIRD!")
        updateLives()
    } else if collision == PhysicsCategory.Fish | PhysicsCategory.BottomEdge {
        println("EPIC FAIL!")
    }
}

【问题讨论】:

    标签: swift physics


    【解决方案1】:

    我在您的代码中没有看到任何contactTestBitMask 的使用。那个控制你是否收到联系人代表消息 - collisionBitMask 只控制它们是否发生冲突(反弹)。

    这些是分开的,因此即使对于不相互反弹的类别,您也可以获得联系人代表消息,但这意味着您也可以有不发送消息的冲突。 (如果您不想为每种碰撞提供游戏逻辑,这可能是一件好事。)您确实需要联系消息的任何内容都需要明确请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多