首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
 您现在的位置: 中国IT实验室 >> 游戏开发 >> 游戏开发文档 >> 正文
通过例子学习Lua(6) -- C/C++中用Lua函数
来源:ChinaItLab 作者: 时间:2005-4-8


  1.简介
  偶们这次主要说说怎么由Lua定义函数, 然后在C或者C++中调用. 这里偶们
  暂不涉及C++的对象问题, 只讨论调用函数的参数, 返回值和全局变量的使用.
  
  2.程序
  这里偶们在e12.lua里先定义一个简单的add(), x,y为加法的两个参数,
  return 直接返回相加后的结果.
  
  例e12.lua
  -- add two numbers
  function add ( x, y )
  return x + y
  end
  
  在前一次里, 偶们说到 lua_dofile() 可以直接在C中执行lua文件. 因为偶们
  这个程序里只定义了一个add()函数, 所以程序执行后并不直接结果, 效果相当
  于在C中定义了一个函数一样.
  
  Lua的函数可以有多个参数, 也可以有多个返回值, 这都是由栈(stack)实现的.
  需要调用一个函数时, 就把这个函数压入栈, 然后顺序压入所有参数, 然后用
  lua_call()调用这个函数. 函数返回后, 返回值也是存放在栈中. 这个过程和
  汇编执行函数调用的过程是一样的.
  
  例e13.cpp 是一个调用上面的Lua函数的例子
  #include
  
  extern "C" { // 这是个C++程序, 所以要extern "C",
     // 因为lua的头文件都是C格式的
  #include "lua.h"
  #include "lualib.h"
  #include "lauxlib.h"
  }
  
  /* the Lua interpreter */
  lua_State* L;
  
  int luaadd ( int x, int y )
  {
  int sum;
  
  /* the function name */
  lua_getglobal(L, "add");
  
  /* the first argument */
  lua_pushnumber(L, x);
  
  /* the second argument */
  lua_pushnumber(L, y);
  
  /* call the function with 2
    arguments, return 1 result */
  lua_call(L, 2, 1);
  
  /* get the result */
  sum = (int)lua_tonumber(L, -1);
  lua_pop(L, 1);
  
  return sum;
  }
  
  int main ( int argc, char *argv[] )
  {
  int sum;
  
  /* initialize Lua */
  L = lua_open();
  
  /* load Lua base libraries */
  lua_baselibopen(L);
  
  /* load the script */
  lua_dofile(L, "e12.lua");
  
  /* call the add function */
  sum = luaadd( 10, 15 );
  
  /* print the result */
  printf( "The sum is %d\n", sum );
  
  /* cleanup Lua */
  lua_close(L);
  
  return 0;
  }
  
  程序说明:
  main中过程偶们上次已经说过了, 所以这次只说说luaadd的过程
  * 首先用lua_getglobal()把add函数压栈
  * 然后用lua_pushnumber()依次把x,y压栈
  * 然后调用lua_call(), 并且告诉程序偶们有两个参数一个返回值
  * 接着偶们从栈顶取回返回值, 用lua_tonumber()
  * 最后偶们用lua_pop()把返回值清掉
  
  运行结果:
  The sum is 25
  
  编译方法
  Linux下把程序存成e13.cpp
  g++ e13.cpp -llua -llualib -o e13
  ./e13
  
  VC下编译方法
  * 首先建立一个空的Win32 Console Application Project
  * 把e13.cpp加入工程中
  * 点project setting,然后设置link选项, 再加上lua.lib lualib.lib两个额外的库
  * 最后编译
  
  建立好的project可以在这里下载
  VC http://tonyandpaige.com/tutorials/luaadd.zip
  Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz
  
  3.全局变量
  上面偶们用到了lua_getglobal()但并没有详细讲, 这里偶们再举两个小例子来说下全局变量
  lua_getglobal()的作用就是把lua中全局变量的值压入栈
  lua_getglobal(L, "z");
  z = (int)lua_tonumber(L, 1);
  lua_pop(L, 1);
  假设Lua程序中定义了一个全局变量z, 这段小程序就是把z的值取出放入C的变量z中.
  
  另外Lua中还有一个对应的函数lua_setglobal(), 作用是用栈顶的值填充指定的全局变量
  lua_pushnumber(L, 10);
  lua_setglobal(L, "z");
  例如这段小程序就是把lua中的全局变量z设为10, 如果lua中未定义z的话, 就会自动创建一个
  全局变量z并设为10.
  
  4.试试看
  自己写个函数用C/C++来调用下试试
  
【责编:admin】

中国IT教育热线咨询

相关文章
dx8中关于用索引缓冲渲染索引图元
作为一个状态机的OpenGL
OGRE中的四元数与旋转
[RGSS]Sprite类方法教学
[RGSS]去掉“战斗|逃跑”选项
推荐文章

 精彩友情推荐
·Asp源码 PHP源码
·CGI源码 JSP源码
·建站书籍教程
·服务器软件 .net源码
·建站工具软件
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
 基础入门  开发文档
 最新推荐
  多数的Windows程序都需要Windows.h和Windowsx.h这两个头文件,要确保使用它们。当然,你还需要其它......
游戏引擎演化史
在Windows上安装OGRE的方法
关于滤镜遮罩概念,Sobel 遮罩
游戏开发新手入门之Windows编程
游戏开发新手入门之位图化图形
教你实现卡通渲染的另类勾边方法
游戏设计大师谈如何成为一名游戏设
Visual C#编写 3D游戏框架示例
真正的 Java 学习从入门到精通
游戏开发经验——游戏开发的基本常
  为什么要研究攻击行为在人类有记载的5600年的历史中,共计发生了14,400次战争;今天,平均一天要发生............
游戏开发中显示对话的特殊句法
游戏原型设计的介绍
网络游戏中的攻击行为
谈动作类游戏的必要条件
规则的多元分析模式
载入位图文件到DirectDraw
Archer Game Suite 是什么?
浅谈游戏企划-新手入门篇
暴雪称霸游戏业界的六大秘密绝招
骨骼动画及示例Skinned Mesh的解析
  培训中心