cocos2d坐标转换

CCSprite *sprite1 = CCSprite::create("player.png");

sprite1->setPosition(ccp(20, 40));

sprite1->setAnchorPoint(ccp(0, 0));

this->addChild(sprite1);

 

CCSprite *sprite2 = CCSprite::create("player.png");

sprite2->setPosition(ccp(-15, -30));

sprite2->setAnchorPoint(ccp(1, 1));

this->addChild(sprite2);

然后调试,在场景中大概是下图这样显示(以左下角为坐标原点,从左到右为x方向,从下到上为y方向,废话了:)):

cocos2d-x中,每个精灵都有一个锚点,以后对精灵的操作(比如旋转)都会围绕锚点进行,我们暂且可以看作是精灵的中心位置,一般来说有每个方向有三种可能的值:0,0.5,1。上图中红色圆点即为各自的锚点,sprite1 锚点为 (0,0) 左下角,sprite2锚点为(1,1)在右上角。

 

 

 

现在我们来看看坐标系转换,同样地,我们先写点测试代码:

CCPoint p1 = sprite2->convertToNodeSpace(sprite1->getPosition());

CCPoint p2 = sprite2->convertToWorldSpace(sprite1->getPosition());

CCPoint p3 = sprite2->convertToNodeSpaceAR(sprite1->getPosition());

CCPoint p4 = sprite2->convertToWorldSpaceAR(sprite1->getPosition());

接着,再打印出各点的x,y值:

CCLog("p1:%f,%f", p1.x, p1.y);

CCLog("p2:%f,%f", p2.x, p2.y);

CCLog("p3:%f,%f", p3.x, p3.y);

CCLog("p4:%f,%f", p4.x, p4.y);

现在开始分析这四个常用坐标系转换函数转换后的值(有兴趣的同学可以先算一算)。

由于cocos2d-x的坐标系(本地坐标系)是以左下角为坐标原点的,所以 sprite1sprite2的坐标原点在上图的位置分别是(20,40)、(-42,-70,那么很明显的:

p1就是sprite1锚点相对于sprite2原点来说在sprite2坐标系中的位置,经过对比上图,我们可以得到(20-(-42)40-(-70))即(62,110

p2就是sprite1锚点相对于sprite2原点来说在上图坐标系中的位置,这样我们可以计算出sprite1sprite2坐标系中的位置:(20+(-42),40+(-70)),即(-22,-30

p3就是sprite1锚点相对于sprite2锚点来说在sprite2坐标系中的位置,也就是(20-(-15)40-(-30),即(35,70

p4就是sprite1锚点相对于sprite2锚点来说在上图坐标系中的位置,也就是(20+(-15),40+(-30)),即(5,10

现在我们可以知道,计算方法都是用sprite1的坐标去加减sprite2的坐标,针对本地坐标系就用减法,针对世界坐标系就用加法

 

在开发cocos2d-x程序时一定要注意坐标轮换问题,屏幕与openGL坐标转换有相应的函数。

        convertToNodeSpace(constCCPoint& worldPoint)这个函数把世界坐标转换为对象窗口内的坐标。

        convertToWorldSpace(constCCPoint& nodePoint)这个函数把对象窗口内的坐标转换为世界坐标。

        convertToNodeSpaceAR(const CCPoint& worldPoint):这个函数把世界坐标转换为基于锚点的窗口内的坐标。

        convertToWorldSpaceAR(const CCPoint& nodePoint):这个函数把基于锚点的对象窗口内的坐标转换为世界坐标。

________________________________________

用到cocos2dX的坐标转换,一般两种情况:

1)从当前坐标点获取世界坐标点(屏幕坐标点,opengl的坐标系)

2)从当前坐标点获取相对于某个CCNode的坐标点;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值