2015-07-07 4 views
0

Я настраиваю основные физические тесты для прототипа игры, которую я разрабатываю, но collisionBitMask работает неправильно. Я хочу, чтобы charSprite сталкивался с floorSprite и НЕ отбрасывал его в забвение (из-за силы тяжести), поэтому я назначаю charSprite категориюBitMask для Test1 и collisionBitMask для Test2 и наоборот для floorSprite. Это отлично работает, когда Test1 = 0 и Test2 = 0b10, но когда я пытаюсь изменить значения Test1 и Test2, скажем, 0b20 и 0b30, или любые другие значения, отличные от 0 и 0b10, это не работает, и floorSprite сбрасывается вниз к забвению charSprite. Это проблема, потому что я хочу больше, чем просто две категории для бит-масок, и работают только значения 0 и 0b10, и даже тогда она работает только тогда, когда charSprite имеет категориюBitMask 0 и collisionBitMask 0b10, а floorSprite - 0b10,0. Он даже не работает, когда charSprite имеет категориюBitMask из 1, а collisionBitMask 0 и floorSprite - 0,0b10! Я не могу найти значения для моих бит-масок, которые работают! Может кто-нибудь мне помочь? Вот мой код:Значения Swift CollisionBitMask с SpriteKit не работают

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 
} 
} 
+0

вместо структуры, вы имели в виду перечисление? – Siriss

+0

Нет - учебник, который я узнал из использованных структур. Должен ли я использовать перечисление? – flysaiah

+0

Я просто попытался использовать перечисление, но он все еще не работает, к сожалению. – flysaiah

ответ

0

Немного поразмыслив, я понял, что мне нужно установить динамический атрибут floorSprite на false. Извините за человека, который упомянул об этом ранее, а затем удалил ваш комментарий - по какой-то причине, когда я попробовал его в первые несколько раз, он все равно не появлялся, пока я не начал с нуля. Теперь он работает для любого значения для ColliderType.

1

установка попробовать пол спрайта collision bit mask 0. Это должен пусть оба спрайта не проходят через друг друга, но пол не будет двигаться, когда персонаж попадает на него

+0

Это не решает мою проблему, потому что я хочу иметь кучу разных типов коллайдера, и я хочу, чтобы некоторые из них сталкивались друг с другом, а не с другими, и я не могу этого сделать, если я просто полагаюсь на 0. – flysaiah

+0

хорошо, вы можете объявить разные бит-бит-бит на других спрайтах, которые вам нужно столкнуться друг с другом. Но так как вы хотите, чтобы пол не двигался, держите его равным 0. Или в вашей структуре задано одно из значений переменных 0 для пола –

+0

Таким образом, единственный способ не справиться с спрайтом - установить его collisionBitMask равным 0 ? Это не кажется правильным. Что делать, если я хочу, чтобы 2 разных типа спрайтов не были сдвинуты и имели разные collisionBitMasks? – flysaiah

Смежные вопросы