【问题标题】:Detect if collision occurred between 2 objects检测两个物体之间是否发生碰撞
【发布时间】:2017-08-21 13:19:06
【问题描述】:

我开始研究 iOS 中的 Sprite Kit 游戏,我想了解如何检测球进入篮筐时是否发生碰撞。

为了让事情更容易理解。在我的篮球架上,我有 2 个角(它们是红色的,很容易看到,它们很突出),它们与它们相连,如果球击中它们,它就会被抛出。

我的问题:我想在球击中任何一个角或球进入篮筐时没有击中任何两个角时引起注意。 (就像一种区分正常投掷和完美投掷的得分方法)

更新:

如何在角落设置标志?你能指出我需要使用的功能吗?

如果球进入篮筐,我有一个节点会通知我,它是篮筐中间的钢筋,当它碰撞时,它会增加我的分数。

func didBegin(_ contact: SKPhysicsContact)
    {
        // check for the ball contacting the scoreZone (scoreZone is the steel bar)
        guard let ballBody = ball.physicsBody, let scoreBody = score_zone.physicsBody else {
            return
        }
        // it doesn't matter who touches who, so just use array "contains" to handle both cases
        let bodies = [contact.bodyA, contact.bodyB]
        if bodies.contains(ballBody) && bodies.contains(scoreBody) && should_detect_score {
            // add score
            add_score()
        }
    }

【问题讨论】:

  • 你能发布你当前的碰撞检测代码吗?

标签: ios swift sprite-kit skspritenode


【解决方案1】:
  1. 当球触及任一红色取芯器时设置旗标。
  2. 在网络中间放置一个节点,该节点设置为通知何时 触球。
  3. 如果“网络节点”触发了联系,但“红角”标志已 没有设置,那么你有一个完美的投掷。
  4. 重置“红角”标志。

【讨论】:

  • 如何在角落设置标志?你能指出我需要使用的功能吗?
【解决方案2】:

这里有一些应用和检测碰撞的代码,我用的似乎很有效

-SWIFT 3-

enum bodyType: UIInt32 {
    case redDot1 = 1
    case redDot2 = 2
    case ball = 3
}
//do this to properly set up the physicsBodies of your detection otherwise the detection will not work at all
yourBall.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(x: ball.size.width, y: ball.size.height)
yourBall.physicsBody?.categoryBitMask = bodyType.ball.rawValue
yourBall.physicsBody?.collisionBitMask = bodyType.redDot1.rawValue | bodyType.redDot2.rawValue 

//repeat these steps for redDot1 and redDot2 and then put this in someplace (doesn't matter where)


func didBegin(_ contact: SKPhysicsContact) {
    if contact.bodyA.categoryBitMask = bodyType.ball.rawValue && contact.bodyB.categoryBitMask = bodyType.redDot1.rawValue || contact.bodyB.categoryBitMask = bodyType.ball.rawValue && contact.bodyA.categoryBitMask = bodyType.redDot1.rawValue {
    //in here is where you will put the notification
    }
if contact.bodyA.categoryBitMask = bodyType.ball.rawValue && contact.bodyB.categoryBitMask = bodyType.redDot2.rawValue || contact.bodyB.categoryBitMask = bodyType.ball.rawValue && contact.bodyA.categoryBitMask = bodyType.redDot2.rawValue {
    //in here is where you will put the notification
    }
}

一些解释

所以如果你看我在哪里声明你的球有一个physicsBody,它会显示categoryBitMask = BlahBlah,这意味着你告诉代码你的球有一个独特的整数来区分它以进行碰撞检测

然后它说碰撞位掩码,这意味着你告诉 SpriteKit 你想让球接触什么

在底部,该函数是它可以创建的物理处理程序,因此您可以准确地知道哪些联系人发生了什么以及何时发生,并允许您输入在调用联系人时发生的事情(例如提醒)

我建议您阅读有关它的更多信息并研究 SKPhysicsBodies 上的苹果文档

如果您还有任何问题,请告诉我,因为我很乐意为您提供更多帮助

就像史蒂夫·艾夫斯刚刚发布的那样,你想做四件事

  1. 制作某种形式的整数,如果触摸红点,则添加该整数

  2. 如果整数 > 0 则不是完美的抛出

  3. 如果整数 = 0,则完美抛出

  4. 当分数被添加时,重置整数并再次执行所有操作

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2016-01-13
    相关资源
    最近更新 更多