在平常拼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中获取锚点所在坐标的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)