天龙 怎么取lua调用dlllua

function&add&(&x,&y&)return&x&+&y;end
将这个代码保存为add.lua。
&&& 接着我们新建一个MFC对话框工程:Calc。这个程序实现简单整数加法运算。
首先在对话框类定义一个Lua虚拟机指针以及加法运算所需要的变量:
&&&&/**&&&&*&\brief&LUA&虚拟机指针。&&&&*/&&&&lua_State&*m_&&&&/**&&&&*&\brief&加法运算的左操作数。&&&&*/&&&&int&m_nLeftN&&&&/**&&&&*&\brief&加法运算的左操作数。&&&&*/&&&&int&m_nRightN&&&&/**&&&&*&\brief&加法运算的结果。&&&&*/&&&&long&m_nR&&&&&&&&
在对话框初始化函数调用虚拟机初始化函数。函数的代码如下:/*!*&&\brief&初始化Lua虚拟机。**&&\return&无。*/void&CCalcDlg::InitLuaState(){&&&&m_plua&=&lua_open();&&&&&if(NULL!=m_plua)&&&&{&&&&&&&&luaopen_base(m_plua);&&&&&&&&luaopen_table(m_plua);&&&&&&&&luaopen_string(m_plua);&&&&&&&&luaopen_math(m_plua);&&&&&&&&luaopen_debug(m_plua);&&&&}&}
在对话框的销毁消息响应函数里关闭Lua虚拟机:
void&CCalcDlg::OnDestroy(){&&&&CDialog::OnDestroy();&&&&//&TODO:&在此处添加消息处理程序代码&&&&lua_close&(m_plua);&}
&&&&& 在执行加法按钮的消息函数里添加如下代码:
&void&CCalcDlg::OnBnClickedOk(){&&&&//&TODO:&在此添加控件通知处理程序代码&&&&UpdateData(TRUE);&&&&StackDump(m_plua);&&&&&string&strLuaFile&=&_T("");&&&&GetLuaFile(strLuaFile);&&//&得到lua脚本文件全路径&&&&luaL_dofile(m_plua,strLuaFile.c_str());&&&&&//&解释分析lua文件&&&&StackDump(m_plua);&&&&lua_getglobal(m_plua,_T("add"));&&&&&&&//&取到一个全局标号add,取的同时会把add函数压栈&&&&StackDump(m_plua);&&&&&&&lua_pushnumber(m_plua,m_nLeftNum);&&&&&&&&//&把第一个参数压入栈里&&&&StackDump(m_plua);&&&&lua_pushnumber(m_plua,m_nRightNum);&&&&&&&&//&第二个参数压栈&&&&StackDump(m_plua);&&&&if(lua_pcall(m_plua,2,1,0)!=&0)&&&&&&&&//&执行add函数&&&&{&&&&&&&&AfxMessageBox(_T("调用lua脚本函数失败"));&&&&&&&&&&&&&&&&&&&&return;&&&&}&&&&StackDump(m_plua);&&&&m_nResult&=&(int)lua_tonumber(m_plua,&-1);&&&&&&&&//&函数执行完了,执行结果被压栈,所以取得最顶端的一个数就是结果值,-1就是指取栈顶的值&&&&StackDump(m_plua);&&&&lua_pop(m_plua,1);&&&&&&//&把值从栈里清除,pop(弹出)一个值&&&&StackDump(m_plua);&&&&&UpdateData(FALSE);}
编译环境为:WinXp + sp3, VS C++2005 + sp1,程序运行界面如下:
&&& 相关源码在这里下载:。
参考文献:
&&&&&&&&&&&&&&&&&&&&&&&&主题 : c++如何获取lua脚本里的CClayer指针,并使用
级别: 新手上路
可可豆: 72 CB
威望: 72 点
在线时间: 38(时)
发自: Web Page
来源于&&分类
c++如何获取lua脚本里的CClayer指针,并使用&&&
本帖被 hanrea 执行提前操作()
如题,我试图通过脚本去实现一个CClayer的所有操作,但是获取的指针无法操作,总是报错,不知道怎么获取,这个问题广义上讲是如何从lua脚本获取一个cocos-x接口的指针并在c++里进行使用的问题,不知道怎么调用了,我的代码如下:&&----------------------c++代码------------------------------------------------ & CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();& CCScriptEngineManager::sharedManager()-&setScriptEngine(pEngine);& std::string path = CCFileUtils::sharedFileUtils()-&fullPathForFilename(&testluacyf.lua&);& & lua_State* pL = pEngine-&getLuaStack()-&getLuaState();& CCLayer* p = NULL;& //我要自己获取,所以不用pEngine-&executeScriptFile(&test2.lua&);执行,不知道是否有问题&    luaL_dofile(pL, &test2.lua&);& //layerFarm 是lua脚本里的全局指针& lua_getglobal(pL, &layerFarm&);& p = (CCLayer*)lua_topointer(pL, -1);& //我渴望获取到这个指针并加入到CCScene里& CCScene *scene = CCScene::create();& //addChild就报错了,搞不懂,是不是我这样使用不对?& //CCNode::insertChild()的child-&_setZOrder(z);过不去了& scene-&addChild(p,1, 1);& CCDirector::sharedDirector()-&replaceScene(scene);&&----------------------lua 脚本---------------------------------------------------------& layerFarm = CCLayer:create()&  bg = CCSprite:create(&farm.jpg&)&       && bg:setPosition(origin.x + visibleSize.width / 2 + 80, origin.y + visibleSize.height / 2)& layerFarm:addChild(bg)&&还请高人指点!&
级别: 新手上路
可可豆: 17 CB
威望: 17 点
在线时间: 21(时)
发自: Web Page
lua_topointer(pL, -1)&换成tolua_tousertype(pL,-1,NULL)&试一下
级别: 新手上路
可可豆: 72 CB
威望: 72 点
在线时间: 38(时)
发自: Web Page
回 1楼(samuele3hu) 的帖子
对不起,家里有事,才回公司,改成tolua_tousertype是对的,多谢!
关注本帖(如果有新回复会站内信通知您)
8*2-5 正确答案:11
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版laokaddk 的BLOG
用户名:laokaddk
文章数:983
评论数:89
访问量:1462165
注册日期:
阅读量:4681
阅读量:2872
阅读量:3717
51CTO推荐博文
1307人学习
1726人学习
2624人学习
虽然我们把Lua当作解释型语言,
但是Lua会首先把代码预编译成中间码然后再执行(很多解释型语言都是这么做的)。在解释型语言中存在编译阶段听起来不合适,然而,解释型语言的特征不在于他们是否被编译,而是编译器是语言运行时的一部分,所以,执行编译产生的中间码速度会更快。我们可以说函数dofile的存在就是说明可以将Lua作为一种解释型语言被调用。
前面我们介绍过dofile,把它当作Lua运行代码的chunk的一种原始的操作。dofile实际上是一个辅助的函数。真正完成功能的函数是loadfile;与dofile不同的是loadfile编译代码成中间码并且返回编译后的chunk作为一个函数,而不执行代码;另外loadfile不会抛出错误信息而是返回错误码。我们可以这样定义dofile:
function dofile (filename)
&&& local f = assert(loadfile(filename))
&&& return f()
如果loadfile失败assert会抛出错误。
完成简单的功能dofile比较方便,他读入文件编译并且执行。然而loadfile更加灵活。在发生错误的情况下,loadfile返回nil和错误信息,这样我们就可以自定义错误处理。另外,如果我们运行一个文件多次的话,loadfile只需要编译一次,但可多次运行。dofile却每次都要编译。
loadstring与loadfile相似,只不过它不是从文件里读入chunk,而是从一个串中读入。例如:
f = loadstring(&i = i + 1&)
f将是一个函数,调用时执行i=i+1。
f(); print(i)&&&& --& 1
f(); print(i)&&&& --& 2
loadstring函数功能强大,但使用时需多加小心。确认没有其它简单的解决问题的方法再使用。
Lua把每一个chunk都作为一个匿名函数处理。例如:chunk &a = 1&,loadstring返回与其等价的function () a = 1 end
与其他函数一样,chunks可以定义局部变量也可以返回值:
f = loadstring(&local a = 10; return a + 20&)
print(f())&&&&&&& --& 30
loadfile和loadstring都不会抛出错误,如果发生错误他们将返回nil加上错误信息:
print(loadstring(&i i&))
&&&&&& --& nil&&& [string &i i&]:1: '=' expected near 'i'
另外,loadfile和loadstring都不会有边界效应产生,他们仅仅编译chunk成为自己内部实现的一个匿名函数。通常对他们的误解是他们定义了函数。Lua中的函数定义是发生在运行时的赋值而不是发生在编译时。假如我们有一个文件foo.lua:
-- file `foo.lua'
function foo (x)
&&& print(x)
当我们执行命令f = loadfile(&foo.lua&)后,foo被编译了但还没有被定义,如果要定义他必须运行chunk:
f()&&&&&&&&&& -- defines `foo'
foo(&ok&)&&&& --& ok
如果你想快捷的调用dostring(比如加载并运行),可以这样
loadstring(s)()
调用loadstring返回的结果,然而如果加载的内容存在语法错误的话,loadstring返回nil和错误信息(attempt to call a nil value);为了返回更清楚的错误信息可以使用assert:
assert(loadstring(s))()
通常使用loadstring加载一个字串没什么意义,例如:
f = loadstring(&i = i + 1&)
大概与f = function () i = i + 1 end等价,但是第二段代码速度更快因为它只需要编译一次,第一段代码每次调用loadstring都会重新编译,还有一个重要区别:loadstring编译的时候不关心词法范围:
local i = 0
f = loadstring(&i = i + 1&)
g = function () i = i + 1 end
这个例子中,和想象的一样g使用局部变量i,然而f使用全局变量i;loadstring总是在全局环境中编译他的串。
loadstring通常用于运行程序外部的代码,比如运行用户自定义的代码。注意:loadstring期望一个chunk,即语句。如果想要加载表达式,需要在表达式前加return,那样将返回表达式的值。看例子:
print &enter your expression:&
local l = io.read()
local func = assert(loadstring(&return & .. l))
print(&the value of your expression is & .. func())
loadstring返回的函数和普通函数一样,可以多次被调用:
print &enter function to be plotted (with variable 'x'):&
local l = io.read()
local f = assert(loadstring(&return & .. l))
for i=1,20 do
&&& x = i&& -- global 'x' (to be visible from the chunk)
&&& print(string.rep(&*&, f()))
8.1 require函数
Lua提供高级的require函数来加载运行库。粗略的说require和dofile完成同样的功能但有两点不同:
1.&&&&&& require会搜索目录加载文件
2.&&&&&& require会判断是否文件已经加载避免重复加载同一文件。由于上述特征,require在Lua中是加载库的更好的函数。
require使用的路径和普通我们看到的路径还有些区别,我们一般见到的路径都是一个目录列表。require的路径是一个模式列表,每一个模式指明一种由虚文件名(require的参数)转成实文件名的方法。更明确地说,每一个模式是一个包含可选的问号的文件名。匹配的时候Lua会首先将问号用虚文件名替换,然后看是否有这样的文件存在。如果不存在继续用同样的方法用第二个模式匹配。例如,路径如下:
?;?.c:\windows\?;/usr/local/lua/?/?.lua
调用require &lili&时会试着打开这些文件:
c:\windows\lili
/usr/local/lua/lili/lili.lua
require关注的问题只有分号(模式之间的分隔符)和问号,其他的信息(目录分隔符,文件扩展名)在路径中定义。
为了确定路径,Lua首先检查全局变量LUA_PATH是否为一个字符串,如果是则认为这个串就是路径;否则require检查环境变量LUA_PATH的值,如果两个都失败require使用固定的路径(典型的&?;?.lua&)
require的另一个功能是避免重复加载同一个文件两次。Lua保留一张所有已经加载的文件的列表(使用table保存)。如果一个加载的文件在表中存在require简单的返回;表中保留加载的文件的虚名,而不是实文件名。所以如果你使用不同的虚文件名require同一个文件两次,将会加载两次该文件。比如require &foo&和require &foo.lua&,路径为&?;?.lua&将会加载foo.lua两次。我们也可以通过全局变量_LOADED访问文件名列表,这样我们就可以判断文件是否被加载过;同样我们也可以使用一点小技巧让require加载一个文件两次。比如,require &foo&之后_LOADED[&foo&]将不为nil,我们可以将其赋值为nil,require &foo.lua&将会再次加载该文件。
一个路径中的模式也可以不包含问号而只是一个固定的路径,比如:
?;?./usr/local/default.lua
这种情况下,require没有匹配的时候就会使用这个固定的文件(当然这个固定的路径必须放在模式列表的最后才有意义)。在require运行一个chunk以前,它定义了一个全局变量_REQUIREDNAME用来保存被required的虚文件的文件名。我们可以通过使用这个技巧扩展require的功能。举个极端的例子,我们可以把路径设为&/usr/local/lua/newrequire.lua&,这样以后每次调用require都会运行newrequire.lua,这种情况下可以通过使用_REQUIREDNAME的值去实际加载required的文件。
8.2 C Packages
Lua和C是很容易结合的,使用C为Lua写包。与Lua中写包不同,C包在使用以前必须首先加载并连接,在大多数系统中最容易的实现方式是通过动态连接库机制,然而动态连接库不是ANSI C的一部分,也就是说在标准C中实现动态连接是很困难的。
通常Lua不包含任何不能用标准C实现的机制,动态连接库是一个特例。我们可以将动态连接库机制视为其他机制之母:一旦我们拥有了动态连接机制,我们就可以动态的加载Lua中不存在的机制。所以,在这种特殊情况下,Lua打破了他平台兼容的原则而通过条件编译的方式为一些平台实现了动态连接机制。标准的Lua为windows、Linux、FreeBSD、Solaris和其他一些Unix平台实现了这种机制,扩展其它平台支持这种机制也是不难的。在Lua提示符下运行print(loadlib())看返回的结果,如果显示bad arguments则说明你的发布版支持动态连接机制,否则说明动态连接机制不支持或者没有安装。
Lua在一个叫loadlib的函数内提供了所有的动态连接的功能。这个函数有两个参数:库的绝对路径和初始化函数。所以典型的调用的例子如下:
local path = &/usr/local/lua/lib/libluasocket.so&
local f = loadlib(path, &luaopen_socket&)
loadlib函数加载指定的库并且连接到Lua,然而它并不打开库(也就是说没有调用初始化函数),反之他返回初始化函数作为Lua的一个函数,这样我们就可以直接在Lua中调用他。如果加载动态库或者查找初始化函数时出错,loadlib将返回nil和错误信息。我们可以修改前面一段代码,使其检测错误然后调用初始化函数:
local path = &/usr/local/lua/lib/libluasocket.so&
-- or path = &C:\\windows\\luasocket.dll&
local f = assert(loadlib(path, &luaopen_socket&))
f() -- actually open the library
一般情况下我们期望二进制的发布库包含一个与前面代码段相似的stub文件,安装二进制库的时候可以随便放在某个目录,只需要修改stub文件对应二进制库的实际路径即可。将stub文件所在的目录加入到LUA_PATH,这样设定后就可以使用require函数加载C库了。
Errare humanum est(拉丁谚语:犯错是人的本性)。所以我们要尽可能的防止错误的发生,Lua经常作为扩展语言嵌入在别的应用中,所以不能当错误发生时简单的崩溃或者退出。相反,当错误发生时Lua结束当前的chunk并返回到应用中。
当Lua遇到不期望的情况时就会抛出错误,比如:两个非数字进行相加;调用一个非函数的变量;访问表中不存在的值等(可以通过metatables修改这种行为,后面介绍)。你也可以通过调用error函数显式地抛出错误,error的参数是要抛出的错误信息。
print &enter a number:&
n = io.read(&*number&)
if not n then error(&invalid input&) end
Lua提供了专门的内置函数assert来完成上面类似的功能:
print &enter a number:&
n = assert(io.read(&*number&), &invalid input&)
assert首先检查第一个参数,若没问题,assert不做任何事情;否则,assert以第二个参数作为错误信息抛出。第二个参数是可选的。注意,assert会首先处理两个参数,然后才调用函数,所以下面代码,无论n是否为数字,字符串连接操作总会执行:
n = io.read()
assert(tonumber(n), &invalid input: & .. n .. & is not a number&)
当函数遇到异常有两个基本的动作:返回错误代码或者抛出错误。选择哪一种方式,没有固定的规则,不过基本的原则是:对于程序逻辑上能够避免的异常,以抛出错误的方式处理之,否则返回错误代码。
例如sin函数,假定我们让sin碰到错误时返回错误代码,则使用sin的代码可能变为:
local res = math.sin(x)
if not res then&&&&& -- error
当然,我们也可以在调用sin前检查x是否为数字:
if not tonumber(x) then&&&& -- error: x is not a number
而事实上,我们既不是检查参数也不是检查返回结果,因为参数错误可能意味着我们的程序某个地方存在问题,这种情况下,处理异常最简单最实际的方式是抛出错误并且终止代码的运行。
再来看一个例子。io.open函数用于打开文件,如果文件不存在,结果会如何?很多系统中,我们通过&试着去打开文件&来判断文件是否存在。所以如果io.open不能打开文件(由于文件不存在或者没有权限),函数返回nil和错误信息。依据这种方式,我们可以通过与用户交互(比如:是否要打开另一个文件)合理地处理问题:
local file, msg
&&& print &enter a file name:&
&&& local name = io.read()
&&& if not name then return end&&&& -- no input
&&& file, msg = io.open(name, &r&)
&&& if not file then print(msg) end
until file
如果你想偷懒不想处理这些情况,又想代码安全的运行,可以使用assert:
file = assert(io.open(name, &r&))
Lua中有一个习惯:如果io.open失败,assert将抛出错误。
file = assert(io.open(&no-file&, &r&))
&&&&&& --& stdin:1: no-file: No such file or directory
注意:io.open返回的第二个结果(错误信息)会作为assert的第二个参数。
8.4 异常和错误处理
很多应用中,不需要在Lua进行错误处理,一般有应用来完成。通常应用要求Lua运行一段chunk,如果发生异常,应用根据Lua返回的错误代码进行处理。在控制台模式下的Lua解释器如果遇到异常,打印出错误然后继续显示提示符等待下一个命令。
如果在Lua中需要处理错误,需要使用pcall函数封装你的代码。
假定你想运行一段Lua代码,这段代码运行过程中可以捕捉所有的异常和错误。
第一步:将这段代码封装在一个函数内
function foo ()
&&& if unexpected_condition then error() end
&&& print(a[i])&& -- potential error: `a' may not be a table
第二步:使用pcall调用这个函数
if pcall(foo) then
&&& -- no errors while running `foo'
&&& -- `foo' raised an error: take appropriate actions
当然也可以用匿名函数的方式调用pcall:
if pcall(function () ... end) then ...
pcall在保护模式(protected mode)下执行函数内容,同时捕获所有的异常和错误。若一切正常,pcall返回true以及&被执行函数&的返回值;否则返回nil和错误信息。
错误信息不一定仅为字符串(下面的例子是一个table),传递给error的任何信息都会被pcall返回:
local status, err = pcall(function () error({code=121}) end)
print(err.code) --& 121
这种机制提供了强大的能力,足以应付Lua中的各种异常和错误情况。我们通过error抛出异常,然后通过pcall捕获之。
8.5 错误信息和回跟踪(Tracebacks)
虽然你可以使用任何类型的值作为错误信息,通常情况下,我们使用字符串来描述遇到的错误。如果遇到内部错误(比如对一个非table的值使用索引下标访问)Lua将自己产生错误信息,否则Lua使用传递给error函数的参数作为错误信息。不管在什么情况下,Lua都尽可能清楚的描述问题发生的缘由。
local status, err = pcall(function () a = 'a'+1 end)
print(err)
--& stdin:1: attempt to perform arithmetic on a string value
local status, err = pcall(function () error(&my error&) end)
print(err)
--& stdin:1: my error
例子中错误信息给出了文件名(stdin)与行号。
函数error还可以有第二个参数,表示错误发生的层级。比如,你写了一个函数用来检查&error是否被正确调用&:
function foo (str)
&&& if type(str) ~= &string& then
&&&&&& error(&string expected&)
可有人这样调用此函数:
foo({x=1})
Lua会指出发生错误的是foo而不是error,实际上,错误是调用error时产生的。为了纠正这个问题,修改前面的代码让error报告错误发生在第二级(你自己的函数是第一级)如下:
function foo (str)
&&& if type(str) ~= &string& then
&&&&&& error(&string expected&, 2)
当错误发生的时候,我们常常希望了解详细的信息,而不仅是错误发生的位置。若能了解到&错误发生时的栈信息&就好了,但pcall返回错误信息时,已经释放了保存错误发生情况的栈信息。因此,若想得到tracebacks,我们必须在pcall返回以前获取。Lua提供了xpcall来实现这个功能,xpcall接受两个参数:调用函数、错误处理函数。当错误发生时,Lua会在栈释放以前调用错误处理函数,因此可以使用debug库收集错误相关信息。有两个常用的debug处理函数:debug.debug和debug.traceback,前者给出Lua的提示符,你可以自己动手察看错误发生时的情况;后者通过traceback创建更多的错误信息,也是控制台解释器用来构建错误信息的函数。你可以在任何时候调用debug.traceback获取当前运行的traceback信息:
print(debug.traceback())
了这篇文章
类别:┆阅读(0)┆评论(0)Lua怎么和字符串指针兼容_百度知道
Lua怎么和字符串指针兼容
提问者采纳
扩展Lua的基本方法之一就是为应用程序注册新的C函数到Lua中去。
当我们提到Lua可以调用C函数,不是指Lua可以调用任何类型的C函数(有一些包可以让Lua调用任意的C函数,但缺乏便捷和健壮性)。正如我们前面所看到的,当C调用Lua函数的时候,必须遵循一些简单的协议来传递参数和获取返回结果。相似的,从旦户测鞠爻角诧携超毛Lua中调用C函数,也必须遵循一些协议来传递参数和获得返回结果。另外,从Lua调用C函数我们必须注册函数,也就是说,我们必须把C函数的地址以一个适当的方式传递给Lua解释器。
当Lua调用C函数的时候,使用和C调用Lua相同类型的栈来交互。C函数从栈中获取她的参数,调用结束后将返回结果放到栈中。为了区分返回结果和栈中的其他的值,每个C函数还会返回结果的个数(the function returns (in C) the number of results it is leaving on the stack.)。这儿有一个重要的概念:用来交互的栈不是全局变量,每一个函数都有他自己的私有栈。当Lua调用C函数的时候,第一个参数总是在这个私有栈的index=1的位置。甚至当一个C函数调用Lua代码(Lua代码调用同一个C函数或者其他的C函数),每一个C函数都有自己的独立的私有栈,并且第一个参数在index=1的位置。
26.1 C 函数
static int l_sin (lua_State *L) {
double d = lua_tonumber(L, 1); /* get argument */
lua_pushnumber(L, sin(d)); /* push result */
return 1; /* number of results */}任何在Lua中注册的函数必须有同样的原型,这个原型声明定义就是lua.h中的lua_CFunction:
typedef int (*lua_CFunction) (lua_State *L);
从C的角度来看,一个C函数接受单一的参数Lua state,返回一个表示返回值个数的数字。所以,函数在将返回值入栈之前不需要清理栈,函数返回之后,Lua自动的清除栈中返回结果下面的所有内容。
我们要想在Lua使用这个函数,还必须首先注册这个函数。我们使用lua_pushcfunction来完成这个任务:他获取指向C函数的指针,并在Lua中创建一个function类型的值来表示这个函数。一个quick-and-dirty的解决方案是将这段代码直接放到lua.c文件中,并在调用lua_open后面适当的位置加上下面两行:
lua_pushcfunction(l, l_sin);
lua_setglobal(l, &mysin&);
第一行将类型为function的值入栈,第二行将function赋值给全局变量mysin。这样修改之后,重新编译Lua,你就可以在你的Lua程序中使用新的mysin函数了。在下面一节,我们将讨论以比较好的方法将新的C函数添加到Lua中去。
对于稍微专业点的sin函数,我们必须检查sin的参数的类型。有一个辅助库中的luaL_checknumber函数可以检查给定的参数是否为数字:当有错误发生的时候,将抛出一个错误信息;否则返回作为参数的那个数字。将上面我们的函数稍作修改:
其他类似问题
lua的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁后使用快捷导航没有帐号?
新浪微博:
&&&&腾讯微博:
只需一步,快速开始
查看: 1492|回复: 2
UID635453精华1在线时间246 小时阅读权限55鲜花75 个铜币42 个银币33 个金币0 个积分593帖子注册时间最后登录
高中二年级, 积分 593, 距离下一级还需 57 积分
鲜花75 个铜币42 个银币33 个积分593帖子
【出售源码】按键版本天龙LUA挂全套源码工具技术转让
什么是LUA:
很多游戏开发时使用的一个嵌入式脚本语言如(天龙),通过解密可以获取这些脚本文件源代码,可以直接读开发者逻辑,调用这些文件,也可以自己写文件来实现挂的自动功能
LUA都能做什么:
读取人物任意数据,读取队友,珍兽,怪物信息。任务信息等等90%以上的信息。可以实现组队,打怪,答题,任务等90%以上的操作。你可以跟看按键脚本一样看这些LUA脚本,里面还有游戏程序猿写的注释,分析数据非常简单。
LUA开发的**有哪些
天龙最著名的莫愁,大脚,扫地**全都是调用游戏LUA实现,稳定效率,功能全面,开发迅速,更新简单。
我的源码有什么:
打怪,采集,种植,打图,孩子任务,挖图,许愿等任务按键精灵源码和配套工具。
LUA挂的优势:
开发速度快,通过分析游戏的脚本文件轻松掌握所需要信息,分析程序猿逻辑实现自己功能,更稳定更放心。更新简单,游戏LUA脚本基本不会更新,所以你所需要更新的只有几个基址而已。
天龙挂的几个技术层次:
按照先进程度分为:LUA挂,内存挂,图色挂。LUA挂是现在天龙**最先进的技术。懂的按键调用的屈指可数,我有全套的插件稳定调用,有全套**源码,稍作修改即可稳定使用,也可以修改成你自己的挂。
你所应该具备的条件
有钱,最好你是在卖脚本的希望升级你的脚本,因为我这套技术和源码很全,是市面挂最先进的技术,价格不菲。熟悉按键语法,因为我这套是按键环境下写的。不需要懂内存,找数据等相关知识,因为用到的数据不超过10个,我提供给你全套的工具,告诉你更新原理,工具已经写好基本一键更新。我会教会你我写的,让你理解并会自己开发新功能。
我为什么要卖:
卖挂有风险,前段时间冰冷落网,我不想冒险了。竞争太激烈,基本成品了不敢拿出去卖了。现在卖源码和技术。
小白玩家和单纯学习的朋友请不要加,全套源码不会白菜价出售给你学习。扯淡勿扰。
有兴趣的朋友,请联系我:QQ:&&注明天龙LUA
UID2503874精华0在线时间0 小时阅读权限20鲜花0 个铜币16 个银币0 个金币0 个积分35帖子注册时间最后登录
小学二年级, 积分 35, 距离下一级还需 15 积分
鲜花0 个铜币16 个银币0 个积分35帖子
UID2521382精华0在线时间0 小时阅读权限20鲜花0 个铜币123 个银币155 个金币0 个积分92帖子注册时间最后登录
小学五年级, 积分 92, 距离下一级还需 18 积分
鲜花0 个铜币123 个银币155 个积分92帖子
大傻逼,卖这个的每一个好东西
按键会员(季)
按键会员绑定账号后自动赠送
按键精灵开发者6级
可通过提升认证等级来升级勋章:
十周年勋章(360天)
十周年纪念勋章
按键精灵开发者4级
可通过提升认证等级来升级勋章:
按键精灵论坛推荐 /2
一年又一年,辞旧迎新。在岁末年初之际,商业小精灵邀请你在羊年伊始任性一把!公司没有年终奖?没关系!公司年终福利少?没关系! 02月5号~02月10号商业小精灵羊年给你送来大福利!商业小精灵为了安全,更为了福利!此时不任性,更待何时?
拳皇脚本大赛火热进行中,没参赛的同学也有大奖!大家可以每天领取100水晶,然后选择心仪的参赛者进行押注。全部比赛结束后,拥有水晶最多的同学可获得价值228元的雷蛇键鼠套装及竞猜之王专属荣誉勋章哦!
Powered by

我要回帖

更多关于 lua调用java 的文章

 

随机推荐