Cocos2d-x Lua

Cocos2d-x Lua,第1张

Cocos2dx-js VS Cocos2dx-lua

从效率上编译成字节码的Lua效率肯定比JS高,从坑方面来说,目前Lua几乎没有太大的坑,JS除非团队有牛人。从已经上线成功的产品来说,大多采用Cocos2dx-lua。JS目前没有比较成功的产品。从入门方面,Lua更为合适。对于小团队而言,目前Lua比JS更加合适。

Cocos2d-x官方主推JS的解决方案,因为JS可以跨越移动设备、桌面的限制,实现一套程序跑任意平台。不过对于HTML5的发展与强调体验的游戏来说,也许H5还需一段时间。

从市场来说,Lua明显是更为理性的选择,因为它更加成熟、安全且大作采用。

1.场景

准备资源文件

创建公共函数

创建场景

主场景中添加

方块处理类

使用Texture对帧动画打包

动画帧数据文件 tex.plist

调整屏幕为横屏

显示坦克

创建对象类 app/Object.lua

创建坦克类 app/tank.lua

主场景加载并精灵帧并显示坦克 app/scenes/MainScene.lua

第一步:看cocos2dx调用lua的最初切入点:

[cpp] view plain copy

bool AppDelegate::applicationDidFinishLaunching()

{

CCDirector *pDirector = CCDirector::sharedDirector()

pDirector->setOpenGLView(CCEGLView::sharedOpenGLView())

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(480, 320, kResolutionNoBorder)

pDirector->setDisplayStats(true)

pDirector->setAnimationInterval(1.0 / 60)

// register lua engine

CCLuaEngine* pEngine = CCLuaEngine::defaultEngine()//从这里开始了lua旅程。

CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine)//保存刚才新建的lua引擎对象,以便别处调用。

std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("hello.lua")//CCFileUtils工具类一定封装了文件的搜索路径。

//接下来直接执行了脚本,跟句helloCpp工程的实现,这里本该是类似

//CCScene *pScene = HelloWorld::scene()

//pDirector->runWithScene(pScene)

//这样的代码,但这里并没有这样的代码,可以猜测:hello.lua中一定是实现了类似这样的一些功能,事实上,一定是这样。

//---因为需要添加的这些东西scene、other nodes都是一些c++类的对象,

//既然hello.lua能完成这些工作,那么lua也一定是有能力访问并 *** 作了这些类与对象,

//换句话说,也就是一定存在一种机制,让c++暴漏一些接口供lua调用,

//亦即:lua可以访问cocos2dx里面的东西,并且,一定封装的很好用,否则没人用了。

pEngine->executeScriptFile(path.c_str())

return true

}

第二步:看看CCLuaEngine到底干了点啥

[cpp] view plain copy

class CCLuaEngine : public CCScriptEngineProtocol

{

public:

static CCLuaEngine* defaultEngine(void)

virtual ~CCLuaEngine(void)

virtual ccScriptType getScriptType() {

return kScriptTypeLua

}

CCLuaStack *getLuaStack(void) {

return m_stack

}

//-----------new in me 1

virtual void addSearchPath(const char* path)

//-----------new in me 2

virtual void addLuaLoader(lua_CFunction func)

//----------------------------inherit from CCScriptEngineProtocol------------------

//==================这些函数好像都是纯虚函数在父类中===========================

//--------下面这几个函数基本都是调用【CCLuaStack *m_stack】的成员方法来实现的

virtual void removeScriptObjectByCCObject(CCObject* pObj)

virtual void removeScriptHandler(int nHandler)

virtual int reallocateScriptHandler(int nHandler)

virtual int executeString(const char* codes)

virtual int executeScriptFile(const char* filename)

virtual int executeGlobalFunction(const char* functionName)

//--------------------------------end--------------------------------

virtual int executeNodeEvent(CCNode* pNode, int nAction)

virtual int executeMenuItemEvent(CCMenuItem* pMenuItem)

virtual int executeNotificationEvent(CCNotificationCenter* pNotificationCenter, const char* pszName)

virtual int executeCallFuncActionEvent(CCCallFunc* pAction, CCObject* pTarget = NULL)

virtual int executeSchedule(int nHandler, float dt, CCNode* pNode = NULL)

virtual int executeLayerTouchesEvent(CCLayer* pLayer, int eventType, CCSet *pTouches)

virtual int executeLayerTouchEvent(CCLayer* pLayer, int eventType, CCTouch *pTouch)

virtual int executeLayerKeypadEvent(CCLayer* pLayer, int eventType)

virtual int executeAccelerometerEvent(CCLayer* pLayer, CCAcceleration* pAccelerationValue)

virtual int executeEvent(int nHandler, const char* pEventName, CCObject* pEventSource = NULL, const char* pEventSourceClassName = NULL)

int executeTableViewEvent(int nEventType,cocos2d::extension::CCTableView* pTableView,void* pValue = NULL, CCArray* pResultArray = NULL)

virtual int executeEventWithArgs(int nHandler, CCArray* pArgs)

virtual bool handleAssert(const char *msg)

virtual bool parseConfig(CCScriptEngineProtocol::ConfigType type, const std::string&str)

//----------------------------inherit from CCScriptEngineProtocol end--------------

private:

CCLuaEngine(void)

: m_stack(NULL)

{}

bool init(void)

static CCLuaEngine* m_defaultEngine

CCLuaStack *m_stack

}

第三步:CCLuaEngine类中有一个指针成员变量m_stack,我们先来看看它的定义,注意下CCLuaStack和CCLuaEngine的区别于联系

[cpp] view plain copy

class CCLuaStack : public CCObject

{

public:

static CCLuaStack *create(void)

static CCLuaStack *attach(lua_State *L)

lua_State* getLuaState(void) {

return m_state

}

virtual void addSearchPath(const char* path)

virtual void addLuaLoader(lua_CFunction func)

virtual void removeScriptObjectByCCObject(CCObject* pObj)

virtual void removeScriptHandler(int nHandler)

virtual int reallocateScriptHandler(int nHandler)

virtual int executeString(const char* codes)

virtual int executeScriptFile(const char* filename)

virtual int executeGlobalFunction(const char* functionName)

virtual void clean(void)

virtual void pushInt(int intValue)

virtual void pushFloat(float floatValue)

virtual void pushBoolean(bool boolValue)

virtual void pushString(const char* stringValue)

virtual void pushString(const char* stringValue, int length)

virtual void pushNil(void)

virtual void pushCCObject(CCObject* objectValue, const char* typeName)

virtual void pushCCLuaValue(const CCLuaValue&value)

virtual void pushCCLuaValueDict(const CCLuaValueDict&dict)

virtual void pushCCLuaValueArray(const CCLuaValueArray&array)

virtual bool pushFunctionByHandler(int nHandler)

virtual int executeFunction(int numArgs)

virtual int executeFunctionByHandler(int nHandler, int numArgs)

virtual int executeFunctionReturnArray(int nHandler,int nNumArgs,int nNummResults,CCArray* pResultArray)

virtual bool handleAssert(const char *msg)

protected:

CCLuaStack(void)

: m_state(NULL)

, m_callFromLua(0)

{}

bool init(void)

bool initWithLuaState(lua_State *L)

lua_State *m_state

int m_callFromLua

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11944407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存