Cocos2d坐标系

Posted

技术标签:

【中文标题】Cocos2d坐标系【英文标题】:Cocos2d coordinate system 【发布时间】:2012-10-04 06:25:37 【问题描述】:

在 cocos2d 中,坐标系非常简单。左下角是 (0,0)。 每当我设置任何东西的位置都可以。

假设一个层是 TouchEnabled。

当我设置我的精灵的位置时,没关系..

[crab setPosition:ccp(20, 50)];

但是如果我得到一个触摸的 x 和 y 坐标(并假设我点击了精灵..):

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    NSLog(@"Touches began!");
    NSArray *touchArray = [touches allObjects];
    UITouch *one = [touchArray objectAtIndex:0];
    pointOne = [one locationInView:[one view]];
    CCLOG(@"points are: %f and %f", pointOne.x, pointOne.y );

y 坐标与 cocos2d 坐标系所暗示的相反,因为 y 从上到下增加!

所以我假设视图的坐标系与 mac 的坐标系不同.. 这很违反直觉.. 对吗?

谢谢!

【问题讨论】:

【参考方案1】:

OpenGL 使用左下角 (0, 0),而 ios 和因此处理触摸的 UIKit 使用左上角 (0, 0)。转换你的观点很容易,你只需要记住这样做。

cocos2d 2.0上正确的方法是

CGPoint uiKitPoint = [touch locationInView:touch.view];
CGPoint cocos2dPoint = [[CCDirector sharedDirector] convertToGL:uiKitPoint];

【讨论】:

【参考方案2】:

这个 cocos2d 教程可能会对你有所帮助

http://www.gamefromscratch.com/post/2012/06/08/Cocos2D-html-Tutorial-3All-about-sprites-and-positioning.aspx

但是在cocos2d中一般来说点(0,0)是屏幕的左下角

【讨论】:

【参考方案3】:

Cocos2D 已经可以为您处理这个问题。 CCDirector 对此有一些方法。请看一下这个老的post。

【讨论】:

【参考方案4】:

通常,对于大多数与图形相关的应用程序,倾向于将 (0, 0) 放在左下角(Mac 就是这种情况) - 而在 iOS 上,它位于左上角如您所见。

当你使用 Cocos 处理输入时,你可以使用 convertTouchToNodeSpace 方法快速转换它(至少在 1.x 上——我用 2.0 玩得还不够——但我相信它是 convertToNodeSpace 从快速文档检查那里)。然后,这将进行必要的转换,为您提供正确的坐标。

(注意:我需要挖掘一些其他代码来仔细检查 - 但我不记得这是否也计算了相机偏移量 - 我会在可以到达时进行编辑我的演示代码并确认。)

【讨论】:

【参考方案5】:

Touches 来自 UIKit,左上角为 (0,0),因此在处理此数据之前,您需要将其转换为 cocos2d 的坐标系。

[[CCDirector sharedDirector] convertToGL];

对于 UIkit -> cocos2d

【讨论】:

convertToNodeSpace 将不在当前节点坐标系中的点转换为自身。例如,节点坐标系的世界坐标(但仍为 openGL 格式)。 通过添加 converttogl 方法更新我的答案 还是不正确。转换为节点空间不适用于 uikit 点

以上是关于Cocos2d坐标系的主要内容,如果未能解决你的问题,请参考以下文章

10.cocos2d坐标系

cocos2d-x 中如何 实时 获得一个精灵坐标~~~

cocos2d.js

lua cocosstudio 怎么获得触摸点的坐标

cocos2dx中坐标系

cocos2d-x中如何获取当前鼠标的坐标?