【问题标题】:Detecting collision on SpriteKit from two objects从两个对象检测 SpriteKit 上的碰撞
【发布时间】:2015-08-04 14:42:38
【问题描述】:

当我用大炮射击时,我在检测两个物体的碰撞时遇到了一些问题。目标是从它身上射出一颗子弹,并在它与障碍物相撞时立即将其移除。似乎游戏中根本没有发生碰撞,因为我无法收到我设置的“碰撞”消息。看看下面的代码:

class GameScene: SKScene, SKPhysicsContactDelegate {


enum BodyType: UInt32 {
    case bullet = 1
    case line = 2
    case breaker = 4
}

我已经枚举了组件,因此我可以将它们设置在位掩码类别中。之后,我在触摸开始时进行了拍摄设置。

 override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    /* Called when a touch begins */

    for touch in (touches as! Set<UITouch>) {

    let bullet = SKSpriteNode(imageNamed: "bullet.png")

    bullet.position = self.shooterTriangle.position

    var actionRotate = SKAction.rotateToAngle(CGFloat(2 * -M_PI), duration: NSTimeInterval(0.1))

    let actionMove = SKAction.moveTo(CGPoint(x: 500, y: size.height * 0.5), duration: NSTimeInterval(0.5))

    let removeBullet = SKAction.removeFromParent()

    bullet.runAction(SKAction.sequence([actionRotate]))

    bullet.runAction(SKAction.sequence([actionMove, removeBullet]))

    addChild(bullet)

        // Bullet Physics Start ****

        bullet.physicsBody? = SKPhysicsBody(circleOfRadius: bullet.size.width/2.0)

        bullet.physicsBody?.dynamic = true
        bullet.physicsBody?.affectedByGravity = false
        bullet.physicsBody?.allowsRotation = false
        bullet.physicsBody?.categoryBitMask = BodyType.bullet.rawValue
        bullet.physicsBody?.contactTestBitMask = BodyType.line.rawValue
        bullet.physicsBody?.collisionBitMask = BodyType.line.rawValue

    }
}

然后我在 loadGameComponents 函数中添加了我希望子弹碰撞的行...

func loadGameComponents() {

//Load line....

    let line = SKSpriteNode(imageNamed: "Line_1.png")

    line.position = CGPoint(x: size.width * 0.95, y: size.height * (2.0))

    addChild(line)

    var actualSpeedDuration = 2.2

    let lineActionMove = SKAction.moveTo(CGPoint(x: size.width * 0.95, y: size.height * 0.6), duration: NSTimeInterval(actualSpeedDuration))

    line.runAction(SKAction.sequence([lineActionMove]))

    // Line Physics starts! *****

    line.physicsBody? = SKPhysicsBody(rectangleOfSize: CGSize(width: line.size.width, height: line.size.height))

    line.physicsBody?.dynamic = false
    line.physicsBody?.affectedByGravity = false
    line.physicsBody?.allowsRotation = false
    line.physicsBody?.categoryBitMask = BodyType.line.rawValue
    line.physicsBody?.contactTestBitMask = BodyType.bullet.rawValue
    line.physicsBody?.collisionBitMask = 0

最后,我在 didLoad 函数中定义了 contactDelegate = self 并包含了 didBeginContact 方法

func didBeginContact(contact: SKPhysicsContact) {
    println("Contact!!!")
}

我根本没有收到消息,但我不确定出了什么问题!

感谢您的耐心等待! :)

【问题讨论】:

  • 尝试在此答案中使用 checkPhysics() 函数 - stackoverflow.com/questions/36570859/… 当您的联系人/碰撞没有按您认为的那样工作时。它遍历场景中的所有节点,并将它们的碰撞和接触测试位掩码与每个其他节点进行比较,以打印出将发生哪些碰撞和接触。

标签: swift sprite-kit collision-detection


【解决方案1】:

看起来主要问题是我在声明精灵的物理主体时曾经放置可选指示器(?)。应该在这行进行更正...

line.physicsBody? = SKPhysicsBody(rectangleOfSize: CGSize(width: line.size.width, height: line.size.height))

bullet.physicsBody? = SKPhysicsBody(circleOfRadius: bullet.size.width/2.0)

删除它们解决了我的问题:)

我还在我的 didMoveToView 方法中包含了view.showPhysics = true,因此很容易看到精灵之间的边界。

【讨论】:

    猜你喜欢
    • 2016-02-17
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多