cocos2d学习---世界坐标和本地坐标的转化
来源:互联网 发布:9块9包邮淘宝网 编辑:程序博客网 时间:2024/06/06 01:47
最近做东西遇到的小问题,之前没怎么看过,就今天特地拿出来写个demo,记住这个问题。
一、笛卡儿坐标系
OpenGl坐标系为笛卡儿右手系。x向右,y向上,z向外。
我之前开发的是android坐标系为屏幕坐标系是以屏幕左上角为坐标原点,x轴向右逐渐增大,y轴向下逐渐增大。而在cocos2d-lua中坐标系原点在屏幕的左下角,x向右,y向上,z则是指的zorder(层级)。
二、世界坐标系,本地坐标系
世界坐标系的原点固定在屏幕的左下角。
本地坐标是和节点相关的坐标系,每个节点都有独立的坐标系,是以节点左下角为原点。当节点移动或改变方向时,和该节点关联的坐标系将随之移动或者改变方向。
三、锚点
锚点Anchor Point的两个参数范围在0-1 之间,他们是乘数因子。比如(0.5,0.5)表示锚点位于节点长乘于0.5,宽*0.5的位置。
在cocos2d-lua中,Layer的锚点默认值(0,0) node的锚点默认值(0.5,0.5)
下面给个代码看看效果
local red = cc.LayerColor:create(cc.c4b(255,100,100,128)) red:setContentSize(display.width/2,display.height/2) local green = cc.LayerColor:create(cc.c4b(100,255,100,128)) green:setContentSize(display.width/4,display.height/4) red:addChild(green) self:addChild(red)
可以看到位置默认是这样的,但是有一点要提醒就是Layer默认忽视锚点,所以我们要测试就要设置
red:ignoreAnchorPointForPosition(false)
local red = cc.LayerColor:create(cc.c4b(255,100,100,128)) red:setContentSize(display.width/2,display.height/2) red:ignoreAnchorPointForPosition(false) red:setAnchorPoint(0.5,0.5) red:setPosition(display.width/2,display.height/2) local green = cc.LayerColor:create(cc.c4b(100,255,100,128)) green:setContentSize(display.width/4,display.height/4) green:ignoreAnchorPointForPosition(false) green:setAnchorPoint(0,0) red:addChild(green) self:addChild(red)
这里就剩z轴没说了,但是z轴和本次讨论问题没关系就不详细介绍了。
在Quick开发的2D游戏中,z轴不影响物体在屏幕上显示的远近,它只与渲染顺序有关系,z轴值小的node最先被渲染。
4、世界坐标和本地坐标的转化
好了,前面铺垫了那么多。我们终于到了正题,世界坐标系和本地坐标系的转化。
转换主要依赖于convertToNodeSpace和convertToWorldSpaceAR这两个方法
convertToNodeSpace将世界坐标转换为本地坐标系convertToWorldSpaceAR将本地坐标系转换为世界坐标系
先演示世界坐标转换为本地坐标
local spriteOne=CCScale9Sprite:create("extensions/leimu.jpg") local spriteTwo=CCScale9Sprite:create("extensions/oumu.jpg") spriteOne:setScale(0.7) spriteTwo:setScale(0.4) spriteOne:setPosition(ccp(400,500)) spriteOne:setAnchorPoint(1,1) spriteTwo:setPosition(ccp(200,300)) spriteTwo:setAnchorPoint(0.5, 0.5) spriteTwo:setAnchorPoint(0.5,0.5) self:addChild(spriteOne) self:addChild(spriteTwo) --世界坐标转换为本地坐标 local x,y = spriteTwo:getPosition() local point1 = spriteOne:convertToNodeSpace(ccp(x,y)) print('point1'..point1.x..'=='..point1.y)
红绿看腻了吧 ,咱们这次换个养眼=。=
结果
[0.4802] point1-105.71431732178==-65.714302062988
看到了吧,有负数值不用对就知道转换为相对于蕾姆的本地坐标系了
下一步演示本地坐标转换为世界坐标系
local spriteOne=CCScale9Sprite:create("extensions/leimu.jpg") local spriteTwo=CCScale9Sprite:create("extensions/oumu.jpg") spriteOne:setScale(0.7) spriteTwo:setScale(0.4) spriteOne:setAnchorPoint(0,0) spriteOne:setPosition(ccp(300,400)) spriteTwo:setAnchorPoint(0, 0) spriteTwo:setPosition(ccp(0,0)) spriteOne:addChild(spriteTwo) self:addChild(spriteOne) -- 本地坐标转换为世界坐标系 local x,y = spriteTwo:getPosition() local point = spriteOne:convertToWorldSpaceAR(ccp(x,y)) print('point'..point.x..'=='..point.y)
继续展示
point300==400
从结果我们可以看出来,本地坐标系成功转换为世界坐标系
好了,今天就到此结束,(去玩游戏了( ⊙ o ⊙ )!)
- cocos2d学习---世界坐标和本地坐标的转化
- 本地坐标和世界坐标
- cocos2d-x -------------------------------世界坐标本地坐标之间的转换
- OSG中屏幕坐标和世界坐标的转化
- cocos2dx 本地和世界坐标的转换
- 世界坐标本地坐标之间的转换
- ogre 世界坐标、本地坐标、屏幕坐标之间的转换
- 2.cocos2d-x坐标体系(UI坐标系,GL坐标系,本地坐标,世界坐标,节点坐标)
- 本地坐标VS世界坐标
- OPENGL 的世界坐标和 纹理坐标
- OPENGL 的世界坐标和 纹理坐标
- unity3d的世界坐标转化成屏幕坐标
- Unity3D的世界坐标转化成屏幕坐标
- unity3d的世界坐标转化成屏幕坐标
- cocos2dx学习之路----第七篇(坐标系统中本地坐标与世界坐标的转换详解)
- 虚幻4本地坐标和世界坐标的转换(蓝图)
- Unity世界坐标与本地坐标的一种转换方法
- 世界坐标和页面坐标
- 数学模拟 HDU-4814
- 为什么我的 Android Studio 那么卡
- JQuery遍历之向下遍历
- 1040: 进阶版a+b
- 全局地址池 与接口地址池
- cocos2d学习---世界坐标和本地坐标的转化
- 去除中国夏令时对日期的影响
- Python读取路径下的所有文件
- Java——HashMap<> 四种遍历方式
- 线性表、栈与队列
- Apache Drill学习文档尝试翻译之安装
- Python对象中__del__方法起作用的条件
- android调用照相机拍照获取照片并…
- 有一个分数序列2/1+3/2+5/3+8/5+13/8+…求出这个数列前20项的和