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坐标系的主要内容,如果未能解决你的问题,请参考以下文章