如何在标签和图像之间创建碰撞检测

时间:2018-08-09 13:15:27

标签: ios iphone swift collision

简介

我想创建一个简单的游戏,在其中您应该能够拖动标签,如果将其拖动到正确的位置,您将获胜。更具体地说:这是一个帮助自闭症儿童的游戏。在此游戏中,他们必须创建一个正确的数字序列(从一到十),并将带有数字的标签拖到正确的位置(实际上是图像)。现在您将更好地理解:CLICK HERE TO SEE THE APP (STORYBOARD

问题

我已经创建了拖动标签的代码(使用平移手势识别器),但是我不知道如何创建碰撞检测:当拖动卡“ 1”并且与蓝色图像“ 1”碰撞时“ 有事情发生, 我的心理代码是:

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    // After this point the context is initialized.
    context=activity;
}

我希望问题清楚。 啊,我不使用SpriteKit。我使用“ SingleViewApplication”作为模板而不是“ Game”。

2 个答案:

答案 0 :(得分:3)

您要使用contains()。如果您使用intersects(),则两个矩形一接触就会返回true。使用contains(),在拖动的视图完全位于目标视图内部之前,它不会返回true,这似乎更加直观。

我刚刚编写了一个实现此功能的示例应用程序,它可以完美运行。

我创建了一个简单的UIView子类,称为BoxedView,它只是在其图层周围设置了边框,以便您可以看到它。

我设置了一个视图控制器,其中包含2个带框的视图,一个较大的“ targetView”和一个可供用户拖动的较小视图。

我的手势识别器的目标/动作会随着用户的拖动移动被拖动视图的框架,并且如果目标视图包含被拖动的视图,它将设置一个Bool HighlightTargetView,这将导致目标视图周围的框变粗。

整个视图控制器类的代码如下:

ViewController类:UIViewController {

    @IBOutlet weak var targetView: BoxedView!

    var viewStartingFrame: CGRect = CGRect.zero

    var highlightTargetView: Bool = false {
        didSet {
            targetView.layer.borderWidth = highlightTargetView ? 5 : 1
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBAction func userDraggedView(_ gesture: UIPanGestureRecognizer) {
        switch gesture.state {
        case .began:
            viewStartingFrame = gesture.view?.frame ?? CGRect.zero
        case .changed:
            let offset = gesture.translation(in: view)
            gesture.view?.frame = viewStartingFrame.offsetBy(dx: offset.x, dy: offset.y)
            highlightTargetView = targetView.frame.contains(gesture.view?.frame ?? CGRect.zero)
        case .ended:
            gesture.view?.frame = viewStartingFrame
            highlightTargetView = false
        default:
            break
        }
    }
}

为了使数学正常工作,我使用了两个视图的frame属性,它们位于父视图的坐标系中(在这种情况下,父视图是视图控制器的内容视图,但关键是我们将两个矩形都使用相同的坐标系进行比较。)如果您使用了两个视图的bounds属性,则数学将不起作用,因为视图的bounds位于该视图的局部坐标系中。

这是程序运行时的样子:

View dragging GIF

为了进行比较,我修改了程序以使用intersects()函数显示其外观,并创建了一个视频,其外观如下:

enter image description here

答案 1 :(得分:1)

您可以检查它们的框架是否相交。 CGRect的方法为intersects

所以您是if语句应为以下内容:

if LB_1.frame.intersects(IMG_1.frame) {
  self.IMG_1?.backgroundColor = UIColor.green
}

如果这还不够,您可以计算intersection rect的面积。