检测两个对象之间是否发生冲突

时间:2017-08-21 13:19:07

标签: ios swift sprite-kit skspritenode

我开始研究iOS中的Sprite Kit游戏,我想知道如何在球进入篮圈时检测是否发生碰撞。enter image description here

让事情更容易理解。我的篮筐上有两个角(它们是红色的,很容易看到,它们脱颖而出),它们碰撞着它们,如果球碰到它们,它就会被扯掉。

我的问题:当球击中任何一个角落或者如果球进入篮筐而没有击中任何一个角落时我想要注意到。 (就像一种得分区分正常投掷和完美投掷的方式)

更新:

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

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

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()
        }
    }

2 个答案:

答案 0 :(得分:2)

  1. 当球接触其中一个红色核心时设置一个标志。
  2. 在网络中间放置一个节点,该节点设置为在何时通知 接触球。
  3. 如果'网络节点'触发了一个联系人但是红色的角落'国旗有 没有设定,那你就完美了。
  4. 重置红色角落'标志。

答案 1 :(得分:1)

这里有一些应用和检测碰撞的代码,我使用它并且看起来非常有效

-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
    }
}

一些解释

所以,如果你看看我宣称你的球有物理身体的地方,那就说categoryBitMask = BlahBlah意味着你告诉代码你的球有一个独特的整数,区别于它的碰撞检测

然后它说的是collisionBitMask,这意味着你告诉SpriteKit正是你希望那个球与之联系的

并且在底部,该函数是它可以创建的物理处理程序,因此您可以准确地确定联系人的内容和发生的时间,并允许您输入在调用联系人时发生的事情(例如提供一个单挑)

我建议你阅读更多关于它的内容并研究关于SKPhysicsBodies的苹果文档

如果您有任何其他问题,请告诉我,因为我很乐意帮助您解决这些问题

和史蒂夫·伊夫斯刚刚发布了你想要做的四件事

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

  2. 如果整数> 0然后它不是一个完美的投掷

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

  4. 添加分数后重置整数并重新执行