gpt4 book ai didi

ios - 如何在 SpriteKit 中检测不同类型的碰撞

转载 作者:搜寻专家 更新时间:2023-11-01 07:13:48 25 4
gpt4 key购买 nike

我想在 SpriteKit 中检测两种不同类型的碰撞:

当 ballOne 击中 goalOne 且 ballTwo 击中 goalTwo 时:

到目前为止,我已经添加了不同的物理类别:

struct physicsCategory {
static let ballOne :UInt32 = 0x1 << 0
static let goalOne :UInt32 = 0x1 << 1
static let ballTwo :UInt32 = 0x1 << 2
static let goalTwo :UInt32 = 0x1 << 3
}

这是我类(class)的相关部分:

class gameScene: SKScene, SKPhysicsContactDelegate {

var borderBody:SKPhysicsBody!

var myscore:Int = 0
var opponentScore:Int = 10

override func sceneDidLoad() {

super.sceneDidLoad()
physicsWorld.contactDelegate = self

}

func didBegin(_ contact: SKPhysicsContact) {

let firstBody = contact.bodyA.node as! SKSpriteNode
let secondBody = contact.bodyB.node as! SKSpriteNode

if ((firstBody.name == "ballOne") && (secondBody.name == "goalOne")) {
collisionGoalOne(BallOne: firstBody, GoalOne: secondBody)
}

else {

}
}

func collisionGoalOne(BallOne: SKSpriteNode, GoalOne: SKSpriteNode) {
addScore()
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

let touch = touches.first
let touchLocation = touch!.location(in: self)

let ballOne = childNode(withName: "ballOne") as! SKSpriteNode
ballOne.physicsBody?.categoryBitMask = physicsCategory.ballOne
ballOne.physicsBody?.collisionBitMask = physicsCategory.goalOne
ballOne.physicsBody?.contactTestBitMask = physicsCategory.goalOne
ballOne.physicsBody?.isDynamic = true

let goalOne = childNode(withName: "goalOne") as! SKSpriteNode
goalOne.physicsBody?.categoryBitMask = physicsCategory.goalOne
goalOne.physicsBody?.collisionBitMask = physicsCategory.ballOne
goalOne.physicsBody?.contactTestBitMask = physicsCategory.ballOne
goalOne.physicsBody?.isDynamic = false
}

}

现在,当球与墙上的墙壁碰撞时,应用程序会崩溃

让 firstBody = contact.bodyA.node 为! SKSpriteNode

“无法将‘appName.gameScene’类型的值 (0x105320) 转换为‘SKSpriteNode’ (0x1877b5c)。”

很想了解为什么会发生这种崩溃,以及这是否是一种很好的碰撞处理方法。谢谢。

最佳答案

FirstBody 可能无法转换为 SKSpriteNode,因此只有在检查哪些节点发生碰撞后才创建该变量。

请注意,ballOne 可以是 bodyA 或 bodyB,因此请更改您的代码以检查这两种可能性。

我稍微修改了你的代码。希望这有帮助

if ((contact.bodyA.node?.name == "ballOne") && (contact.bodyB.node?.name == "goalOne")) {  
let firstBody = contact.bodyA.node as! SKSpriteNode
let secondBody = contact.bodyB.node as! SKSpriteNode
collisionGoalOne(BallOne: firstBody, GoalOne: secondBody)
} else if ((contact.bodyA.node?.name == "goalOne") && (contact.bodyB.node?.name == "ballOne")) {
let firstBody = contact.bodyA.node as! SKSpriteNode
let secondBody = contact.bodyB.node as! SKSpriteNode
collisionGoalOne(BallOne: secondBody, GoalOne: firstBody)
}

关于ios - 如何在 SpriteKit 中检测不同类型的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43428098/

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