cocoslua游戏源码
① cocos lua 是怎么调用c++的
使用cocos2dx-lua开发,免不了自己定义类,但是如何使用自定义的类的?先了解下lua如何调用c++的:lua脚本代码->通过coocs2dx中间解析层代码->将其转换并调用cocos2dxc++的前端代码coocs2dx中间解析层代码都在libs/lua/cocos2dx_support/LuaCocos2d.cpp这个文件中,想了解的可以自己去看下这个文件。也就是说,你自己定义了一个类,lua能够调用你自己定义的类,你的自定义类就必须在LuaCocos2d.cpp这个中间解析文件中申明。看了LuaCocos2d.cpp这个文件,可能有的同学都晕了,不知道怎么在LuaCocos2d.cpp中申明自己的定义的类。不过,不用担心,cocos2dx已经提供了tolua++这个工具自动编译生成新的LuaCocos2d.cpp文件。下面开始进入正题。一、创建一个coocs2dx-lua的Demo工程,然后在class中自己定义个类。SNSprite.h[/cpp]////SNSprite.h//LuaDemo////CreatedbyLiuYanghuion13-4-8.////#ifndef__LuaDemo__SNSprite__#define__LuaDemo__SNSprite__#include“cocos2d.h”USING_NS_CC;classSNSprite:publicCCSprite{public:staticSNSprite*create(constchar*name);private:voidinitData();};#endif/*defined(__LuaDemo__SNSprite__)*/[/cpp]SNSprite.cppC++localfunctioncreateSunnyLayer()locallayerSunny=CCLayer:create()locallabTips=CCLabelTTF:create("这个icon图标就是使用的自定义类","Arial",18)labTips:setPosition(ccp(240,280))layerSunny:addChild(labTips)localsp=SNSprite:create("Icon.png")sp:setPosition(ccp(100,100))layerSunny:addChild(sp)returnlayerSunnyend--playbackgroundmusic,preloadeffect添加到scene中:C++--runlocalsceneGame=CCScene:create()--创建场景--sceneGame:addChild(createLayerFarm())--将农场层加入场景--sceneGame:addChild(createLayerMenu())--将菜单界面层加入场景sceneGame:addChild(createSunnyLayer())CCDirector:sharedDirector():runWithScene(sceneGame)OK,xcode编译运行,就看到效果了。
② 如何使用Cocos Code IDE调试Lua开发的游戏
支持调试的环境
在 Windows 上你可以调试Windows和Android游戏,在 Mac 上你可以调试Mac、iOS和Android游戏。我们以 Mac 作为开发环境来演示 Code IDE 的使用,Windows上的流程和这里所介绍的几乎一样,不再赘述。
先决条件
如果你还没有安装Cocos Code IDE,请参考《如何安装和设置Cocos Code IDE》
IDE配置
基础设置
打开工具的 Preferences 页,切换到 Cocos/Lua 子页面,选择你刚刚下载的 Cocos2d-x 3.x 作为 Lua Framework。
额外设置
假设你发现我们提供给你的预编译的Android runtime不能满足你的要求,你就需要重新定制,那么你就需要提供给 IDE 几个 Android 编译需要用到的工具。这可以通过打开 Preferences/Cocos 页面进行配置。
运行、测试游戏
1. 新建一个名为 CocosLuaGame 的 Cocos Lua 工程
2. 点击工具栏上的Debug按钮
3. 默认情况下脚本会运行在我们提供的 Mac 版本预编译 runtime 上。为了简单起见,我们不对默认值进行任何改动。如果你想要在其他我们支持的目标平台上调试程序,可参考下文的“在其它目标平台上调试”
③ 如何看待cocos creator加入Lua
如果在Cocos Creator里面只提供JS支持的。这样就可以很纯粹地只用一本编程语言,完成游戏逻辑、编辑器扩展、引擎扩展,引擎一个人轻装上阵就可以跑得很快,同样资源投入的情况下开发出更多功能来。
但是Cocos的Lua社区太庞大了。Cocos Creator本身的插件架构是允许随意扩展的,所以增加一个Lua扩展在技术层面并不难,难的在多一种编程语言之后的维护:
- 增加Lua中英文文档教程
- 增加Lua API文档
- 增加Lua测试例
- 增加每个版本发布前的Lua测试
- 增加Lua的论坛技术支持
这些因为‘多一门编程语言所带来的维护成本’这些才是大头。不过如果这个成本投入可以换来足够多的开发者数量,那么也就值得了。
④ 有人会用lua语言在cocos2d上编写一个简单的别踩白块游戏嘛求源代码
lua和python是最常见的两种游戏内使用的脚本语言,lua程序设计只会讲lua语言的一些内容,具体不会讲怎么使用在游戏里,或者跟其他语言怎么结合。 具体游戏中的例子可以查查lua在游戏内用法的一些例子,网上有很多的,或者你可以去某个游戏公司上...
⑤ cocos-lua中怎么用代码控制手机开启和关闭游戏震动功能
我写了一个用3.0的工具导出类到lua,自动生成代码的方法。
以前要导出c++类到lua,就得手动维护pkg文件,那简直就是噩梦,3.0以后就会感觉生活很轻松了。
下面我就在说下具体做法。
1、安装必要的库和工具包,以及配置相关环境变量,请按照cocos2d-x-3.0rc0;tools;tolua;README.mdown说得去做,不做赘述。
2、写c++类(我测试用的是cocos2d-x-3.0rc0;tests;lua-empty-test;project;Classes;HelloWorldScene.cpp)
3、写一个生成的python脚本,你不会写,没关系,我们会照猫画虎
1)进入目录cocos2d-x-3.0rc0;tools;tolua,复制一份genbindings.py,命名为genbindings_myclass.py
2)把生成目录制定到咱工程里去,打开genbindings_myclass.py把
?
⑥ 如何使用Cocos Studio导出的LUA文件
首先导出的LUA文件是这样的
这段代码,首先判断callBackProvider是否为空,然后呢,将他的返回值设置为Button_1的Click回调函数。
这样就很明白了。create时候需要传入的参数callBackProvider是一个函数,他的功能是根据传入的3个参数进行判断,最终返回一个函数最为Button(或者其他node)的回调函数!
callBackProvider的三个参数,分别是,当前LUA文件的路径,所绑定的Node(可以通过name或者tag来判断是哪个node),最后是回调函数的名字,通过这三个参数可以很容易的知道是哪个按钮的回调事件,从而返回该按钮所需要的回调函数。
所以,在create时候应该是这样的:
localcallBackProvider=function(path,node,funcName)
ifpath=="Scene.lua"andnode:getName()=="Button_1"andfuncName=="bnt2"then
localfunctionbtnCallback(node,eventType)
--TODO
end
returnbtnCallback
end
end
localcsLuaScene=require("Scene.lua").create(callBackProvider)
也许大家看第一篇文章时候,注意到 我这里提示了一个错误,版本不兼容。是时候更新到3.5了!如果不想更新的话,就把3.5的UI的部分替换过来吧………
⑦ lua怎么进入源码里面去调试
调试lua现几种案: 一)luaedit : 编辑断点断点命查看些都让习惯用vs亲切纯lua环境编辑器说期望程序运行能借用调试脚本能性(至少我没试验)能用需要给lua脚本做main脚本函数并提供系列伪c api(由lua实现函数提供制定值返)由luaedit启脚本main函数进行调试 二)利用 lua debug 库 hook 记录张断点位置表设置行模式 hook 每进入 hook 都检查否断点处若停等待交互调试效消耗 cpu 每进入新代码行都需要调函数函数本身用 lua 写候效率更低 三)利用lua脚本函数实现lua脚本封装断点函数种式结合debug库实现断点栈信息利用lua环境表函数调用信息进行记录打印需要脚本使用者显式提供断点函数调用办优点自组合适合自项目断点调试案缺点相繁琐且断点命难现式融
⑧ 如何在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;
:
m_stack->pushString("enterTransitionFinish");
break;
:
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