过去几天我一直在尝试在我的iOS应用程序中实现以下功能
(Source)
我想要什么
当用户拖动任何这些圆圈(无论是红色还是灰色)时,与移动圆圈接触的圆圈应该移动。 因此,如果所有圆圈都在一条线上并且第一个圆圈向右移动,那么它会将其余圆圈推向右侧。
我从未尝试过什么
1)intersects(_ rect2: CGRect)
方法 。除了为每个圆圈使用intersects
方法创建大量嵌套for循环之外,我想不出别的什么。 首先,它看起来非常混乱,其次该方法效率低,即当用户拖得太快时该方法不响应。
2)UICollisionBehaviour
。在阅读了另一个问题之后,我发现只有当UIDynamicAnimator
负责在屏幕上移动视图而不是用户时,这才有效。(与拖动一样)
最后我想, Sprite Kit 是我需要的,但我不知道如何或为什么将它用于我的应用程序的这么小的组件。
任何建议都是阿司匹林。谢谢!
答案 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 }
}
}