简介
我想创建一个简单的游戏,在其中您应该能够拖动标签,如果将其拖动到正确的位置,您将获胜。更具体地说:这是一个帮助自闭症儿童的游戏。在此游戏中,他们必须创建一个正确的数字序列(从一到十),并将带有数字的标签拖到正确的位置(实际上是图像)。现在您将更好地理解:
问题
我已经创建了拖动标签的代码(使用平移手势识别器),但是我不知道如何创建碰撞检测:当拖动卡“ 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”。
答案 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
位于该视图的局部坐标系中。
这是程序运行时的样子:
为了进行比较,我修改了程序以使用intersects()
函数显示其外观,并创建了一个视频,其外观如下:
答案 1 :(得分:1)
您可以检查它们的框架是否相交。
CGRect
的方法为intersects。
所以您是if语句应为以下内容:
if LB_1.frame.intersects(IMG_1.frame) {
self.IMG_1?.backgroundColor = UIColor.green
}
如果这还不够,您可以计算intersection rect的面积。