溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

cocos2dx中lua實現調用ccbi和動畫等c++工具類

發布時間:2020-07-11 19:58:13 來源:網絡 閱讀:3125 作者:zswnet 欄目:游戲開發

現在新版cocos2dx已經官方支持lua調用ccbi文件, 具體官方有例子

下面的文章已經用處不大




目前cocos2dx 暫時不支持lua調用高級的extensions類, 但是界面部分大量使用cocosbuilder,所以增加了lua支持ccbi和superanimation。

一。cocos2dx中C調lua函數:
CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
       pEngine->executeGlobalFunction(iter->second.c_str());    //必須是全局的,參數為函數的名字
/***********************************************************
二。lua調用c的函數:
用tolua++,編寫pkg文件,生成cpp文件,
可以用一個pkg,include其他的pkg文件
例如
$#include "zsw_extension.h"
$pfile "CCBIFactory.pkg"
$pfile "SuperAnimNodeV2.pkg"
這樣生成一個zsw_extension.cpp文件,
這里要注意一下:在使用回調lua函數的時候(registerScriptTapHandler)需要手動修改一個地方
 !tolua_isusertype(tolua_S,1,"SuperAnimNode",0,&tolua_err) ||
 (tolua_isvaluenil(tolua_S,2,&tolua_err) || !toluafix_isfunction(tolua_S,2,"LUA_FUNCTION",0,&tolua_err)) ||
 !tolua_isnoobj(tolua_S,3,&tolua_err)  (修改error的判斷)
下面修改返回的是function
SuperAnimNode* self = (SuperAnimNode*)  tolua_tousertype(tolua_S,1,0);
 //int nHandler = ((int)  tolua_tonumber(tolua_S,2,0));
  LUA_FUNCTION funcID = (  toluafix_ref_function(tolua_S,2,0));
。。。
  self->registerScriptTapHandler(funcID);
讓回調返回lua的函數
然后可以手動copy一個zsw_extension.h文件

#ifndef __LUAzsw_H_
#define __LUAzsw_H_

extern "C" {
#include "tolua++.h"
#include "tolua_fix.h"
}

#include <map>
#include <string>
#include "tolua_fix.h"
#include "cocos2d.h"
#include "CCLuaEngine.h"
#include "SimpleAudioEngine.h"
#include "../zgame/Animation.h"




using namespace cocos2d;
using namespace CocosDenshion;

TOLUA_API int tolua_ZgameLua_open(lua_State* tolua_S);

#endif // __LUAzsw_H_



再打開cocos2dx_support目錄下面的CCLuaEngine.cpp
(copy這個文件到本地目錄,然后在工程中加入該文件)
1.  添加
#include "zsw_extension.h"
2. 在init中加入我們生成的
bool CCLuaEngine::init(void)
{
   m_state = lua_open();
   luaL_openlibs(m_state);
   tolua_Cocos2d_open(m_state);
tolua_zsw_open(m_state);                                 //   (這里就是加入的函數)
之后lua就可以調用pkg編寫的函數了
/****************************************************************************
三。ccb事件和回調處理方法


void GameUILayer::onNodeLoaded(cocos2d::CCNode * pNode,    cocos2d::extension::CCNodeLoader * pNodeLoader) {
}


SEL_MenuHandler GameUILayer::onResolveCCBCCMenuItemSelector(CCObject * pTarget, CCString * pSelectorName) {
       return NULL;
}

SEL_CCControlHandler GameUILayer::onResolveCCBCCControlSelector(CCObject * pTarget, CCString * pSelectorName) {

string name = pSelectorName->getCString();
       CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, name.c_str(), GameUILayer::onClicked);

       return NULL;
}

bool GameUILayer::onAssignCCBMemberVariable(CCObject * pTarget, CCString * pMemberVariableName, CCNode * pNode) {

       CCNode *button = NULL;
string name = pMemberVariableName->getCString();
       XIAOLEI_CCB_MEMBERVARIABLEASSIGNER_GLUE(this, name.c_str(), CCNode *, button);

       int index = name.find_first_of('-', 0);
if (index != string::npos)
       {
               char* funcName = (char*) (("set_" + name.substr(0,index)).c_str());
               char* typeName = (char*) name.substr(index+1).c_str();
            // CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
               registerCCBIMember(funcName, button, typeName);
       }

       objectNameMapping.insert(map<int, string>::value_type(button->m_uID, name));

       return false;
}

void GameUILayer::onClicked(CCObject * pSender, cocos2d::extension::CCControlEvent pCCControlEvent) {

       map<int, string>::iterator iter = objectNameMapping.find(pSender->m_uID);

if(iter != objectNameMapping.end())
       {
               CCLuaEngine* pEngine = (CCLuaEngine*)CCScriptEngineManager::sharedManager()->getScriptEngine();
//                pEngine->executeGlobalFunctionByShaoLei(iter->second.c_str(), pSender, (char*)iter->second.c_str(), pCCControlEvent);
               pEngine->executeGlobalFunction((iter->second+"_onClicked").c_str());
       }
}

void GameUILayer::registerCCBIMember(const char* functionName, CCObject *obj, char* typeName)
{
   CCLuaEngine*    m_engine = (CCLuaEngine*)CCScriptEngineManager::sharedManager()->getScriptEngine();

   lua_State* m_state_ = m_engine->getLuaState();

 lua_getglobal(m_state_, functionName);                         /* query function by name, stack: function */
if (!lua_isfunction(m_state_, -1))
 {
   CCLOG("[LUA ERROR] name '%s' does not represent a Lua function", functionName);
   lua_pop(m_state_, 1);
   return;
 }

 m_engine->pushCCObject(obj, typeName);

 int error = lua_pcall(m_state_, 1, 0, 0);                                                 /* callfunction, stack: ret */
if (error)
 {
   CCLOG("[LUA ERROR] %s", lua_tostring(m_state_, - 1));
   lua_pop(m_state_, 1); // clean error message
   return;
 }

}



四,lua部分代碼

function second_change_onClicked()
       node:removeFromParentAndCleanup(true)

       local loader = CCBIFactory:create()
       node = loader:loadCCBI(sceneGame, "first.ccbi", "GameUILoader")
       sceneGame:addChild(node)

       return 0
end

function second_text_onClicked()
       second_text:setString("test")
       return 0
end


function set_second_text(obj)
       second_text = obj
end


五。ccb編輯注意名字:
1. 名字不能重復,因為lua都是全局的
2. button部分, CCBIfilename_keypress
button的seletor全部為固定的onClicked
調用lua函數對應為CCBIfilename_keypress_onClicked
3. 成員變量名字也不能重復,都是全局的
CCBIfilename_text-CCLabelTTF(后面跟-類型)
lua對應的函數set_CCBIfilename_text(obj)
以后就可以直接用obj里面賦值的對象來操作

by 孫少磊
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女