zoukankan      html  css  js  c++  java
  • cocos2d-x 3.0 在lua中调用自定义类

    环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包

    1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7.3, PyYAML-3.10.win32-py2.7, pyCheetah 这些东东在README.mdown上面都给好了连接, 直接下载就行了, 安装好python后, 在系统环境变量的PATH中设置python所在的目录
    2. 安装android-ndk-r9b, 下载地址:http://dl.google.com/android/ndk/android-ndk-r9b-windows-x86.zip, 安装好以后要添加环境变量NDK_ROOT, 另外, 友情提示一下, 这个目录的上级目录中不能有空格存在, 比如说, 如果是放在program files目录下面, 后面生成.h & .cpp文件的时候会出错, 我是直接放在D盘的根目录下面的, 像这样  D:android-ndk-r9b
    3. 安装dos2unix, 下载地址:http://waterlan.home.xs4all.nl/dos2unix/dos2unix-6.0.5-win32.zip, 解压到一某个目录下面, 并设置PATH环境变量的值指向bin目录下, 在py文件中会使用到dos2unix.exe这个程序
    4. Cygwin Terminal, 这是android开发环境, 不一定非要安装, 考虑到肯定会在android下面进行开发调试, 所以现在可以一起安装一下. 相关安装事项可以参考这个文章:http://michaelye1988.iteye.com/blog/1740367

    创建一个自己的lua项目, 这个就不多说了, 创建好该项目以后, 进入到YOUR_PROJECT_NAMEframeworks untime-srcClasses目录下, 添加自己的类文件, 比如hall.h & hall.cpp, 并添加自己的类.
    进入到YOUR_PROJECT_NAMEframeworkscocos2d-x ools olua下面, 复制cocos2dx_spine.ini和genbindings.py两个文件, 重新改名为hall.ini和hall.py
    修改hall.ini文件, 要修改的内容如下:
    [cocos2dx_ui]   改成  [hall]
    prefix = cocos2dx_ui    改成  prefix = hall
    target_namespace = ccui  改成  target_namespace =   (就是没有命名空间啦)
    cpp_namespace = cocos2d::ui  改成  cpp_namespace = 
    headers = %(cocosdir)s/cocos/ui/CocosGUI.h  改成  headers = [这里写上hall.h的目录, 可以用相对路径, 也可以用绝对路径, 注意用/表示目录, 而不是用表示目录]
    classes = ......    它原来这里的类比较多, 改成  你自己的, 要在lua中使用的类, 比如我这里有  classes = user_data hall 这两个在lua中使用的类
    skip = ...       改成  skip =  (就是全删除了)
    classes_have_no_parents = Helper  改成  classes_have_no_parents =   (删除了)
    abstract_classes = Helper      改成  abstract_classes =         (删除了)

    修改hall.py文件, 这下面

    cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'),
    'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'),
    'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'),
    'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'),
    'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'),
    'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'),
    }
    修改成cmd_args = {'hall.ini' : ('hall', 'lua_hall_auto'),

    }
    hall.ini是配置文件的名称, hall是hall.ini文件中第一行[hall]的字符串, lua_hall_auto是生成的.h & .cpp文件名称
    在此目录下按住shift右击, 选择"在此处打开命令窗口(W)", 执行python hall.py, 如果没有问题的话就会在YOUR_PROJECT_NAMEframeworkscocos2d-xcocosscriptinglua-bindingsauto目录下面看到lua_hall_auto.h & lua_hall_auto.cpp 两个文件, 将这个文件添加到项目中去, 至于文件的位置, 不用移动
    在lua_hall_auto.h文件中就一个函数int register_all_hall(lua_State* tolua_S);在AppDelegate.cpp文件中添加#include "lua_hall_auto.h"
    修改代码
    auto engine = LuaEngine::getInstance();
    register_all_hall(engine->getLuaStack()->getLuaState());  // 这一行是添加的
    ScriptEngineManager::getInstance()->setScriptEngine(engine);
    engine->executeScriptFile("src/test.lua");

    在脚本添加使用自定义的C++类
    local ghall = hall:get_singleton_ptr();
    local msg = "hallo";
    ghall:send_data(msg, #msg);
    在send_data中打个断点, 可以看到执行到这个函数里面了.

    下面贴上我写的hall.h & hall.cpp文件

    // hall.h 
    
    #pragma once
    
    #include "CCRef.h"
    
    class user_data : public cocos2d::Ref
    {
    public:
        user_data(
            std::string uname,
            unsigned int uid);
    
        std::string        uname() const;
        unsigned int    uid() const;
    private:
        std::string        uname_;
        unsigned int    uid_;
    };
    
    class base_net
    {
    public:
        base_net() {};
        virtual ~base_net() = 0;
    };
    
    class hall : public base_net, public cocos2d::Ref
    {
    public:
        hall();
        ~hall();
    
        static hall* get_singleton_ptr();
        static hall& get_singleton();
    
        void send_data(const char* msg, int msglen);
    
    protected:
        void process_packet();
    
    private:
        static hall* pthis;
    };
    View Code
    // hall.cc
    
    //#include "CCRef.h"
    #include "hall.h"
    #include <iostream>
    
    #include "CCLuaEngine.h"
    #include "cocos2d.h"
    
    user_data::user_data(
        std::string uname,
        unsigned int uid) :
        uname_(uname), uid_(uid)
    {
        
    }
    
    std::string user_data::uname() const
    {
        return uname_;
    }
    
    unsigned int user_data::uid() const
    {
        return uid_;
    }
    
    base_net::~base_net() {}
    
    hall* hall::pthis = NULL;
    
    hall::hall()
    {
        pthis = this;
    }
    
    hall::~hall()
    {}
    
    hall& hall::get_singleton()
    {
        return *get_singleton_ptr();
    }
    
    hall* hall::get_singleton_ptr()
    {
        assert(pthis != NULL);
        return pthis;
    }
    
    void hall::process_packet()
    {
        
    }
    
    void hall::send_data(const char* msg, int msglen)
    {
        std::cout << msg << " " << msglen << std::endl;
        process_packet();
    }
    View Code

    这里说一下我遇到的几个问题
    1. base_net的析构函数体一开始我是写的头文件中的, 后面生成时会出现一份拷贝到lua_hall_auto.cpp文件中, 所以在头文件中不要写成员函数的实现体
    2. get_singleton()返回的是一个引用, 在生成的lua_hall_auto.cpp文件中, 关于这个函数的转换会出现问题, 如下
    hall& ret = hall::get_singleton();
    object_to_luaval<hall&>(tolua_S, "hall", (hall&)ret);
    上面的代码有问题, 应该改成
    hall& ret = hall::get_singleton();
    object_to_luaval<hall>(tolua_S, "hall", &ret);  // 改这一句

  • 相关阅读:
    Android"寻龙点穴"指南针
    如何获取注册地图API的SHA1值与PackageName?
    如何获取注册地图API的SHA1值与PackageName?
    Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决记录
    Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决记录
    LocationManager的使用
    LocationManager的使用
    Android方向传感器
    Android方向传感器
    Android光线传感器
  • 原文地址:https://www.cnblogs.com/emyueguang/p/3713635.html
Copyright © 2011-2022 走看看