SKNode convertPoint toNode&fromNode混淆?

fuz*_*oat 36 ios7 sprite-kit sknode

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

CGPoint positionInScene = [self convertPoint:[self position] 
                                    fromNode:[self redSprite]];
Run Code Online (Sandbox Code Playgroud)

结果是这样的

positionInScene = [105, 205]
Run Code Online (Sandbox Code Playgroud)

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

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

我最初的尝试是[self convertPoint:[redSprite position] fromNode:redSprite]因为我想将红色精灵原点转换为场景.如果有人能在这个和它的朋友身上投入一点点光明和逻辑,convertPoint:toNode:那将会非常感激,这似乎有点笨拙.

在此输入图像描述

小智 49

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

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

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

CGPoint positionInScene = [self convertPoint:[redSprite position]
                                    fromNode:[self blueSprite]];
Run Code Online (Sandbox Code Playgroud)

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

你的例子:

CGPoint positionInScene = [self convertPoint:[self position] 
                                    fromNode:[self redSprite]];
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

CGPoint positionInRedSprite = [self convertPoint:touchLocation 
                                          toNode:[self redSprite]];
Run Code Online (Sandbox Code Playgroud)

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

  • 关键是要知道谁是调用者,因为它的协调系统是参考.我正在读这篇文章10次,终于找到了这个:) (2认同)