cocos2d-x 3.x中lua调用原理1--从基本的c++与lua互相调用开始

Cocos2d-x中用Lua实现剪切板的文字复制粘贴(iOS篇) 这个问题搞死我了……弄了好久才弄好。看上去其实挺唬人的,需要从Lua调到C++,再调到OC,其实仔细分析一下的话还好。我们下面开始讲解: 首先是Lua调到C++(如果直接是C++的项目请无视): 首先,我们在项目里建一个ClipboardHelper.cpp,一个ClipboardHelper.hpp(.h的也可)。 .hpp中我们声明一个想让Lua调用的函数: #ifndef C 阅读详情

刚开始弄cocos2d-x 3.x的lua框架。看了很多网上的文章和例子。到最后自己手动写 的时候也遇到很多困难。现在就把这个学习过程记录下来。

 首先我看完了 lua脚本在c++的舞步。这篇文章很好,很详细的讲述了c++与lua是如何互相调用的。之后我也看了笨木头的5个例子,简单的实现了一下印证了一些想法。

 1)Lua指针的初始化

    lua_State* pL =lua_open();

    luaL_openlibs(pL);

  Lua指针的释放  

lua_close(pL);

而在cocos2d-x中 lua_State*被封装在LuaStack对象中,它的构造和析构也执行了相同的调用。不同的地方是它的初始化中所执行的初始化语句更多,包装了更多的绑定相关的内容。

2)lua本身是脚本语言,加载lua本身的时候才会编译。所以,推荐大家在加载文件的时候尽量放在程序的初始化中,因为当你执行luaL_dofile()函数的时候,Lua会启用语法分析器,去分析你的脚本语法是否符合Lua规则,如果你胡乱的传一个文件过去,Lua就会告诉你文件语法错误,无法加载。如果你的Lua脚本很大,函数很多,语法分析器会比较耗时,所以,加载的时候,尽量放在合适的地方。

int nRet =luaL_dofile(_state, fullPath.c_str());

if (nRet !=0)

{

    CCLOG("[LUA ERROR] %s",lua_tostring(_state, -1));

   lua_pop(_state,1);

   return nRet;

}

这一段指明执行完lua文件后返回若非0则出错,lua_tostring从栈中获得错误信息描述,并输出。

说到这里简单借用一下lua的栈描述栈底为1,往栈顶顺序增加。栈顶为-1,往栈底顺序减少。执行文件出错,lua会将出错信息放入栈顶,因此为-1。

3)对lua进行栈操作的常用函数介绍

压入元素到栈里

void lua_pushnil (lua_State *L);    
void lua_pushboolean (lua_State *L, int bool);
void lua_pushnumber (lua_State *L, double n);
void lua_pushlstring (lua_State *L, const char *s, size_t length);
void lua_pushstring (lua_State *L, const char *s);
void lua_pushcfunction (lua_State *L, lua_CFunction fn);


查询栈里的元素

lua_isnil (lua_State *L, int index);
lua_isboolean (lua_State *L, int index);
int lua_isnumber (lua_State *L, int index);
int lua_isstring (lua_State *L, int index);
int lua_isfunction (lua_State *L, int index);
int lua_istable (lua_State *L, int index);
int lua_isuserdata (lua_State *L, int index);
lua_islightuserdata (lua_State *L, int index);
lua_isthread (lua_State *L, int index);

 

转换栈里的元素

int                lua_toboolean (lua_State *L, int index);
double            lua_tonumber (lua_State *L, int index);
const char *    lua_tostring (lua_State *L, int index);
const char *    lua_tolstring (lua_State *L, int idx, size_t *len);
size_t            lua_strlen (lua_State *L, int index);
lua_CFunction   lua_tocfunction (lua_State *L, int idx);
void *          lua_touserdata (lua_State *L, int idx);
lua_State *     lua_tothread (
cocos2d-x+lua 实现两点触控缩放 cocos2d-x 版本为 3.0 beta 刚开始要做这个效果时个人觉得这种效果网上应该有现成的就搜了一个来用,结果不是那么回事,后来就自己写了,个人觉得效果还不错 先看看我是怎么把C++绑定到lua中的吧 const luaL_reg global_functions [] = { {"fuck", fuck}, {NULL, NULL} }; 阅读详情

相关推荐

Frida动态Hook Cocos2d-x Lua手游:从原理到实战

Hook技术是移动安全领域的核心概念,它允许开发者在程序运行时拦截和修改函数调用数据流,实现动态调试、行为分析和安全检测。其原理是通过注入代码或修改内存,劫持目标函数的执行流程,从而在调用前后插入自定义逻辑。这项技术的价值在于无需源码即可深入理解程序内部机制,广泛应用于逆向工程、漏洞挖掘、自动化测试和游戏安全研究等场景。在手游安全领域,Frida作为一款跨平台的动态插桩框架,凭借其脚本化特性和强大的内存操作能力,成为Hook Cocos2d-x引擎Lua脚本的理想工具。通过Frida,安全研究员可以精准定

weixin_30756499的博客 442

cocos2dx3.x c++ 农场

cocos2dx3.x c++ 农场

LuaCocos2d-x结合使用CocosBuilder的实战指南

Cocos2d-x中,加载ccbi文件(CocosBuilder界面文件)主要依赖于类提供的接口。能够解析ccbi文件并将其中定义的UI元素、层级关系和逻辑转换成Cocos2d-x场景中的节点(Node)和组件。加载ccbi文件的核心API是,它接受一个文件路径字符串作为参数,并返回一个根节点。这个节点可以进一步被添加到游戏场景中。

weixin_29443363的博客 1110

cocos2d-x 3.x(C++)屏幕震动的简单实现(代码,图片)

简单实现了屏幕震动的效果,留作日后借以备用,同时也希望对像我这样刚入行的小伙伴们有一点点儿的帮助。

从不同层面看cocos2d-x

一  框架层面 二  Lua层面 三  工具层面 四  android打包 一 框架层     整体来说,cocos2dX提供的一个简便的框架,包含了渲染,动画,事件分发,网络还有UI,物理引擎等几大模块。对于做一个游戏从功能上来说已经 足够了。我从这几个方面分别探讨下cocos2dX的优缺点以及我们在项目中是如何用到的 (1)渲染:渲染这块,他的渲染数据跟Sprite进行了绑定

u013321328的专栏 1201

cocos2d-lua基础

cocos2d-lua.核心概念 场景:scene,在特定时间、特定地点发生的事件的集合,可以看作是一个容器,包含各种游戏的元素 层:图层(一个场景可以有多个层,一个场景至少有一个层) 精灵:sprite,在屏幕上移动的对象,它能够被控制。通常是可移动、能被控制的图片动画等。 Ui组件:界面上的元素 导演:director,游戏的总控,是一个共享的单例对象,可以在代码中的任何地方调用 节点**类**:node类,凡是可以显示的都是节点(节点是cocos2dx中最为重要的根类,被广泛的继承) 二.坐标

bandaris的博客 2217

Cocos2d-x之LUA脚本引擎深入分析

首先,我们要知道LUA是个什么东西,至于官方怎么说可以百度去查,但我想告诉你的是LUA就是一种可以在不必修改C++代码的情况下实现逻辑处理的手段。稍微讲的再明白一点,就是你用指定语法写一些逻辑处理函数然后保存成文本格式,这个文件称为脚本文件,可以被游戏执行。经过若干年的发展,现在在LUA中写逻辑,除了调用注册到LUA的静态C函数外,也已经可以方便的访问到C++工程中的类的成员函数。这是游戏开发史上

大江东去 的专栏 717

Cocos2d-lua的运行理解

关键词: cocos2d-lua项目启动流程 lua调用cocos2d引擎API 这里是个小测试 环境 引擎版本:Cocos2d-x 3.10 开发工具:Xcode8.1 简述 所谓的Cocos2d-lua,其实只是Cocos2d引擎添加了Lua绑定的版本。 从创建命令可以看出来 cocos new TestProj -d Desktop/ -l lua,这里的引...

wwj256的专栏 450

Cocos2d-Lua之面向对象的封装的具体原理细节

   https://blog.csdn.net/maoliran/article/details/51704714

ylwdi的专栏 354

Cocos2d-x3.0 lua绑定C++

这里记录下我实现Lua绑定的全过程,

杜甲同学的专栏 7282

cocos2d-x 3.x lua的apiC++的关系

1Lua中如何使用Cocos2d-x引擎中的类? 在C++中是这样调用的: // Sprite* sprite = Sprite::create(); sprite->setPosition(Vec2(100, 100)); this->addChild(sprite); // 而在Lua中是这样调用的: // local sprite = cc.Sprite:create() sprite:setPosition(cc.p(100, 100)) self:addC...

翻肚鱼儿的博客 613

cocos2d-xlua用法整理

Cocos2d-x 2.20以上版本没有了创建模板,创建的方式改用了Python创建,方法如下: python create_project.py -project HelloWorld -package com.Panda.Game -language cpp 若要创建lua工程,结尾的cpp改成lua 然后创建出来的sln工程文件打开来,直接运行会发现已经是个成品了,有画面有

pandawuwyj的专栏 3097

Cocos2d-x-Lua示例项目HelloLua

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84132393的博客 864

Cocos2d-xLua实现的三消游戏开发指南

Cocos2d-x是一个开放源代码的游戏开发框架,以其高性能、强大的跨平台能力和活跃的社区支持而著称。它主要用于开发2D游戏,提供了易于理解和使用的API接口,开发者可以快速上手。Cocos2d-x底层采用C++编写,同时也支持Lua和JavaScript脚本语言,使得游戏逻辑的编写变得更加灵活多样。Lua提供了多种控制结构,如if-else条件语句、while和for循环。这些控制结构用于逻辑判断和重复执行某段代码,其它编程语言的控制结构类似,但更为简洁:-- if-else条件语句else。

weixin_42594419的博客 1148

Cocos2d-x手动绑定C++类到Lua

Cocos2d-x 3.0开始, Lua Binding使用tolua++方式自动绑定底层C++类到Lua层,使用户能够用Lua方式调用引擎各种接口。但是用户还是希望手动绑定某些自定义类,所以接下来的内容将一步一步讲解如何手动将自定义C++类绑定到Lua。 创建自定义类 首先,定义一个类Foo,这个类就是接下来要绑定到Lua的类。 注意:所有C++类文件必须放在 Classes 

white_wang的专栏 822

【木头Cocos2d-x 031Lua篇(第06章):Lua调用C++的函数

【木头Cocos2d-x 031Lua篇(第06章):Lua调用C++的函数   到这为止,大家对LuaC++之间的通信应该有些熟悉了,今天我们来介绍最后一个操作。 (旁白:什么?最后一个?要结束了么?太好了~!)   上一章传送门:http://blog.csdn.net/musicvs/article/details/8451361 笨木头花心贡献,啥?花心?不

笨木头 1万+
上一篇: Cocos2d-x手动绑定C++类到Lua
下一篇: 【转】C++ function、bind以及lamda表达式
white_wang
博客等级 码龄14年 0粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值