我目前有一个很大的地图,超出了屏幕范围,因此它的坐标系与我的其他节点非常不同。这导致了一个问题,因为我需要在这张地图的范围内生成一个随机的CGPoint,并且如果该点在屏幕上/框架内,我就会在那里放置一个可见的节点。然而,检查节点是否在屏幕上始终失败。
我使用以下代码检查节点是否在框架内:
例如,在下面的图片中,箭头指向的球在场景坐标中的坐标是(479, 402),但实际上它们在地图坐标中是(9691, 9753)。
我是使用touchesBegan事件确定这些坐标的。所以基本上,我如何将地图坐标系转换为适用于框架的坐标系?
因为如下图所示,这个点显然在框架内,但CGRectContainsPoint始终失败。我尝试过
编辑:(澄清一些事情)
我的视图层次结构看起来像这样:
地图节点超出屏幕,大约为10,000x10,000大小。(我将其设置为滚动类型的地图)。这个节点的原点(或0,0)位于底部左侧,即地图开始的地方,这意味着原点在屏幕外。在上面的图片中,我在地图的右上部分附近。我使用以下代码(将地图框架作为参数传递)作为CGPoint的扩展来生成随机CGPoint:
我随后有以下代码(在didMoveToView中调用,注意我正在将其应用于我生成的节点 - 我只是略去了那段代码)。其中values是随机位置。
我使用以下代码检查节点是否在框架内:
CGRectContainsPoint(self.frame, values)
(其中values是我生成的随机CGPoint)。现在我的问题来了,框架的坐标系与地图的坐标系完全不同。例如,在下面的图片中,箭头指向的球在场景坐标中的坐标是(479, 402),但实际上它们在地图坐标中是(9691, 9753)。
我是使用touchesBegan事件确定这些坐标的。所以基本上,我如何将地图坐标系转换为适用于框架的坐标系?
因为如下图所示,这个点显然在框架内,但CGRectContainsPoint始终失败。我尝试过
scene.convertPoint(position, fromNode: map)
,但它没有起作用。编辑:(澄清一些事情)
我的视图层次结构看起来像这样:
地图节点超出屏幕,大约为10,000x10,000大小。(我将其设置为滚动类型的地图)。这个节点的原点(或0,0)位于底部左侧,即地图开始的地方,这意味着原点在屏幕外。在上面的图片中,我在地图的右上部分附近。我使用以下代码(将地图框架作为参数传递)作为CGPoint的扩展来生成随机CGPoint:
static func randPoint(within: CGRect) -> CGPoint {
var point = within.origin
point.x += CGFloat(arc4random() % UInt32(within.size.width))
point.y += CGFloat(arc4random() % UInt32(within.size.height))
return point;
}
我随后有以下代码(在didMoveToView中调用,注意我正在将其应用于我生成的节点 - 我只是略去了那段代码)。其中values是随机位置。
let values = CGPoint.randPoint(map.totalFrame)
if !CGRectContainsPoint(self.frame, convertPointToView(scene!.convertPoint(values, fromNode: map))) {
color = UIColor.clearColor()
}
使屏幕外的节点不可见。(因为用户可以滚动地图背景)。这总是被视为真,使得所有节点都不可见,即使节点确实在框架内(如上图所示,在那里我注释掉了清除颜色代码)。