cocos2d-x-3.3rc2 坐标转换和锚点
来源:互联网 发布:linux文件目录 编辑:程序博客网 时间:2024/06/08 02:12
1、OpenGL坐标系:该坐标系原点在屏幕左下角,x轴向右,y轴向上。这也就是cocos2dx中用到的坐标系。
2、屏幕坐标系:该坐标系的原点在屏幕左上角,x轴向右,y轴向下,其实和OpenGL坐标系的差别也就是y轴的方向拉。假设游戏场景的分辨率为(500,500),其中一个点的坐标为(200,200),那么它在OpenGL坐标系中的坐标还是(200,200),在屏幕坐标系中则要倒过来,则为(200,500-200)。
3、世界坐标系:又名绝对坐标系,概念啥的就不多说了,我们只要知道世界坐标系和OpenGL坐标系方向一致,原点在屏幕左下角,x轴向右,y轴向上。
4、节点坐标系:又名相对坐标系,和OpenGL坐标系方向一致,不同的是原点在父节点左下角。
Node类中:
坐标转换
Vec2 convertToNodeSpace(const Vec2& worldPoint) const; //会转换openGL触摸点转成.tmx 地图或者其他近似的坐标 Vec2 convertToWorldSpace(const Vec2& nodePoint) const; Vec2 convertToNodeSpaceAR(const Vec2& worldPoint) const; Vec2 convertToWorldSpaceAR(const Vec2& nodePoint) const; Vec2 convertTouchToNodeSpace(Touch * touch) const; Vec2 convertTouchToNodeSpaceAR(Touch * touch) const;
convertToNodeSpace:
举例,convertToNodeSpace用于tile-based的游戏,即有一个大地图。convertToNodeSpace会转换openGL触摸点转成.tmx 地图或者其他近似的坐标。
例子:
下面的图片会展现,node1的锚点(0,0),node2的锚点是(1,1)。
我们会调用CCPoint point = node1->convertToNodeSpace(node2->getPosition()); 转换node2的屏幕坐标为node1的位置。结果是,node2的位置是(-25,-60).
convertToWorldSpace:
convertToWorldSpace(常量 CCPoint& nodePoint) 转换node坐标为SCREEN坐标。convertToWorldSpace会经常返回你的精灵的SCREEN位置,如果你想捕获精灵的taps而且需要移动/缩放layer的时候,这可能非常有帮助。
CCPoint point = node1->convertToWorldSpace(node2->getPosition());
上面的代码会转换node2坐标为node2在屏幕上对应的坐标。
convertToWorldSpaceAR
convertToWorldSpaceAR返回相对锚点的位置:所以如果你的场景 – 根layer有一个锚点位于ccp(0.5f, 0.5f)。- 默认的,convertToNodeSpaceAR应返回相对于屏幕中心的位置。
convertToNodeSpaceAR – 和convertToWorldSpaceAR是一样的逻辑。
示例代码:
CCSprite *sprite1 = CCSprite::create("CloseNormal.png");sprite1->setPosition(ccp(20,40));sprite1->setAnchorPoint(ccp(0,0));this->addChild(sprite1);CCSprite *sprite2 = CCSprite::cteate("CloseNormal.png");sprite2->setPosition(ccp(-5,-20));sprite2->setAnchorPoint(ccp(1,1));this->addChild(sprite2);CCPoint point1 = sprite1->convertToNodeSpace(sprite2->getPosition());CCPoint point2 = sprite1->convertToWorldSpace(sprite2->getPosition());CCPoint point3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());CCPoint point4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());CCLog("position = (%f,%f)",point1.x,point1.y);CCLog("position = (%f,%f)",point2.x,point2.y);CCLog("position = (%f,%f)",point3.x,point3.y);CCLog("position = (%f,%f)",point4.x,point4.y);
结果:
position = (-25.000000,-60.000000)position = (15.000000,20.000000)position = (-25.000000,-60.000000)position = (15.000000,20.000000)
Director 类中
Vec2 convertToGL(const Vec2& point); Vec2 convertToUI(const Vec2& point);
bool HelloWorld::onTouchBegan(Touch* touch,Event* event) { auto point = touch->getLocation();//获得OpenGl坐标系 CCLOG("Location point x=%f , y=%f",point.x,point.y); auto point2 = touch->getLocationInView();//获得屏幕坐标 CCLOG("LocationInView point x=%f , y=%f",point2.x,point2.y); point2 = Director::getInstance()->convertToGL(point2);//将屏幕坐标转成OpenGL坐标 CCLOG("convertToGL1 point x=%f , y=%f",point2.x,point2.y); point = Director::getInstance()->convertToUI(point2);//将OpenGL坐标转成屏幕坐标 CCLOG("convertToGL2 point x=%f , y=%f",point.x,point.y); return true; }
设置锚点 即参考点 旋转缩放等都是围绕锚点进行的
virtual void setAnchorPoint(const Vec2& anchorPoint);
范围 0--1;
左下角为Vec2(0, 0);
中心为Vec2(0.5f, 0.5f);
例子
auto l = LayerColor::create(Color4B(255, 0, 0, 255), 150, 150); l->setAnchorPoint(Vec2(0.5f, 0.5f)); l->setPosition(Vec2( s.width/2, s.height/2));
- cocos2d-x-3.3rc2 坐标转换和锚点
- cocos2d-x-3.3rc2 字体
- cocos2d-x-3.3rc2 定时器
- Cocos2d-x 坐标转换
- Cocos2d-x 坐标转换
- cocos2d-x-3.3rc2-001-hello-world
- cocos2d-x-3.3rc2 testcpp 触摸事件
- cocos2d-x-3.3rc2 其他事件
- cocos2d-x-3.3rc2 通知中心
- cocos2d-x-3.3rc2 输入框
- cocos2d-x-3.3rc2 动作管理 ActionManager
- cocos2d-X 的坐标转换
- cocos2d-x 坐标转换总结
- cocos2d-x 坐标转换总结
- Cocos2d-x中的坐标转换
- cocos2d-x开发日志05 ——Z轴坐标 和 锚点设置
- Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验
- cocos2d-x-3.3rc2-003 cocos中的引用计数和自动释放池
- ajax 跨域 jsonp 处理
- 对python字符编码操作的一些认识
- Python 50行代码实现代理服务器(加强版)
- Oracle 替代Sqlserver MASTER..SPT_VALUES 获取日期区间的所有日期 表结果集 (不积跬步,无以至千里)
- 免签名安装正版应用(蒲公英)
- cocos2d-x-3.3rc2 坐标转换和锚点
- Block Ack 基本原理
- 01-2. Maximum Subsequence Sum (25)
- Linux权限<转>
- 33333333333333333333333333
- 请求转发和重定向
- 灰度图像--频域滤波 概论
- linux小命令积累
- 大数据时代的机器学习热点——国际机器学习大会ICML2013参会感想