加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 18:53:49 所属栏目:百科 来源:网络整理
导读:在平常拼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)。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读