在cocos2d中获取CCSprite的绝对位置

4
在我的游戏中,我有一个CCSprite绕着另一个CCSprite旋转,就像电子绕核心旋转一样。我将电子作为核心的子节点,使动画变得更简单。我所要做的就是旋转核心,电子会很好地跟随旋转。
然而,我的问题来自于想让轨道动画看起来更加华丽,比如添加像粒子系统拖尾或沿着电子路径的缎带效果之类的东西。我不能简单地将粒子系统添加到电子本身,因为粒子不会正确地跟随,因为它们也被核心旋转了。如果我将粒子系统添加到self,那么它们会正确显示,但不在它们应该跟随的对象的相同位置上。
我的问题是:
是否有一种方法可以获取对象的场景位置,比如电子,而不仅仅是访问其相对于父级的位置?
谢谢。
2个回答

8

是的,有这个功能!

每个CCNode及其子节点都可以获取相对于场景的位置:

CGPoint worldCoord = [mySprite convertToWorldSpace: mySprite.position];

这个worldCoordinate将与父节点不同,而是相对于场景的位置!

希望这有所帮助!^_^


太棒了!我现在就要试试。非常感谢! - GreenWire
这很棒,可以获取位置,但是我如何确定位置是否已更改(根据物理引擎)?似乎覆盖setPosition:并不能做到。:\ - Olie

4
一份后续说明:
当你执行以下操作时:
[aSprite convertToWorldSpace:position];

您实际上是获取了aSprite坐标系中位置的全局坐标。如果您想将aSprite的位置转换为全局空间,您需要请求其父级为您执行转换,因为sprite.position已经在其父级坐标系中。
希望这解释清楚了。
原始答案:
对我来说,这个解决方案并没有起作用。
我的层次结构有两个级别,其中mySprite是CCSprite的子级,而CCSprite又是场景的子级。
底线:这段代码为我解决了问题。
CGPoint worldCoord =  [[mySprite parent]convertToWorldSpace: mySprite.position];

这是我解决问题所需的层级结构: myScene -> mySpriteParent -> mySprite
mySprite.position:29,254
mySpriteParent.position:533,57

解决方案1 - 错误结果:

[mySprite convertToWorldSpace: mySprite.position]:91,418

解决方案2 - 正确结果:

[[boxSprite parent] convertToWorldSpace:boxSprite.position]:253.5,275.5

也许这个解决方案可以帮助某些人,也许有人可以解释为什么这个解决方案有效而其他的无效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接