import UIKit class dropitViewController: UIViewController,UIDynamicAnimatorDelegate { @IBOutlet weak var gameView: BezierPathsView! //创建DynamicAnimator lazy var animator: UIDynamicAnimator = { let lazilyCreatedDynamicAnimator = UIDynamicAnimator(referenceView: self.gameView) lazilyCreatedDynamicAnimator.delegate = self return lazilyCreatedDynamicAnimator }() //创建集成了三个Behavior的DropBehavior的实例 var dropitBehavior = DropBehavior() var attachment: UIAttachmentBehavior? { willSet { animator.removeBehavior(attachment!) gameView.setPath(nil, named: PathNames.Attachment) } didSet { if attachment != nil { animator.addBehavior(attachment!) attachment?.action = { [unowned self] in if let attacheView = self.attachment?.items.first as? UIView { let path = UIBezierPath() path.moveToPoint(self.attachment!.anchorPoint) path.addLineToPoint(attacheView.center) self.gameView.setPath(path, named: PathNames.Attachment) } } } } } override func viewDidLoad() { super.viewDidLoad() animator.addBehavior(dropitBehavior) } struct PathNames { static let MiddleBarrier = “Middle Barrier” static let Attachment = “Attachment” } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let barrierSize = dropSize let barrierOrigin = CGPoint(x: gameView.bounds.midX – barrierSize.width / 2, y: gameView.bounds.midY – barrierSize.height / 2) //设置圆圈的边界 let path = UIBezierPath(ovalInRect: CGRect(origin: barrierOrigin, size: barrierSize)) dropitBehavior.addBarrier(path, named: PathNames.MiddleBarrier) gameView.setPath(path, named: PathNames.MiddleBarrier) } //UIDynamicAnimatorDelegate中的方法,当动画停止时 func dynamicAnimatorDidPause(animator: UIDynamicAnimator) { removeCompletedRow() } var dropsPerRow = 10 //设置方块的形状 var dropSize: CGSize { let size = gameView.bounds.width / CGFloat(dropsPerRow) return CGSize(width: size, height: size) } //设置手势 @IBAction func drop(sender: UITapGestureRecognizer) { drop() } var lastDroppedView: UIView? //掉落方法 func drop() { //设置方块的初始位置及大小 var frame = CGRect(origin: CGPointZero, size: dropSize) frame.origin.x = CGFloat.random(dropsPerRow) * dropSize.width //创建方块视图,并设置其颜色 let dropView = UIView(frame: frame) dropView.backgroundColor = UIColor.random lastDroppedView = dropView dropitBehavior.addDrop(dropView) } @IBAction func grabDrop(sender: UIPanGestureRecognizer) { let gesturePoint = sender.locationInView(gameView) switch sender.state { case .Began: if let viewToAttachTo = lastDroppedView { attachment = UIAttachmentBehavior(item: viewToAttachTo, attachedToAnchor: gesturePoint) lastDroppedView = nil } case .Changed: attachment?.anchorPoint = gesturePoint case .Ended: attachment = nil default: break } } //当满行后消除方块 func removeCompletedRow() { var dropsToRemove = [UIView]() var dropFrame = CGRect(x: 0, y: gameView.frame.maxY, width: dropSize.width, height: dropSize.height) repeat { dropFrame.origin.y -= dropSize.height dropFrame.origin.x = 0 var dropsFound = [UIView]() var rowIsComplete = true for _ in 0 ..< dropsPerRow { if let hitView = gameView.hitTest(CGPoint(x: dropFrame.midX, y: dropFrame.midY), withEvent: nil) { if hitView.superview == gameView { dropsFound.append(hitView) } else { rowIsComplete = false } } dropFrame.origin.x += dropSize.width } if rowIsComplete { dropsToRemove += dropsFound } } while dropsToRemove.count == 0 && dropFrame.origin.y > 0 for drop in dropsToRemove { dropitBehavior.removeDrop(drop) } } } private extension CGFloat { static func random(max:Int) -> CGFloat { return CGFloat(arc4random() % UInt32(max)) } } private extension UIColor { class var random:UIColor { switch arc4random() % 5 { case 0: return UIColor.greenColor() case 1: return UIColor.blueColor() case 2: return UIColor.orangeColor() case 3: return UIColor.redColor() case 4: return UIColor.purpleColor() default: return UIColor.blackColor() } } }
dropit小游戏实现
import UIKit class dropitViewController: UIViewController,UIDynamicAnimatorDelegate { @IBO…
本文来自网络,不代表Xnewv立场,转载请注明出处:https://xnewv.com/2207.html