cocos2dx-lua基础内容之 坐标系的转换

来源:互联网 发布:淘宝加盟要多少钱 编辑:程序博客网 时间:2024/06/02 03:56

OpenGL坐标分为世界坐标和模型坐标。
此外,关于世界坐标系和本地坐标系的相互转换,在Node中定义了以下几个常用的坐标变换的相关方法。

– 世界坐标->本地坐标
convertToNodeSpace(const Point& worldPoint) const;
- 本地坐标->世界坐标
convertToWorldSpace(const Point& nodePoint) const;

– 以锚点为原点,世界坐标->本地坐标
convertToNodeSpaceAR(const Point& worldPoint) const;
– 以锚点为原点,本地坐标->世界坐标
convertToWorldSpaceAR(const Point& nodePoint) const;

–将世界坐标中触摸点转换为模型坐标。
convertTouchToNodeSpace(touch) 将世界坐标中触摸点转换为模型坐标。
convertTouchToNodeSpaceAR(Touch) 相对于锚点。

使用案例

  • 将 sprite1 这个节点的坐标转换为sprite节点下的本地(节点)坐标系统的位置坐标。

    使用convertToNodeSpace()时,无论锚点的位置设置在哪,都是以转换目标左下角为计算坐标,然后以被转换目标减去这个计算坐标。
    使用convertToNodeSpaceAR()时,才会使用转换目标的锚点进行计算。然后才以被转换目标减去转换目标。

  • 将 sprite 这个节点的坐标转换为 sprite1节点下的世界坐标系统的位置坐标。
    local pos=sprite1:convertToWorldSpaceAR(cc.p(sprite:getPositionX(),sprite:getPositionY()))

    转换为世界坐标,需要先做一步假设。将被转换点(sprite)添加到目标点(sprite1)中(sprite1:addChild(sprite)),如果已经是了,就不需要添加了。然后将sprite的坐标等价转换为在sprite1内的坐标。

    converToWorldSpace: 以左下角为原点,等价转换 sprite在sprite1内的坐标,再以世界坐标为原点,计算世界坐标。
    converToWorldSpaceAR: 以目标点的锚点为原点等价转换 sprite在sprite1内的坐标,再以世界坐标为原点,计算世界坐标。

    等价转换意为
    原本操作: layer:addChild(sprite): setPosition(10,20);
    准换后操作:sprite1:addChild(sprite): setPosition(10,20);
    这些操作都是cocos2dx内部操作,不需要自己实现的。

使用转换坐标方法时,需要注意以下几点:

  1. 坐标的相互转换时,方法的参数是点坐标,cc.p(x,y)
  2. 参数不是被转换的精灵对象,也不是x,y轴的坐标,需要使用 cc.p()包装x,y的坐标。
  3. 返回值是一个表。而不是返回x,y的值。
--TestScene.lua内容如下。main.lua内容请寻找《cocos2dx-lua基础内容之 使用调度器》size=cc.Director:getInstance():getVisibleSize()local testScene=class("Test",        function()             return cc.Scene:create()         end        )--初始化function testScene:ctor()endfunction testScene:create()   local scene=testScene.new()           --创建场景。   local layer=testScene:createLayer()   --创建层。   scene:addChild(layer)                 --将层添加到场景中   return scene                          --返回场景endfunction testScene:createLayer()   local layer=cc.Layer:create()                         --创建场景   local sprite=cc.Sprite:create("HelloWorld.png")       --创建精灵   local sprite1=cc.Sprite:create("HelloWorld.png")   sprite1:setPosition(cc.p(size.width/2+100,size.height/2+100))   sprite:setPosition(cc.p(size.width/2,size.height/2))       --设置位置      layer:addChild(sprite)                                --将精灵添加到层中   layer:addChild(sprite1)   ----被转换精灵坐标以及目标精灵坐标   print("sprite1.x="..sprite1:getPositionX(),"sprite1.y="..sprite1:getPositionY())   print("sprite.x="..sprite:getPositionX(),"sprite.y="..sprite:getPositionY())      --下面是计算以(0.5,0.5)为锚点时,sprite的左下角坐标x,y的值。   print("real.x="..sprite:getPositionX()-sprite:getContentSize().width/2,         "real.y="..sprite:getPositionY()-sprite:getContentSize().height/2 )  --转换为世界坐标(基于锚点)   --local pos=sprite:convertToWorldSpaceAR(cc.p(sprite1:getPositionX(),sprite1:getPositionY()))       --转换为本地坐标   local pos=sprite:convertToNodeSpace(cc.p(sprite1:getPositionX(),sprite1:getPositionY()))     print("pos.x="..pos.x,"pos.y="..pos.y)   return layer                                          --返回层。endreturn testScene

当使用convertToNodeSpace()时,输出结果如下所示:
这里写图片描述

前面两行输出的是sprite,sprite1的x,y轴坐标。
第三行输出的是sprite左下角的x,y轴坐标。

从之前的说明中,我们知道使用convertToNodeSpace()时,以转换目标左下角为计算坐标,用被转换目标(上面的例子是:sprite1)减去计算坐标(上面的例子是:sprite)。
sprite1的坐标就是(740,460)

sprite的左下角坐标也计算出来了,也就是上面的real.x,real.y的坐标(542.5,225)。
然后对应的坐标相减,得出的就是转换后的坐标(197.5,235)。
与pos.x和pos.y得出的值正好相同。

0 0
原创粉丝点击