0

我有三个具有以下 z 顺序和尺寸(无偏移)的子层作为 cocos2d 父层的子层:

最顶层:z:-1 宽度:2048 高度:2048
中间层:z:-2 宽度:1536 高度:1536
最深层:z:-3 宽度:1024 高度:1024

使用 UIScrollView(附加到 ViewController)作为 cocos2d 使用的 glView 的子视图,我使用以下比率平移(并因此滚动)每个层的位置(从而实现 3D 效果):

最顶层:dragPt.x * 1(y 相同)
中间层:dragPt.x * 0.75(y 相同)
最深层:dragPt.x * 0.5(y 相同)

我检测每一层上的用户输入如下:
- 将另一个子视图(我们称之为 seeThrough)附加到 glView 具有以下尺寸 480x320(应用程序处于横向模式)
--(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event在此子视图中使用,我将触摸点存储在一个名为“touchLocation”的 iVar。
- 在我的 cocos2d-layer 中,我使用以下代码来确定每一层的触摸位置:

CGPoint pointOnTopMostLayer = ccp(seeThrough.touchLocation.x - topMostLayer.position.x, (320 - seeThrough.touchLocation.y) - topMostLayer.position.y);

CGPoint pointOnMidLayer = ccp(seeThrough.touchLocation.x - midLayer.position.x, (320 - seeThrough.touchLocation.y) - midLayer.position.y);

CGPoint pointOnDeepestLayer = ccp(seeThrough.touchLocation.x - deepestLayer.position.x, (320 - seeThrough.touchLocation.y) - deepestLayer.position.y);

(320 是屏幕高度,减去它需要将 Y 从 UI 转换为 gl 坐标系)

滚动图层时,它们的位置是负数。通过使用 seeThrough 视图作为参考平台来捕获 480x320 表面上的触摸,我可以通过简单地从 seeThrough 视图中捕获的点减去每一层的负位置值来成功确定每一层坐标系上的触摸位置。
问题是当根本没有这样的参考点时,例如,当我尝试在没有用户输入的情况下在其中一个图层上获取精灵的位置时。
没有参考点,我发现自己无法想出一个解决方案,使我能够确定 cocos2d 层之一上的任何特定点。

我尝试了几种方法(convertToNodeSpace、convertToWorldSpace 以及随着时间的推移最终疯狂的数学),但都没有成功。

因此,我的问题是:如何确定其中一层上的精灵的位置并将其转换为其他层之一的空间?

场景:
- 精灵在最深层,但我想将它移动到中间层上的位置
- 精灵在最顶层,我想将它移动到最深层
- 等等...

4

1 回答 1

2

您实现的是从屏幕空间到每个图层坐标系的转换。

如果您反转这些转换,它们将从图层坐标系返回到屏幕空间。

例如,您有:

pointOnTopMostLayer.x = screenspace.x - topMostLayer.position.x
pointOnTopMostLayer.y = (320 - screenspace.y) - topMostLayer.position.y

所以:

screenspace.x = pointOnTopMostLayer.x + topMostLayer.position.x
screenspace.y = 320 - (pointOnTopMostLayer.y + topMostLayer.position.y)

对每一层重复。

现在,要从 X 层转到 Y 层,您在 X 层空间中获取坐标,转换回屏幕空间,然后转换到 Y 层空间。

于 2012-03-28T08:53:39.050 回答