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_NAME\frameworks\runtime-src\Classes目錄下, 添加自己的類文件, 比如hall.h & hall.cpp, 並添加自己的類.
進入到YOUR_PROJECT_NAME\frameworks\cocos2d-x\tools\tolua下面, 復制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_NAME\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto目錄下面看到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);  // 改這一句


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM