gpt4 book ai didi

swift - 物理联系代表不能快速工作 3 xCode 8

转载 作者:行者123 更新时间:2023-11-28 06:18:32 25 4
gpt4 key购买 nike

无论我做什么,我似乎都无法让我的 didBegin 接触函数正常工作,我的 spriteNodes 设置为动态,我很确定我的 categoryBitMasks 和 contactTestBitMasks 是正确的......这是我代码的物理部分.我的 didBeginContact 函数没有打印任何打印命令。

class GameScene: SKScene, SKPhysicsContactDelegate {

var theLine = SKSpriteNode()
var fallers = SKSpriteNode()

enum colliderType: UInt32 {

case theLine = 1
case fallers = 2
}

override func sceneDidLoad() {

self.physicsWorld.contactDelegate = self

theLine = SKSpriteNode()
theLine.zPosition = 0
theLine.size = CGSize(width: 0, height: screenWidth / 128
theLine.position = CGPoint(x: midX, y: midY)
theLine.physicsBody = SKPhysicsBody(rectangleOf: theLine.size)
theLine.physicsBody?.isDynamic = true
theLine.physicsBody?.affectedByGravity = false
theLine.physicsBody?.allowsRotation = false
theLine.physicsBody?.categoryBitMask = colliderType.theLine.rawValue
theLine.physicsBody?.contactTestBitMask = colliderType.fallers.rawValue
theLine.physicsBody?.collisionBitMask = 0
addChild(theLine)

fallers[i].size = CGSize(width: 75, height: 75)
fallers[i].color = UIColor.white
fallers[i].alpha = 1
fallers[i].setScale(ds * 4)
fallers[i].zPosition = 9
let fallerTexture = fallers[i].texture
fallers[i].physicsBody = SKPhysicsBody(texture: fallerTexture!, size: fallers[i].size)
fallers[i].physicsBody!.isDynamic = true
fallers[i].physicsBody!.categoryBitMask = colliderType.fallers.rawValue
fallers[i].physicsBody!.contactTestBitMask = colliderType.theLine.rawValue
fallers[i].physicsBody!.collisionBitMask = 0
fallers[i].physicsBody!.affectedByGravity = false

addChild(fallers[i])

}



func didBegin(_ contact: SKPhysicsContact) {


//Detects collisions and what nodes the collisions are between.


if contact.bodyA.categoryBitMask == colliderType.theLine.rawValue && contact.bodyB.categoryBitMask == colliderType.fallers.rawValue {

print("CONTACT")

} else if contact.bodyA.categoryBitMask == colliderType.fallers.rawValue && contact.bodyB.categoryBitMask == colliderType.theLine.rawValue {

print("CONTACT")

}

}

更新

我只是在我的 didBeginContactDelegate 中添加了一个 else 语句,当 body 接触时代码被触发,但现在的问题是,我无法对这些接触之间的 body 进行排序。

最佳答案

如果您使用简单的类别,每个物理体只属于一个类别,那么 didBeginContact 的这种替代形式可能更具可读性:

func didBeginContact(contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

switch contactMask {

case colliderTytpe.fallers.rawValue | colliderType.theLine.rawValue:
print("Collision between fallers and theLine")
let fallersNode = contact.bodyA.categoryBitMask == colliderTytpe.fallers.rawValue ? contact.bodyA.node! : contact.bodyB.node!

// Do something with fallersNode
fallersNode.removeFromParent() // For example
score += 10 // For example

default :
//Some other contact has occurred
print("Some other contact")
}
}

(如果您需要处理其他碰撞,只需在开关中添加更多的 case block )。

它避免了弄乱 bodyA 和 bodyB,并将它们排序。只有当您必须对其中一个节点执行特定操作时才需要处理它们,这就是这行代码发挥作用的地方:

let fallersNode = contact.bodyA.categoryBitMask == colliderTytpe.fallers.rawValue ? contact.bodyA.node! : contact.bodyB.node!

它使用 Swift 的三元运算符来表示“如果 bodyA 具有 faller 的类别 bitMask,则将 fallersNode 设置为 bodyA,否则将 fallersNode 设置为 bodyB。

关于swift - 物理联系代表不能快速工作 3 xCode 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44372393/

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