ios - 如何检测在两个不同类中声明的 Sprite 之间的接触?

标签 ios swift sprite-kit

我有一个 GameScene 类和 Shapes 类。 Shapes 类由三种不同的形状组成。在我的 GameScene 类中,加载了不同的 Sprite ,当应用程序启动时,一个随机形状从 Shapes 类出现在屏幕上并与其中一个 Sprite 接触。我已经采用了几种不同的方法来进行接触检测,但我想我遗漏了一些东西。

这是 Shapes 类:

class Shapes: SKNode{

var cY = SKSpriteNode(imageNamed: "Shape1")
var sY = SKSpriteNode(imageNamed: "Shape2")
var pY = SKSpriteNode(imageNamed: "Shape3")


convenience init(pOffset: CGFloat) {
    self.init()
    positionOffset = pOffset

    self.addChild(cY)
    self.addChild(sY)
    self.addChild(pY)       
}

func updateDelta(delta: NSTimeInterval) {

  .....
}

GameScene 类:

var can1 : Shapes!

let shapesCategory: UInt32 = 1 << 0
let seaCategory: UInt32 = 1 << 1

class GameScene: SKScene, SKPhysicsContactDelegate {

    var sea = SKSpriteNode(imageNamed: "sea")
    sea.position = pos1

    physicsWorld.contactDelegate = self 

    sea.physicsBody = SKPhysicsBody(circleOfRadius: square.size.height / 2)
    sea.physicsBody!.affectedByGravity = false
    sea.physicsBody!.dynamic = false
    sea.physicsBody!.categoryBitMask = seaCategory
    sea.physicsBody!.collisionBitMask = shapesCategory
    sea.physicsBody!.contactTestBitMask = shapesCategory

    addChild(sea)

    // for now I'm just dealing with if shape 1 was to spawn
    can1 = Shapes(pOffset: size.width/4) // a shape spawns on this point
    can1.cY.physicsBody = SKPhysicsBody(circleOfRadius: self.size.height / 28)
    can1.cY.physicsBody!.dynamic = false
    can1.cY.physicsBody?.categoryBitMask = shapesCategory
    can1.cY.physicsBody?.collisionBitMask = seaCategory
    can1.cY.physicsBody?.contactTestBitMask = seaCategory

    addChild(can1)
}

func didBeginContact(contact: SKPhysicsContact) {
    if (contact.bodyA.categoryBitMask) == seaCategory || (contact.bodyB.
        categoryBitMask) == shapesCategory {

        print("contact")
    }

}

这也是处理它的正确方法吗?因为每次我引用 Shapes 类中的特定形状时,例如,说 can1.shape1 都会使每秒帧数急剧下降并使其变得滞后。

编辑:修复了代码行中的一些错误

最佳答案

这里的问题是您没有正确创建物理主体,在代码的原始版本中,您甚至没有将PhysicsBody分配给您需要的形状,而是将其分配给父级。在你的新版本中,你将它分配给形状,但 body 的值与 Sprite 不匹配,所以你的碰撞将关闭。

相反,像这样声明你的 body :

can1.cY.physicsBody = SKPhysicsBody(circleOfRadius: can1.cy.size.width / 2)

你的下一个问题是你关闭了动态,这实质上意味着物理不应该发生,让我们打开它。

can1.cY.physicsBody!.dynamic = false

最后,您的 didBeginContact 代码存在问题,没有保留谁点击谁的顺序,因此您需要确保正确检查字段。

你想要的是这样的:

func didBeginContact(contact: SKPhysicsContact) {
    let bodyA = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? contact.bodyA : contact.bodyB
    let bodyB = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? contact.bodyB : contact.bodyA

    if ((bodyA.categoryBitMask == shapesCategory ) && (bodyB.categoryBitMask == seaCategory )){

        print("contact")
    }

}

关于ios - 如何检测在两个不同类中声明的 Sprite 之间的接触?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582486/

相关文章:

ios - 动画 For 循环图像不显示

ios - LaunchScreen.xib 不显示我的自定义字体

ios - float 如何用十六进制表示?

xcode - 现场节点定位(快速)

ios - 如何检查添加到 Xcode 项目的 podfile 版本?

ios 快速解析 : methods with async results

ios - FIRDatabaseHandle 值或 childChanged

ios - Swift - 在 ios 13 上下载文件错误

ios - 无法移动 Sprite

ios - 如何允许在 SpriteKit 中使用触摸移动多个图像?