SKNode convertPoint toNode& fromNode混乱?

时间:2014-02-18 19:51:20

标签: ios7 sprite-kit sknode

我对SKNode方法convertPoint:fromNode:convertPoint:ToNode:的工作方式感到有些困惑,我看过文档,但不是那么明显。例如,这个(见下图)是我使用convertPoint:fromNode:进行的一项小测试。黑色区域是SKScene背景,蓝色区域是SKSpriteNode作为SKScene的父级,红色区域是蓝色精灵的另一个SKSpriteNode。两个精灵的锚点由小绿点表示。我想要做的是获取红色精灵的场景位置,我使用以下代码完成:

CGPoint positionInScene = [self convertPoint:[self position] 
                                    fromNode:[self redSprite]];

结果是

positionInScene = [105, 205]

这是我所期望的,因为那将是场景空间中红色方块的起源。我很困惑的是争论。根据我的猜测:

[SKNode_A convertPoint: CGPoint_B toNode: SKScene_C]
  • SKNode_A =要转换为...的节点坐标空间
  • CGPoint_B =要转换的点(不确定为什么上面的[自我位置])
  • SKNode_C =要转换的节点坐标空间......

我最初的尝试是[self convertPoint:[redSprite position] fromNode:redSprite],因为我想将红色精灵原点转换为场景。如果有人能投出一点光线,那么看起来有点笨拙。这个和它的朋友convertPoint:toNode:的逻辑非常值得赞赏。

enter image description here

3 个答案:

答案 0 :(得分:49)

- (CGPoint)convertPoint:(CGPoint)指向节点:(SKNode *)节点

这基本上是这样说:将在另一个节点的坐标系中表示的转换为调用者的( self )坐标系。关键是必须在节点的坐标系中表达该点才能使其工作。如果您使用精灵的位置作为点,则需要将精灵的父节点作为最后一个参数传递。

示例:要获取场景坐标系中红色方块的位置:

CGPoint positionInScene = [self convertPoint:[redSprite position]
                                    fromNode:[self blueSprite]];
blueSprite坐标系中的

[5,5] - >场景坐标系中的 [105,205]

您的示例:

CGPoint positionInScene = [self convertPoint:[self position] 
                                    fromNode:[self redSprite]];
redSprite坐标系中的

[0,0] - >场景坐标系中的 [105,205]

你最终得到了代码中的相同结果,只是因为[self position]是[0,0]并且你使用了redSprite的坐标系。你的初始尝试很接近,你只需要提供redSprite的位置表示的坐标系,这是父精灵的坐标系;在这种情况下,那是blueSprite。

- (CGPoint)convertPoint:(CGPoint)指向节点:(SKNode *)节点

这种方法与第一种方法完全相反。它会将调用者坐标系中的 point 转换为另一个节点的坐标系。这种方法的关键是给定的点必须在调用者的坐标系中表示。

示例:假设您的场景在 [125,225] 处接触过,并且您想要在该位置添加一个新的精灵,该精灵恰好在redSprite的边界框。因此,要添加一个新的精灵作为redSprite的子项,您需要在redSprite的坐标系中获取触摸的位置。为此:

CGPoint positionInRedSprite = [self convertPoint:touchLocation 
                                          toNode:[self redSprite]];
场景坐标系中的

[125,225] - > redSprite坐标系中的 [20,20]

答案 1 :(得分:0)

为简单起见:  比较节点B到节点A的位置(试图找出彼此之间的距离)

var BInSameCoordinateSys = NodeA.parent!.convertPoint(NodeB.position, fromNode: NodeB.parent!)

通过在位置添加精灵进行故障排除,如果不能帮助可视化位置:

let childToSeeLocation = SKShapeNode(CircleWithRadius:50)
childToSeeLocation.fillColor = UIColor.redColor
ParentofA.addChild(childToSeeLocation)

答案 2 :(得分:0)

我知道这是一个迟到的响应,但通常,我想使用节点的父节点作为节点位置的坐标系。所以,我发现这个扩展非常有用:

extension SCNNode {
    func convertPosition(node:SCNNode) -> SCNVector3 {
        return self.convertPosition(node.position, fromNode:node.parentNode)
    }
}

例如,而不是调用它:

let position = scene.rootNode.convertPosition(node.position, fromNode: node.parentNode)
你打电话给这个:

let position = scene.rootNode.convertPosition(node)