【cocos2d-x + Lua(1) 绑定Lua并使用tolua++】
为什么要使用Lua进行游戏开发?转载请注明出处http://www.cnblogs.com/zisou/p/cocos2dx-lua1.html
上面一个问题我觉得在我们使用Lua之前需要深入思考的,Lua有何优点?缺点又是什么?先找准自己的项目定位
在什么时候使用是很必要的;
经过自己一番摸索之后有如下结论:
优点:
1,嵌入式脚本开发可以跳过平台市场进行独立的游戏资源更新;
2,在使用Lua开发能降低在使用C++中得指针引用报错,nil类型问题;
3,可以使用Lua表结构来完成面向对象;
还有一个项目定位的问题,那就是开发游戏,用全Lua,还是C++绑定Lua呢?
全Lua:
如果使用全Lua,我建议完全使用Cocos2d-x触控官方收购了成都的Quick-Cocos2dx!用Quick开发优势就一个
字!快!官方提供的框架(quicklua包)目前是2.2版本(3.0以后也会同步),以后我会补上配置Quick开发的环境;
C++绑定Lua:
在项目定位中,只有一部分模块(活动等)需要使用Lua开发,那就必须半路出家,从中途绑定上Lua,进行C++和
Lua的交叉开发,这种绑定开发是比较流行的,因为C++能利用Lua的优势实现自更新,Lua也能依赖C++借助它的
底层开发能力完成相对复杂的开发;
上面对Lua的使用做了个概述,下面直接进行重要环节了,将会在xcode和eclipse上实现cocos2dx+lua!
本篇可能有点长,自带小板凳,瓜子观看;
———————————————————————————————————————————————————
使用版本Cocos2dx2.2版本,
Xcode中手动绑定 Cocos2dx+lua:
1,首先新建一个cocos2dx新工程,怎么建都可以,最终能再Xcode运行起来都行;

2,新建好后在libs文件夹下面添加Lua的libs包;

这个是我用xcode新建出来的Lua项目,里面自带了一个包Lua文件夹;
也可以使用cocos2dx自带:

对比后发现用了4个目录,cocos2dx_support,lua,luajit,tolua

3,添加完成之后点Run会报错,是因为缺少CocoStudio这个库,如果你项目以后要使用CocoStudio那就再把库导进来,如果不用
那就直接注释掉CocoStudio相关的就可以跑起来了!
4,OK跑起来之后,我们就可以使用Lua脚本了,我们先简单写一个测试的(功能为在C++加载一个CClayer,CClayer中有一个
背景精灵图片)
(一)首先我们需要先把lua脚本代码写出来
testlua.lua
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
print("----------------------------------------")
print("LUA ERROR: " .. tostring(msg) .. "\n")
print(debug.traceback())
print("----------------------------------------")
end local function main()
-- avoid memory leak
collectgarbage("setpause", )
collectgarbage("setstepmul", ) local cclog = function(...)
print(string.format(...))
end local visibleSize = CCDirector:sharedDirector():getVisibleSize()
local origin = CCDirector:sharedDirector():getVisibleOrigin() local function createLayerMap()
local layerWroldMap = CCLayer:create() local bg = CCSprite:create("luaimg/bd.jpg")
bg:setPosition(origin.x + visibleSize.width / + , origin.y + visibleSize.height / )
layerWroldMap:addChild(bg,) return layerWroldMap end CCDirector:sharedDirector():getRunningScene():addChild(createLayerMap(),,) end xpcall(main, __G__TRACKBACK__)
如果你有一些编程经验,学习lua,js这种脚本语言是很轻松的,去网上下载Lua教程可以先了解一下!
(二)在之前我已经写了一个单例方法使用的PublicLuaTodo类,主要就是引用官方给我们提供的CCLuaEngine(Lua支持引擎)
这是一个在cocos2dx中操作Lua的中间件工具类,我已经封装好了,怎么去使用Lua的方法;
下面我直接贴代码:
PublicLuaTodo.h
#include "cocos2d.h"
#include "script_support/CCScriptSupport.h"
#include "../../../lua/cocos2dx_support/CCLuaEngine.h"
#include <string> using namespace std;
USING_NS_CC; class PublicLuaTodo:public CCObject
{
public:
PublicLuaTodo(void);
~PublicLuaTodo(void);
static PublicLuaTodo* getInstance();
//执行lua文件
static void toDoLuaFile(string luapath);
//执行lua语句
static void toDoLuaString(string luastring);
//执行一个lua全局的方法
static void toDoLuaGlobalFunction(string founctionname);
private:
static PublicLuaTodo* m_instance;
};
PublicLuaTodo.cpp
#include "PublicLuaTodo.h"
CCLuaEngine* pEngine;
PublicLuaTodo* PublicLuaTodo::m_instance = NULL;
PublicLuaTodo* PublicLuaTodo::getInstance()
{
if(!m_instance)
{ m_instance = new PublicLuaTodo();
}
return m_instance;
} PublicLuaTodo::PublicLuaTodo()
{
pEngine = CCLuaEngine::defaultEngine();
CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine); } void PublicLuaTodo::toDoLuaFile(string luapath)
{
std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename(luapath.c_str());
pEngine->executeScriptFile(path.c_str());
} void PublicLuaTodo::toDoLuaString(string luastring)
{
pEngine->executeString(luastring.c_str());
} void PublicLuaTodo::toDoLuaGlobalFunction(string founctionname)
{
pEngine->executeGlobalFunction(founctionname.c_str());
} PublicLuaTodo::~PublicLuaTodo(void)
{
if(!pEngine)
{
pEngine=NULL;
}
}

上图是我工程全部准备好的结构;
(三)执行我们已经运写好的Lua文件:
string luafile = "test/test.lua";
PublicLuaTodo::getInstance()->toDoLuaFile(luafile);
我把上段代码写到了helloapp里面的关闭方法中, 很方便就能运行起来Lua新加的层!

5,使用toLua++ 工具类实现在Lua中调用C++方法
(一)在工程中我还引入了一个做适配的类VisbleRect.h是C++写的,主要作用是获取屏幕各个方向上的坐标,
方便使用适配后的坐标点。要使用这个类cocos2dx提供了工具tolua方法,原理就是通这tolua++IPA调用通过
自己创建的XX.pkg文件,生成出对应供lua调用的类LuaCocos2d.cpp接口,lua能对应寻找对应方法在Lua中
使用。
(二)编写需要调用的XX.pkg文件:
定位到:/Users/youmacname/cocos2dx.2.2/cocos2d-x-2.2/tools/tolua++ 中,并在该目录下编写VisbleRect.pkg文件
编写规则参见README翻译如下:
1) enum keeps the same
2) remove CC_DLL for the class defines, pay attention to multi inherites
3) remove inline keyword for declaration and implementation
4) remove public protect and private
5) remove the decalration of class member variable
6) keep static keyword
7) remove memeber functions that declared as private or protected
VisbleRect.pkg
class VisibleRect
{
static CCRect getVisibleRect();
static CCPoint left();
static CCPoint right();
static CCPoint top();
static CCPoint bottom();
static CCPoint center();
static CCPoint leftTop();
static CCPoint rightTop();
static CCPoint leftBottom();
static CCPoint rightBottom();
};
(三)修改/cocos2dx.2.2/cocos2d-x-2.2/tools/tolua++ 中的Cocos2d.pkg,添加$pfile "VisibleRect.pkg"这一行

(四)继续修改如下路径:
定位到:/cocos2dx.2.2/cocos2d-x-2.2/tools/tolua++/下
Makefile文件

Cocos2d.pkg文件

修改成你自己想生成的路径
(五)打开终端运行./build.sh ,编译生成新的带接口的LuaCocos2d.cpp

(六)将新生成的LuaCocos2d.cpp复制到我们工程目录下
对应工程目录
/Users/youmacname/myluatest/myluatest/libs/lua/cocos2dx_support/
替换掉原有的LuaCocos2d.cpp
(七)这时直接xcodex运行run会报错,需要在工程里面LuaCocos2d.cpp中添加VisbleRect.h头文件的路径。
#include "/Users/youmacname/myluatest/myluatest/Classes/VisibleRect.h"
再点Run就不会报错了,到这一步应该也了解了整个Cococs2dx运行Lua的原理和机制!
恭喜你可以使用VisibleRect里面所提供的静态方法了!意味着Lua也可以调用C++了!!
我们来实际在Lua中操作一下
修改test.lua

-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
print("----------------------------------------")
print("LUA ERROR: " .. tostring(msg) .. "\n")
print(debug.traceback())
print("----------------------------------------")
end local function main()
-- avoid memory leak
collectgarbage("setpause", )
collectgarbage("setstepmul", ) local cclog = function(...)
print(string.format(...))
end --local visibleSize = CCDirector:sharedDirector():getVisibleSize()
--local origin = CCDirector:sharedDirector():getVisibleOrigin() local function createLayerMap()
local layerWroldMap = CCLayer:create() local bg = CCSprite:create("luaimg/bd.jpg") --bg:setPosition(origin.x + visibleSize.width / 2 + 80, origin.y + visibleSize.height / 2) bg:setPosition(VisibleRect:center()) layerWroldMap:addChild(bg,) return layerWroldMap end CCDirector:sharedDirector():getRunningScene():addChild(createLayerMap(),,) end xpcall(main, __G__TRACKBACK__)
OK,改完之后Run一下

到现在为止我们已经完成了在xcode上面绑lua并使用tolua++调用C++的方法!
———————————————————————————————————————————————————
Android 上面绑Lua
如果你没有配置过mac上的android环境,那么请看这篇【cocos2d-x 环境配置-Mac配置篇】
1,同样也是先创建一个新工程;
./create_project.py -project XXX-package com.xxx.XXX -language cpp
2,将刚才我们在xcode上写的东西新加的类都移植(复制对应目录就行),并编写对应的.mk文件

3,工程可能会报错,先导入libPluginPrptocol Cocos2dx提供的扩展包
/Users/youmacname/cocos2dx.2.2/cocos2d-x-2.2/plugin/protocols
右键myluatest 工程->Android->library ->add libPluginPrptocol进来

4,这步是重要环节,也是理解android工程中绑lua是如何工作的!

按照上图,我们需要对应添加
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_lua_static
lua静态库和我们需要lua单独的.so android工程
$(call import-module,scripting/lua/proj.android)
OK,现在我们run一下会报错!!和在xcodex上面是一样的原因!我们还得替换掉原有的LuaCocos2d.cpp!
android $(call import-module,scripting/lua/proj.android) 的真实路径如下:
/Users/youmacname/cocos2dx.2.2/cocos2dx2.2/scripting/lua/cocos2dx_support/
我们需要将LuaCocos2d.cpp替换掉/Users/youmacname/cocos2dx.2.2/cocos2dx2.2/scripting/lua/cocos2dx_support/
下面的LuaCocos2d.cpp
并且和IOS一样还要修改里面的路径,此时路径应该填andriod下面的,可以填绝对路径!

以上步骤完成就可以点android Run了!!

成功生成了.so文件,标志着android也运行起来了!
以上就是android 工程中手动绑定并使用tolua++内容!
这篇文章确实有点长,希望对大家有用!Lua下一篇我会说一下如何C++和Lua数据传值,互调方法等我已经处理好的类库;
————————————————————————————————————
本章Xcode源码地址:百度云盘
ps:仙凡奇缘官网 http://www.xianfancoco.com
cocos2dxQQ交流群:41131516
【cocos2d-x + Lua(1) 绑定Lua并使用tolua++】的更多相关文章
- cocos2dx lua binding ,cocos2dx 绑定lua测试
前面2篇分别简单介绍 手动bind C++ 类和lua:http://blog.csdn.net/chenee543216/article/details/12074771 使用tolua++简化工作 ...
- Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本
前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...
- slua中,绑定lua文件到Monobehavior的一种方法
slua本身并不提供如何把一个lua文件绑定到一个预制中,就像一个普通的继承自monobehavior的自定义脚本那样,而tolua的框架却采用了拙劣的做法: public class LuaBeha ...
- Lua 架构 The Lua Architecture
转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间 ...
- vJine 第三波 之 Lua 来袭 vJine.Lua
vJine.Lua vJine.Lua是Lua语言的C#封装库,可实现通过C#直接运行Lua脚本并与Lua脚本交互的功能. 1. 授权: MPL2.0 相关资源: nuget:(https://www ...
- VC和VS调用Lua设置以及Lua C API使用。
通过c++调用lua 脚本, 环境VC++6.0 lua sdk 5.1.4 在调用前先认识几个函数.1.调用lua_open()将创建一个指向Lua解释器的指针.2. luaL_ope ...
- lua调用不同lua文件中的函数
a.lua和b.lua在同一个目录下 a.lua调用b.lua中的test方法,注意b中test的写法 _M 和 a中调用方法: b.lua local _M = {}function _M.test ...
- 通过lua栈了解lua与c的交互
lua是如何执行的 其中分析.执行部分都是c语言实现的. lua与c的关系 lua的虚拟机是用c语言实现的,换句话说一段lua指令最终在执行时都是当作c语言来执行的,lua的global表,函数调用栈 ...
- lua编程之lua与C相互调用
lua是扩展性非常良好的语言,虽然核心非常精简,但是用户可以依靠lua库来实现大部分工作.除此之外,lua还可以通过与C函数相互调用来扩展程序功能.在C中嵌入lua脚本既可以让用户在不重新编译代码的情 ...
随机推荐
- Kuberentes-入门
一.kubernetes架构介绍和集群规划 点击链接查看: 系统环境初始化:https://www.cnblogs.com/hwlong/p/9105742.html 二.CA证书创建和分发 点击链接 ...
- struts框架值栈问题七之EL表达式也会获取到值栈中的数据
7. 问题七:为什么EL也能访问值栈中的数据? * StrutsPreparedAndExecuteFilter的doFilter代码中 request = prepare.wrapRequest(r ...
- 图像获取与采集及图像格式与Region介绍——第2讲
一.图像获取与采集 1.本地图片读取 ① 单张读取 直接传入图片路径即可,可以用绝对路径,也可以用相对路径: read_image (Image, 'C:/Users/Administrator/De ...
- 深入php内核,从底层c语言剖析php实现原理
深入php内核,从底层c语言剖析php实现原理 非常好的电子书:http://www.cunmou.com/phpbook/preface.md 这是它的目录: PHP的生命周期 让我们从SAPI ...
- JDK和Eclipse的下载路径
JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse http://www.eclipse.or ...
- Perl注释文本的高亮显示规则
sub help{ print <<EndOfUsage;\e[1;37mHELP :1. Usage : perl $0 input output 2. Function : tran ...
- 2018.08.30 游戏(概率dp)
题目描述 Alice 和 Bob 两个人正在玩一个游戏,游戏有很多种任务,难度为 p 的任务(p是正整数),有 1/(2^p) 的概率完成并得到 2^(p-1) 分,如果完成不了,得 0 分.一开始每 ...
- py-opp 类(class)
类的创建 class 类名: pass class Bar: def foo(self,arg): # self ,是传的实例对象, print('self:',self,arg) #因为类属性和方法 ...
- 笔记本的Windows系统怎么设置有了外接鼠标后停用触摸板
点击控制面板,切换小图标模式,找到鼠标,点击它,然后会弹出一个窗口,找到ELAN选项卡(一般有个红色图标,不过可能需要对应驱动才会有此选项卡),选中插入外置 USB 指向装置时禁用.点击确定保存配置即 ...
- 一种基于Redis的10行代码实现IP频率控制方法
优点:可支持海量访问的频率控制,只需要增加Redis机器,单个Redis节点(只占用一个cpu core)即可支持10万/s以上的处理. 基于IP频率限制是种常见需求,基于Redis可以十分简单实现对 ...