Cocos2dx-lua坐标系

virtual bool onTouchBegan(Touch *touch, Event * event);
virtual void onTouchEnded(Touch *touch, Event * event);
virtual void onTouchCancelled(Touch *touch, Event * event);
virtual void onTouchMoved(Touch *touch, Event * event);

**在函数中获取到touch,我们在设计游戏逻辑时需要用到触摸点在Cocos2d坐标系中的位置,就需要将touch的坐标转换成OpenGL坐标系中的点坐标。
Touch position是屏幕坐标系中的点,OpenGL position是Cocos2d-x用到的OpenGL坐标系上的点坐标。通常我们在开发中会使用两个接口getLocation()和getLocationInView()来进行相应坐标转换工作。
此外,关于世界坐标系和本地坐标系的相互转换,在Node中定义了以下四个常用的坐标变换的相关方法。**

**// 把世界坐标转换到当前节点的本地坐标系中
Point convertToNodeSpace(const Point& worldPoint) const;**

**// 把基于当前节点的本地坐标系下的坐标转换到世界坐标系中
Point convertToWorldSpace(const Point& nodePoint) const;**

**// 基于Anchor Point把基于当前节点的本地坐标系下的坐标转换到世界坐标系中
Point convertToNodeSpaceAR(const Point& worldPoint) const;**

**// 基于Anchor Point把世界坐标转换到当前节点的本地坐标系中
Point convertToWorldSpaceAR(const Point& nodePoint) const;**

下面举例测试-坐标系位置的关系变化:

--坐标坐标测试
local TestScene = class("TestScene", cc.load("mvc").ViewBase)


--自定义cclog
local function cclog(...)
    if "table"==type(...)then
        for k,v in pairs(...) do
            print(k,v)
        end
        return
    end

    if ... then
        print(...)
    else
        print("cclog打印值为空")
    end

end


function TestScene:onCreate()
local sp1 = cc.Sprite:create("body.png")
sp1:setPosition(cc.p(20,40))
sp1:setAnchorPoint(cc.p(0,0))
self:addChild(sp1) --世界坐标,就是OpenGL坐标

local sp2 = cc.Sprite:create("body.png")
sp2:setPosition(cc.p(-5,-20))
sp2:setAnchorPoint(cc.p(1,1))
self:addChild(sp2) --世界坐标,就是OpenGL坐标

    print("sp1坐标=",sp1:getPosition())
    print("sp2坐标=",sp2:getPosition())

    local position1 = sp1:convertToNodeSpace(cc.p(sp2:getPosition())) --把Sp2坐标转换为sp1的node坐标系中

    local position2 = sp1:convertToWorldSpace(cc.p(sp2:getPosition())) --把Sp2坐标转换为sp1的世界坐标系中

print("position1=")
    cclog(position1) --结果x  -25,y   -60
print("position2=",position2)
    cclog(position2)--结果x 15,y    20
end

return TestScene

--[[结果
[LUA-print] sp1坐标=  20  40
[LUA-print] sp2坐标=  -5  -20
[LUA-print] position1=
[LUA-print] y   -60
[LUA-print] x   -25
[LUA-print] position2=  table
[LUA-print] y   20
[LUA-print] x   15
]]--

其中:local position1 = sp1:convertToNodeSpace(cc.p(sp2:getPosition()))

相当于sprite2这个节点添加到(实际没有添加,只是这样理解)sprite1这个节点上,那么就需要使用sprite1这个节点的节点坐标系统,这个节点的节点坐标系统的原点在(20,40),而sprite1的坐标是(-5,-20),那么经过变换之后,sprite1的坐标就是(-25,-60)。

其中:local position2 = sp1:convertToWorldSpace(cc.p(sp2:getPosition()))

此时的变换是将sprite2的坐标转换到sprite1的世界坐标系下,而其中世界坐标系是没有变化的,始终都是和OpenGL等同,只不过sprite2在变换的时候将sprite1作为了”参照“而已。所以变换之后sprite2的坐标为:(15,20)。

你可能感兴趣的:(Cocos2dx-lua)