碰撞iOS后,移动了很多视图?

时间:2017-03-10 17:21:07

标签: ios swift collision-detection drag

过去几天我一直在尝试在我的iOS应用程序中实现以下功能

Source

我想要什么

当用户拖动任何这些圆圈(无论是红色还是灰色)时,与移动圆圈接触的圆圈应该移动。  因此,如果所有圆圈都在一条线上并且第一个圆圈向右移动,那么它会将其余圆圈推向右侧。

我从未尝试过什么

1)intersects(_ rect2: CGRect) 方法 。除了为每个圆圈使用intersects方法创建大量嵌套for循环之外,我想不出别的什么。 首先,它看起来非常混乱,其次该方法效率低,即当用户拖得太快时该方法不响应。

2)UICollisionBehaviour。在阅读了另一个问题之后,我发现只有当UIDynamicAnimator负责在屏幕上移动视图而不是用户时,这才有效。(与拖动一样)

最后我想, Sprite Kit 是我需要的,但我不知道如何或为什么将它用于我的应用程序的这么小的组件。

任何建议都是阿司匹林。谢谢!

1 个答案:

答案 0 :(得分:0)

我可以使用Sprite kit执行针对碰撞的移动效果。正如我想象的那样,这并不难。

然而,这只是一个概念证明,并没有解决诸如接受超快运动之类的问题。

如果您是SpriteKit的新手,请浏览RayWenderlich.com上的this文章。当然Apple' Programming guide to Sprite Kit 是另一个惊人的资源。

<强> CODE

   class GameScene : SKScene

   var orangeBall : SKShapeNode!
   var greenBall  : SKShapeNode!

 // Description :  - Create two circular shapes here 
 //                - Give them physics bodies 
 //                - Add them  

  override func didMove(to view: SKView) {




    orangeBall = SKShapeNode(circleOfRadius: 50 )                       // Size of Circle
    orangeBall.position = CGPoint(x: frame.midX, y: frame.midY)         // Middle of Screen
    orangeBall.glowWidth = 1.0
    orangeBall.fillColor = SKColor.orange

    orangeBall.physicsBody = SKPhysicsBody(circleOfRadius: 50 )
    orangeBall.physicsBody?.affectedByGravity = false
    orangeBall.physicsBody?.isDynamic = true
    orangeBall.physicsBody?.allowsRotation = false
    orangeBall.physicsBody?.restitution = 1

    self.addChild(orangeBall)



    greenBall = SKShapeNode(circleOfRadius: 50 )                       // Size of Circle
    greenBall.position = CGPoint(x: frame.midX + 70, y: frame.midY + 55.0 )         // Middle of Screen
    greenBall.glowWidth = 1.0
    greenBall.fillColor = SKColor.green

    greenBall.physicsBody = SKPhysicsBody(circleOfRadius: 50)
    greenBall.physicsBody?.affectedByGravity = false
    greenBall.physicsBody?.isDynamic = true
    greenBall.physicsBody?.density = greenBall.physicsBody!.density * 0.000001
    greenBall.physicsBody?.allowsRotation = false
    greenBall.physicsBody?.restitution = 1

    self.addChild(greenBall)

}

配置触摸

var fingerOnOrangeBall = false
var fingerOnGreenBall  = false


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

                if orangeBall.contains(touches.first!.location(in: self)){ fingerOnOrangeBall =  true }

                if greenBall.contains( touches.first!.location(in: self)){ fingerOnGreenBall =   true }



  }

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

    if fingerOnOrangeBall{

        let touch =      touches.first
        var position =   touch!.location(in: self.view)
        position =       self.convertPoint(fromView: position)
        orangeBall.position = position

    }

    if fingerOnGreenBall{

        let touch =      touches.first
        var position =   touch!.location(in: self.view)
        position =       self.convertPoint(fromView: position)
        greenBall.position = position

    }

}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

                   if   fingerOnOrangeBall { fingerOnOrangeBall =  false  }

                   if   fingerOnGreenBall {  fingerOnGreenBall =  false  }

}
 }