gpt4 book ai didi

Swift SpriteKit 物理碰撞问题

转载 作者:行者123 更新时间:2023-11-28 09:16:47 26 4
gpt4 key购买 nike

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

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

我完全没有想法。我可以让这两个物体发生碰撞,但它们只是相互反弹。没有错误,也没有任何内容记录到控制台。我希望我犯了一个我忽略的微不足道的错误。

以下是所有相关代码。以防万一……在 didMoveToView 中调用了 setupPhysics()

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!")
}
}

最佳答案

我没有在您的代码中看到任何 contactTestBitMask 的使用。那个控制你是否收到联系人委托(delegate)消息 — collisionBitMask 只是控制它们是否碰撞(反弹)。

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

关于Swift SpriteKit 物理碰撞问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27179964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com