Cocos2d中获取锚点所在坐标的方法

Cocos2d中获取锚点所在坐标的方法,第1张

概述在平常拼UI的时候,我们经常会想获取一个Node所在的位置,但是写起来有时候会很繁琐。比如我们先创建了一个精灵,如下: local sp = cc.Sprite:create("XXX.png") sp:setAnchorPoint(0,0.5) sp:setPosition(100,100) layer:addChild(sp) 好,我们现在有了一个精灵,现在我要

在平常拼UI的时候,我们经常会想获取一个Node所在的位置,但是写起来有时候会很繁琐。比如我们先创建了一个精灵,如下:

    local sp = cc.Sprite:create("XXX.png")    sp:setAnchorPoint(0,0.5)    sp:setposition(100,100)    layer:addChild(sp)

,我们现在有了一个精灵,现在我要在他的右边再创建一个贴合他的精灵:

    local rightSp = cc.Sprite:create("XXX.png")    rightSp:setAnchorPoint(0,0.5)    rightSp:setposition(sp:getpositionX()+sp:getBoundingBox().wIDth,100)    layer:addChild(rightSp)

可以看到其中的『sp:getpositionX()+sp:getBoundingBox().wIDth』 写的其实是非常繁琐的。而且如果我们要获得很多Node的位置才能确定这个Node的位置,表达式有时候要写的很长。

那么问题来了,如何在这里提高写代码的效率和正确率?

我们不妨在CCNode里加几个函数。

把以下代码拷贝到CCNode.h中:

    virtual const Vec2 getpositionatanc(const Vec2& point) const;        virtual const Vec2 getpositionatanc(float x,float y) const;        virtual float getpositionXatanc(float x) const;        virtual float getpositionYatanc(float y) const;

再把以下代码拷贝到CCNode.cpp中:

const Vec2 Node::getpositionatanc(const Vec2& point) const{    Vec2 targetPos;    targetPos.x = _position.x - (_anchorPoint.x - point.x) * getBoundingBox().size.wIDth;    targetPos.y = _position.y - (_anchorPoint.y - point.y) * getBoundingBox().size.height;    return targetPos;}const Vec2 Node::getpositionatanc(float x,float y) const{    Vec2 targetPos;    targetPos.x = _position.x - (_anchorPoint.x - x) * getBoundingBox().size.wIDth;    targetPos.y = _position.y - (_anchorPoint.y - y) * getBoundingBox().size.height;    return targetPos;}float Node::getpositionXatanc(float x) const{    return _position.x - (_anchorPoint.x - x) * getBoundingBox().size.wIDth;}float Node::getpositionYatanc(float y) const{    return _position.y - (_anchorPoint.y - y) * getBoundingBox().size.height;}

好了。现在我们可以使用getpositionatanc这个方法,通过往里传入你想获得坐标锚点来获得坐标了。

为方便在Lua中的使用,我们再将其Tolua一下。

在lua_cocos2dx_auto.cpp中,找到那一堆tolua_function(XXXX) 在其中加入这三行:

tolua_function(tolua_S,"getpositionatanc",lua_cocos2dx_Node_getpositionatanc);tolua_function(tolua_S,"getpositionXatanc",lua_cocos2dx_Node_getpositionXatanc);tolua_function(tolua_S,"getpositionYatanc",lua_cocos2dx_Node_getpositionYatanc);

然后在下面那一堆函数中加入这三个函数:

int lua_cocos2dx_Node_getpositionatanc(lua_State* tolua_S){    int argc = 0;    cocos2d::Node* cobj = nullptr;    bool ok  = true;#if COCOS2D_DEBUG >= 1    tolua_Error tolua_err;#endif#if COCOS2D_DEBUG >= 1    if (!tolua_isusertype(tolua_S,1,"cc.Node",&tolua_err)) goto tolua_lerror;#endif    cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,0);#if COCOS2D_DEBUG >= 1    if (!cobj)     {        tolua_error(tolua_S,"invalID 'cobj' in function 'lua_cocos2dx_Node_getpositionatanc'",nullptr);        return 0;    }#endif    argc = lua_gettop(tolua_S)-1;    do{        if (argc == 2) {            double arg0;            ok &= luaval_to_number(tolua_S,2,&arg0,"cc.Node:getpositionatanc");            if (!ok) { break; }            double arg1;            ok &= luaval_to_number(tolua_S,3,&arg1,"cc.Node:getpositionatanc");            if (!ok) { break; }            const cocos2d::Vec2& ret = cobj->getpositionatanc(arg0,arg1);            vec2_to_luaval(tolua_S,ret);            return 1;        }    }while(0);    ok = true;    do{        if (argc == 1)        {            cocos2d::Vec2 arg0;            ok &= luaval_to_vec2(tolua_S,"cc.Node:getpositionatanc");            if(!ok)            {                tolua_error(tolua_S,"invalID arguments in function 'lua_cocos2dx_Node_getpositionatanc'",nullptr);                return 0;            }            const cocos2d::Vec2& ret = cobj->getpositionatanc(arg0);            vec2_to_luaval(tolua_S,ret);            return 1;        }    }while(0);    luaL_error(tolua_S,"%s has wrong number of arguments: %d,was expecting %d \n","cc.Node:getpositionatanc",argc,1);    return 0;#if COCOS2D_DEBUG >= 1    tolua_lerror:    tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_getpositionatanc'.",&tolua_err);#endif    return 0;}int lua_cocos2dx_Node_getpositionXatanc(lua_State* tolua_S){    int argc = 0;    cocos2d::Node* cobj = nullptr;    bool ok  = true;#if COCOS2D_DEBUG >= 1    tolua_Error tolua_err;#endif#if COCOS2D_DEBUG >= 1    if (!tolua_isusertype(tolua_S,"invalID 'cobj' in function 'lua_cocos2dx_Node_getpositionXatanc'",nullptr);        return 0;    }#endif    argc = lua_gettop(tolua_S)-1;    if (argc == 1)     {        double arg0;        ok &= luaval_to_number(tolua_S,"cc.Node:getpositionXatanc");        if(!ok)        {            tolua_error(tolua_S,"invalID arguments in function 'lua_cocos2dx_Node_getpositionXatanc'",nullptr);            return 0;        }        double ret = cobj->getpositionXatanc(arg0);        tolua_pushnumber(tolua_S,(lua_Number)ret);        return 1;    }    luaL_error(tolua_S,"cc.Node:getpositionXatanc","#ferror in function 'lua_cocos2dx_Node_getpositionXatanc'.",&tolua_err);#endif    return 0;}int lua_cocos2dx_Node_getpositionYatanc(lua_State* tolua_S){    int argc = 0;    cocos2d::Node* cobj = nullptr;    bool ok  = true;#if COCOS2D_DEBUG >= 1    tolua_Error tolua_err;#endif#if COCOS2D_DEBUG >= 1    if (!tolua_isusertype(tolua_S,"invalID 'cobj' in function 'lua_cocos2dx_Node_getpositionYatanc'","cc.Node:getpositionYatanc");        if(!ok)        {            tolua_error(tolua_S,"invalID arguments in function 'lua_cocos2dx_Node_getpositionYatanc'",nullptr);            return 0;        }        double ret = cobj->getpositionYatanc(arg0);        tolua_pushnumber(tolua_S,"cc.Node:getpositionYatanc","#ferror in function 'lua_cocos2dx_Node_getpositionYatanc'.",&tolua_err);#endif    return 0;}

大功告成。现在你可以在Lua中使用这些方法了。

注:getpositionatanc这个方法,你可以传入一个Vec2,也就是Lua中的cc.p,也可以直接传入两个锚点 如(0.5,1)。

总结

以上是内存溢出为你收集整理的Cocos2d中获取锚点所在坐标的方法全部内容,希望文章能够帮你解决Cocos2d中获取锚点所在坐标的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1075847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存