Swift SpriteKit 的 CollisionBitMask 值不起作用
Swift CollisionBitMask values with SpriteKit not working
我正在为正在开发的游戏原型设置基础物理测试,但 collisionBitMask 无法正常工作。我希望 charSprite 与 floorSprite 发生碰撞而不是将其向下推到遗忘状态(由于重力),因此我为 charSprite 分配了 Test1 的 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
}
}
尝试将地板精灵的 collision bit mask
设置为 0。这 应该 让两个精灵不穿过对方,但是当角色落在它
经过一番琢磨,我意识到我需要将floorSprite 的动态属性设置为false。很抱歉之前提到的那个人删除了你的评论——出于某种原因,当我前几次尝试它时它仍然无法正确呈现,直到我从头开始。现在它适用于 ColliderType 的任何值。
我正在为正在开发的游戏原型设置基础物理测试,但 collisionBitMask 无法正常工作。我希望 charSprite 与 floorSprite 发生碰撞而不是将其向下推到遗忘状态(由于重力),因此我为 charSprite 分配了 Test1 的 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
}
}
尝试将地板精灵的 collision bit mask
设置为 0。这 应该 让两个精灵不穿过对方,但是当角色落在它
经过一番琢磨,我意识到我需要将floorSprite 的动态属性设置为false。很抱歉之前提到的那个人删除了你的评论——出于某种原因,当我前几次尝试它时它仍然无法正确呈现,直到我从头开始。现在它适用于 ColliderType 的任何值。