如何在cocos2d c++代码中调用lua以及探究
如何在cocos2d c++代码中调用lua以及探究,有需要的朋友可以参考下。
如何在cocos2d c++代码中调用lua
在AppDelegate 中加入了
#include“Lua_extensions_CCB.h“
#include“CCLuaEngine.h“
#include“Lua_web_socket.h“
查到代码加载lua脚步引擎
官方原话注册引擎
CCLuaEngine*pEngine=CCLuaEngine::defaultEngine();
CCScriptEngineManager::sharedManager()-》setScriptEngine(pEngine);
和ccb有关的lua
CCLuaStack*pStack=pEngine-》getLuaStack();
lua_State*tolua_s=pStack-》getLuaState();
tolua_extensions_ccb_open(tolua_s);
和web_socket 相关的lua
pStack=pEngine-》getLuaStack();
tolua_s=pStack-》getLuaState();
tolua_web_socket_open(tolua_s);
pEngine-》executeScriptFile(“luaScript/controller.lua“);
结束
打开luaScript/controller.lua仔细研究
-- avoidmemory leak
collectgarbage(“setpause“,100)
collectgarbage(“setstepmul“,5000)
require“luaScript/mainMenu“
----------------
-- run
local scene =CCScene:create()
scene:addChild(CreateTestMenu())
CCDirector:sharedDirector():runWithScene(scene)
到这里如果熟悉cocos2dx 的朋友就很熟悉了
不错,这里是cocos2d中lua的使用方法和c++中调用差别不大!
但是还没有完
Cocos2dx 对lua的封装是很好的!
如果不熟悉c++与lua的绑定的代码下面的不建议看
C++与lua的绑定传送门
关于cocos2d 与 lua绑定的代码的探究
//打开“CCLuaEngine.h“
单例实现CCScripEngineProtocol
后期应该支持不仅仅只是lua的脚本引擎
头文件有很多方法
挑一个看看
virtualintexecuteNodeEvent(CCNode*pNode,intnAction);
intCCLuaEngine::executeNodeEvent(CCNode*pNode,intnAction)
{
intnHandler=pNode-》getScriptHandler();
if(!nHandler)return0;
switch(nAction)
{
casekCCNodeOnEnter:
m_stack-》pushString(“enter“);
break;
casekCCNodeOnExit:
m_stack-》pushString(“exit“);
break;
casekCCNodeOnEnterTransitionDidFinish:
m_stack-》pushString(“enterTransitionFinish“);
break;
casekCCNodeOnExitTransitionDidStart:
m_stack-》pushString(“exitTransitionStart“);
break;
casekCCNodeOnCleanup:
m_stack-》pushString(“cleanup“);
break;
default:
return0;
}
intret=m_stack-》executeFunctionByHandler(nHandler,1);
m_stack-》clean();
returnret;
}
这里是进入CCNode后的一些消息函数的处理
不管
intret=m_stack-》executeFunctionByHandler(nHandler,1);
最终是回到了CCLuaStack
调用了executeFunctionByHandler(nHandler,1);
继续探究
intCCLuaStack::executeFunctionByHandler(intnHandler,intnumArgs)
{
intret=0;
if(pushFunctionByHandler(nHandler)) /* L: ... arg1 arg2 ... func */
{
if(numArgs》0)
{
lua_insert(m_state,-(numArgs+1)); /* L: ... func arg1 arg2 ... */
}
ret=executeFunction(numArgs);
}
lua_settop(m_state,0);
returnret;
}
可以看到一些和lua与c++联系的代码了
看看这个类的初始化
boolCCLuaStack::init(void)
{
m_state=lua_open();
luaL_openlibs(m_state);
tolua_Cocos2d_open(m_state);
toluafix_open(m_state);
// Register our version of the global “print“function
constluaL_regglobal_functions={
{“print“,lua_print},
{NULL,NULL}
};
luaL_register(m_state,“_G“,global_functions);
tolua_CocoStudio_open(m_state);
#if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS||CC_TARGET_PLATFORM==CC_PLATFORM_MAC)
CCLuaObjcBridge::luaopen_luaoc(m_state);
#endif
register_all_cocos2dx_manual(m_state);
register_all_cocos2dx_extension_manual(m_state);
register_all_cocos2dx_studio_manual(m_state);
// add cocos2dx loader
addLuaLoader(cocos2dx_lua_loader);
returntrue;
}
这个里的方法看名称应该是注册 coco2dx 中的类到
C++中
register_all_cocos2dx_manual(m_state);
register_all_cocos2dx_extension_manual(m_state);
register_all_cocos2dx_studio_manual(m_state);
详细看
Coco2dx-studio 先不看
头文件
lua_cocos2dx_manual.h
#ifdef__cplusplus
extern“C“{
#endif
#include“tolua++.h“
#ifdef__cplusplus
}
#endif
LUA_APIintregister_all_cocos2dx_manual(lua_State*tolua_S);
头文件
lua_cocos2dx_extensions_manual
#ifdef__cplusplus
extern“C“{
#endif
#include“tolua++.h“
#ifdef__cplusplus
}
#endif
LUA_APIintregister_all_cocos2dx_extension_manual(lua_State*tolua_S);
惊人的相似
看看tolua++.h
真相快水落石出了
这里定义了lua所以用到全部函数
这里是头部,
/* tolua
** Support code for Lua bindings.
** Written by Waldemar Celes
** TeCGraf/PUC-Rio
** Apr 2003
** $Id: $
*/
/* This code is free software; you can redistributeit and/or modify it.
** The software provided hereunder is on an“as is“ basis, and
** the author has no obligation to providemaintenance, support, updates,
** enhancements, or modifications.
*/
原来tolua也是lua封装起来的函数库,大师2003 4月就写好了
相当的牛
好上面只看了lua_cocos2dx_extensions_manual.h的头文件
cpp文件我们也一看详情
我发现注册了一些函数
但是不是全部
在CCLuaStack::init()
方法里还有
tolua_Cocos2d_open(m_state);
这个方法
相应的头文件是LuaCocos2d..h
可以打开看看详情
Luacocos2d..cpp注册了n多函数
我用注册是相对于lua而言
Luacocos2d.cpp代码贼多
有兴趣的童鞋可以看看
看来什么时间要看看cocos2d studio 的代码
紧跟时代的步伐
不能老是cocos builder
CSS 样式表有哪几种
1.1 内联样式表
在标签中直接添加style 例:《p style=“”》 《/p》
1.2 内嵌样式表
作为一个独立区域内嵌在网页内,必须卸载head标签内
例:《head》
《style=“”》
《/style》
《/head》
1.3 外部样式表
即css样式表,需要新建一个css文件,用来放样式表。如果在html文件中调用样式表,需在html文件中点击 右键→CSS样式→附加样式表。(一般用link连接方式)
注:有些标签会有默认的边距,一般写代码的时候会先去除(也可以设置其他需要的样式)
* (对所有标签起作用)
{margin:0px; (边距)
padding:0px;} (间距)
总结一下英语中的cohesive devices
Cohesive Device:(衔接手段)定义:能使信息的逻辑关系更清晰的各种英语字符。
Linking word(连词):
并列或递进关系:and; also; too; or; Besides; furthermore; moreover; likewise; meanwhile等
让步或转折关系:but; however; whereas; nonetheless; nevertheless; although; though; otherwise; yet; rather; despite; rather等
因果关系:because; so; since; for; so; thus; therefore; thereby;
Linking phrase(短语):
并列或递进关系:not only…but also; as well as; either…or; in addition; apart from that; beyond that
让步或转折关系: even though; in spite of; on the other hand; on the contrary; in contrast; instead of, It is true that…;
因果关系: now that; in that; due to; owing to; as a result (of); in that case
Adverb (副词):
并列或递进关系:additionally; similarly; alternatively;
让步或转折关系: surprisingly; admittedly
因果关系: consequently; eventually;
Punctuation (标点符号):
并列或递进关系:分号
同位、举例:冒号;破折号;括号
若您有英语方面的问题,欢迎您向东北师大明日乡知道团队提问。
-cocos2d