quick-cocos2d-x 3.3 final 中cc.CardinalSplineTo:create导出到lua



最近做的一个quick-cocos2d-x 3.3 final项目中使用到了曲线运动CardinalSpline,发现cc.CardinalSplineBy:create是可以使用的,但是cc.CardinalSplineTo:create却是一个空值报错,让我感到有些疑惑,后来发现有朋友跟我的问题一样,http://www.cocoachina.com/bbs/read.php?tid-273815.html,的确是cc.CardinalSplineTo:create没有导出给lua,但是它的实现都已经在c++端做好了。

如果我们要在模拟器上运行cc.CardinalSplineTo:create,那么我们先找到 quick-3.3\cocos\scripting\lua-bindings\manual\cocos2d目录下的lua_cocos2dx_manual.cpp文件,打开之后全局搜索CardinalSplineTo,发现没有搜索到,但是CardinalSplineBy却可以搜到,所以我们可以仿照CardinalSplineBy,将CardinalSplineTo导出给lua端使用。下面共有三处需要添加修改:

1.

int register_all_cocos2dx_manual(lua_State* tolua_S)
{
    if (NULL == tolua_S)
        return 0;

    extendNode(tolua_S);
    extendScene(tolua_S);
    extendLayer(tolua_S);
    extendMenuItem(tolua_S);
    extendMenuItemImage(tolua_S);
    extendMenuItemLabel(tolua_S);
    extendMenuItemFont(tolua_S);
    extendMenuItemSprite(tolua_S);
    extendMenuItemToggle(tolua_S);
    extendMenu(tolua_S);
    extendScheduler(tolua_S);
    extendSequence(tolua_S);
    extendCallFunc(tolua_S);
    extendSpawn(tolua_S);
    extendCardinalSplineBy(tolua_S);
    extendCardinalSplineTo(tolua_S); //这一行是添加进去的
    extendCatmullRomBy(tolua_S);
    extendCatmullRomTo(tolua_S);
    extendBezierBy(tolua_S);
    extendBezierTo(tolua_S);
    extendDrawNode(tolua_S);
    extendSprite(tolua_S);
    extendLayerColor(tolua_S);
    extendLayerMultiplex(tolua_S);
    extendParticleSystem(tolua_S);
    extendFileUtils(tolua_S);
    extendUserDefault(tolua_S);
    extendGLProgram(tolua_S);
    extendTexture2D(tolua_S);
    extendSpriteBatchNode(tolua_S);
    extendEventListenerKeyboard(tolua_S);
    extendEventListenerTouchOneByOne(tolua_S);
    extendEventListenerTouchAllAtOnce(tolua_S);
    extendEventListenerMouse(tolua_S);
    extendEventListenerCustom(tolua_S);
    extendEventListenerAcceleration(tolua_S);
    extendActionCamera(tolua_S);
    extendGridAction(tolua_S);

    extendMotionStreak(tolua_S);
    extendAtlasNode(tolua_S);
    extendParticleBatchNode(tolua_S);
    extendLabel(tolua_S);
    extendTMXTiledMap(tolua_S);
    extendConsole(tolua_S);
    extendGLProgramState(tolua_S);
    extendOrbitCamera(tolua_S);
    extendTMXLayer(tolua_S);
    extendApplication(tolua_S);
    extendTextureCache(tolua_S);
    extendGLView(tolua_S);
    extendCamera(tolua_S);
    return 0;
}

2.

int lua_cocos2d_CardinalSplineTo_create(lua_State* tolua_S)
{
    if (NULL == tolua_S)
        return 0;

    int argc = 0;
    bool ok = true;

#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
    if (!tolua_isusertable(tolua_S,1,"cc.CardinalSplineTo",0,&tolua_err)) goto tolua_lerror;
#endif

    argc = lua_gettop(tolua_S) - 1;

    if (argc == 3)
    {
        double dur = 0.0;
        ok &= luaval_to_number(tolua_S, 2, &dur, "cc.CardinalSplineTo:create");
        if (!ok)
            return 0;

        int num = 0;
        cocos2d::Vec2 *arr = NULL;
        ok &= luaval_to_array_of_vec2(tolua_S, 3, &arr, &num, "cc.CardinalSplineTo:create");
        if (!ok)
            return 0;

        double ten = 0.0;
        ok &= luaval_to_number(tolua_S, 4, &ten, "cc.CardinalSplineTo:create");
        if (!ok)
        {
            CC_SAFE_DELETE_ARRAY(arr);
            return 0;
        }

        if (num > 0)
        {
            PointArray* points = PointArray::create(num);

            if (NULL == points)
            {
                CC_SAFE_DELETE_ARRAY(arr);
                return 0;
            }

            for( int i = 0; i < num; i++) {
                points->addControlPoint(arr[i]);
            }

            CC_SAFE_DELETE_ARRAY(arr);
            CardinalSplineTo* tolua_ret = CardinalSplineTo::create(dur, points, ten);
            if (NULL != tolua_ret)
            {
                int nID = (tolua_ret) ? (int)tolua_ret->_ID : -1;
                int* pLuaID = (tolua_ret) ? &tolua_ret->_luaID : NULL;
                toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"cc.CardinalSplineTo");
                return 1;
            }
        }
    }

    luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n", "cc.CardinalSplineTo:create", argc, 3);
    return 0;

#if COCOS2D_DEBUG >= 1
tolua_lerror:
    tolua_error(tolua_S,"#ferror in function 'lua_cocos2d_CardinalSplineTo_create'.",&tolua_err);
    return 0;
#endif
}

3.

static void extendCardinalSplineTo(lua_State* tolua_S)
{
    lua_pushstring(tolua_S,"cc.CardinalSplineTo");
    lua_rawget(tolua_S,LUA_REGISTRYINDEX);
    if (lua_istable(tolua_S,-1))
    {
        lua_pushstring(tolua_S,"create");
        lua_pushcfunction(tolua_S,lua_cocos2d_CardinalSplineTo_create);
        lua_rawset(tolua_S,-3);
    }
    lua_pop(tolua_S, 1);
}

其中,1步骤加注释的那一行加在相应的位置,2和3都是直接添加到文件中。

现在我们打开  quick-3.3\quick\player\proj.win32\player.sln文件,生成项目,进行编译,就可以发现我们的player中CardinalSplineTo不再是控制了。

如果要在android上编包运行,那么我们可以在当前项目下的 \frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\cocos2d目录中打开lua_cocos2dx_manual.cpp文件,按照之前的三个步骤进行修改添加,然后重新编译,运行build_native.bat,打包在手机上即可。

时间: 2024-10-20 14:05:17

quick-cocos2d-x 3.3 final 中cc.CardinalSplineTo:create导出到lua的相关文章

cocos2d-html5学习笔记(六)--alpha2中cc.Sequence.create中的bug

cocos2d-html5学习笔记(六)--alpha2中cc.Sequence.create中的bug http://blog.csdn.net/allenice1/article/details/7747425 分类: javascript cocos2d-html52012-07-14 20:08 3005人阅读 评论(0) 收藏 举报 actionfunctionnullobject 今天学习了action,可是练习cc.Sequence.create的时候.发现了问题. cc.Sequ

quick cocos2d x 手机(Android端)启动过程学习

简要学习下quick cocos2d x 在安卓端启动的过程. 首先需要了解一点:quick cocos2d x是依托于Android的activity和GLSurfaceView(继承自SurfaceView)的环境来显示quick层的游戏界面. (1)首先quick类的android游戏从AndroidManifest.xml文件指定的activity(假设AC)启动. (2)AC继承父类的Cocos2dxActivity. (3)调用静态初始化块,加载cocos2dx的动态库.也就是一些C

quick cocos2d x场景切换的生命周期函数调用学习

先上一个场景的基本模版: 1 local ModelScene = class("ModelScene", function() 2 return display.newScene("ModelScene") 3 end) 4 5 function ModelScene:ctor() 6 self.sceneName = "ModelScene" 7 -- 注册点击事件监听 8 self.layer = display.newLayer() 9

quick cocos2d-x Xcode下省去clean,让修改的脚本生效

<quick cocos2d-x Xcode下省去clean,让修改的脚本生效> 项目  target     build phases    点击build phase的空白区域 选择Editor     Add Build Phase      Add Run Script Build Phase 编写脚本: 顺序调整:(第二顺位) 这样就可以避免每次修改了lua脚本,都要手动clean,然后再run,太费时间.. quick cocos2d-x Xcode下省去clean,让修改的脚本生

cocos2dx中node的pause函数(lua)

time:2015/05/14 描述 lua下使用node的pause函数想暂停layer上的所有动画,结果没有效果 1. pause函数 (1)cc.Node:pause 代码: void Node ::pause () { _scheduler-> pauseTarget(this ); _actionManager-> pauseTarget(this ); _eventDispatcher-> pauseEventListenersForTarget(this ); } 分析:

安装sqoop,并将Mysql中的表数据导出到HDFS下的文本文件

首先是安装mysql数据库.使用 sudo apt-get install mysql-server命令即可安装完成.然后进行表的创建和插入数据.如图. 然后下载sqoop和连接mysql数据库的jar包.接下来是安装sqoop.首先是配置sqoop-env.sh文件.如图. 然后将config-sqoop文件中不需要检查的注释掉.如图. 然后接下来是将sqoop-1.4.4.jar包和连接mysql的jar包copy到hadoop目录下的lib目录中,同时把hadoop-core-1.2.1.

.Net中DataGridview数据如何导出到excel表

首先,这个问题在网上有很多答案,也有很多解决的方法.其次,很多人写过类似的博客 .我的这篇博客,主要是写给那些刚刚接触或接触不久.NET并使用其做程序的人,更是写个自己,记录一下方法,方便以后使用. 在窗体中添加一个DataGridView控件,DatagridView获得数据: DataGridView1.DataSource = crList(泛型)或DataGridView1.DataSource=DataSet.Table(0).{注意:通过查询数据库,将查询到的数据放入crList或D

lotus notes 数据库中附件的批量导出 2

Lotus Notes 数据库中附件的批量导出 Lotus Notes 数据库是一种文档型数据库,其中文档的富文本域中往往嵌入许多附件(如 Word 文档.PDF 文档.Excel 文档等).用户时常需要将这些附件导出到其他系统中进行使用处理.然而当需要导出许多文档中的附件时,只能手动逐个打开各个文档并将附件导出,然后再将附件导入到其他系统中,那么,当附件数量很大时则会大大降低效率.本文从用户角度出发,分析了若干附件批量导出的需求并给出了相应的解决方案. 引言 Notes 数据库是一种文档型数据

C#程序中:如何向记事本中写入内容和导出内容

在C#程序中在程序外部存储一些配置信心标记,如果用数据库就有些大材小用了,因此用*.txt.*.dat等存储,即方便又快捷,还可以减轻程序负担 下面研究一下 C#程序中:如何向记事本中写入内容和导出内容. 下面的代码示例演示如何使用 WriteAllText 方法在文件中写入内容.在此示例中,如果文件尚不存在,则创建一个文件,并向其中添加内容. using System; using System.IO; using System.Text; class Test {     public st