SpriteKit无效的Swift CollisionBitMask值

时间:2015-07-07 02:38:26

标签: swift sprite-kit collision-detection

我正在为我正在开发的游戏原型设置基础物理测试,但collisionBitMask无法正常工作。我希望charSprite与floorSprite碰撞,而不是将其推入遗忘(因为重力),所以我为charSprite分配了一个testB的categoryBitMask和一个test2的collisionBitMask,反之亦然。这在Test1 = 0和Test2 = 0b10时工作正常,但是当我尝试将Test1和Test2的值更改为0b20和0b30或0和0b10以外的任何其他值时,它不起作用并且floorSprite得到被charSprite推倒到遗忘。这是一个问题,因为我想要的不仅仅是2个类别的位掩码,只有值0和0b10可以工作,即使这样,它只有在charSprite的categoryBitMask为0且collisionBitMask为0b10且floorSprite为0b10,0时才有效。当charSprite的categoryBitMask为1且collisionBitMask为0且floorSprite为0,0b10时,它甚至无法工作!我找不到任何可用的位掩码值!谁能帮我?这是我的代码:

import SpriteKit
class GameScene: SKScene, SKPhysicsContactDelegate {

struct ColliderType {
    static let Test1:      UInt32 = 0
    static let Test2:        UInt32 = 0b10
}

var charSprite:SKSpriteNode!

override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    println("Running")

    self.physicsWorld.contactDelegate = self
    self.physicsWorld.gravity = CGVectorMake(0, -2)



    // Add sprites

    charSprite = SKSpriteNode(imageNamed: "MainCharacterTest")
    charSprite.position = CGPoint(x: self.size.width/2 - 300, y: self.size.height/2 + 200)
    charSprite.zPosition = 1

    charSprite.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: charSprite.size.width, height: charSprite.size.height))

    charSprite.physicsBody?.allowsRotation = false
    charSprite.physicsBody?.dynamic = true
    charSprite.physicsBody?.categoryBitMask = ColliderType.Test2
    charSprite.physicsBody?.collisionBitMask = ColliderType.Test1
    charSprite.physicsBody?.contactTestBitMask = ColliderType.Test1

    self.addChild(charSprite)

    let floorSprite = SKSpriteNode(imageNamed: "testthing")
    floorSprite.position = CGPoint(x: self.size.width/2, y: self.size.height/2 - 200)
    floorSprite.zPosition = -1
    floorSprite.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: floorSprite.size.width * 1, height: floorSprite.size.height * 1))



    floorSprite.physicsBody?.affectedByGravity = false
    floorSprite.physicsBody?.categoryBitMask = ColliderType.Test1
    floorSprite.physicsBody?.collisionBitMask = ColliderType.Test2
    floorSprite.physicsBody?.contactBitMask = ColliderType.Test2
    self.addChild(floorSprite)


func didBeginContact(contact: SKPhysicsContact) {
    if let node1 = contact.bodyA.node {
        // charSprite.removeFromParent()
        // self.addChild(gameover)
    }

}

func didEndContact(contact: SKPhysicsContact) {
    // pass
}
}

2 个答案:

答案 0 :(得分:1)

尝试将地板精灵的collision bit mask设置为0.这个应该让两个精灵不会相互穿过,但当角色落在它上面时地板不会移动

答案 1 :(得分:0)

稍微搞砸了一下,我意识到我需要将floorSprite的动态属性设置为false。很抱歉,之前提到的那个人删除了你的评论 - 出于某些原因,当我尝试它的前几次它仍然无法呈现,直到我从头开始。现在它适用于ColliderType的任何值。