踏入神的领域

kun1234567的专栏

用户操作
[即时聊天] [发私信] [加为好友]
kun(小龙)ID:kun1234567
309017次访问,排名199,好友5人,关注者21人。
了解DX.熟悉ALLEGRO.熟悉Lua.熟悉CEGUI.了解PhysX
kun1234567的文章
原创 43 篇
翻译 2 篇
转载 3 篇
评论 55 篇
最近评论
parkyangster:谢谢小龙大哥,从你这里学了很多东西。
这个函数应该写到CEGUI::System里面去吧。这样也可以输入中文
zizzx87lsj:我想问下,我的.lua文件在打开方式中不小心用了记事本打开,之后改不回来,因为我找不到.lua程序,打开方式里也没有,怎么办,谢谢指教
Learning_C:“1、添加除了“luac.c”以外的全部文件到工程”

添加“什么的”除了“luac.c”以外的全部文件到工程”

“注意:该文件生成时的名字为lua.exe,因为该项目名称为“lua”。如果之前生成过解释器lua.exe,则应该将解释器移走之后再生成。”

“如果之前生成过”是哪里之前啊,为什么移走啊

Learning_C:"3、根据生成的文件来添加需要编译的文件"

根据“什么”“生产的文件”添加到什么“需要编译的文件”
添加是“怎么”添加

“1、添加除了“lua.c”与“luac.c”以外的全部文件到工程”

添加“什么的”除了“lua.c”与“luac.c”以外的全部文件到工程的哪里?是工程的根目录吗还是工程的某个目录
zhangyilan:花些时间解决配置导出的问题吧。这个长远来看是值得的,与策划的这些沟通是需要成本的。游戏的协作有的时候是需要程序提供更多的支持的。
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Lua学习笔记二--在Lua中使用自己的C函数收藏

    新一篇: Lua学习笔记三--表的应用 | 旧一篇: Lua学习笔记一

     我不知道CSDN把笔记二弄哪去了,这是第2次写的东西。

    Lua学习笔记二
    在Lua中使用自己的C函数

     


     

    OK,上次我们掌握了如何在Lua脚本中编写一个函数,并在C文件中接应它。
    现在让我们来学习另外一种交互方式。

    本节的目的:在Lua脚本中调用自己写的函数。侧重点为自己编写可以被Lua脚本使用的C函数的规则。

     


     啥都不说了,RTFS

     

    -------以下是Lua脚本--------
    --test.lua
    LuaC_MessageBox( "Last is ShowMessage! This is real MessageBox!");
    ---------通过LuaEdit语法测试才出鬼了--------------

    //------------以下是test.cpp文件----------------
    //================================================================================================================
    //           Lua Test Object
    //           C++ Source lua_test.cpp
    //================================================================================================================
    //================================================================================================================
    //           Include Files
    //================================================================================================================
    extern "C"
    {
     #include "D:\\My Documents\\Visual Studio 2005\\Projects\\lua\\lua\\lua.h"
     #include "D:\\My Documents\\Visual Studio 2005\\Projects\\lua\\lua\\lualib.h"
     #include "D:\\My Documents\\Visual Studio 2005\\Projects\\lua\\lua\\lauxlib.h"
    }

    #include <windows.h>
    #include <stdio.h>
    #include <string>
    using namespace std;
    //================================================================================================================
    //           Libraries
    //================================================================================================================
    #pragma comment( lib ,"D:\\My Documents\\Visual Studio 2005\\Projects\\lua\\release\\lua.lib")
    //================================================================================================================
    //           Global Variables
    //================================================================================================================
    lua_State *L;
    //================================================================================================================
    //           Lua Functions
    //================================================================================================================
    double f( double x, double y )
    {
     double ret;
     lua_getglobal( L, "f");
     lua_pushnumber( L,x);
     lua_pushnumber( L,y);
     lua_call( L, 2, 1);
     //lua_pcall( L, 2, 1, 0);

     ret = lua_tonumber( L, -1);
     //lua_pop( L, 1);
     return ret;
    }
    //================================================================================================================
    //           C/C++ Functions
    //================================================================================================================
    int LuaC_MessageBox( lua_State *L)
    {
     char Message[256] = "";
     int i;

     // 获取参数个数
     int n = lua_gettop(L);

     // 保存全部参数
     for ( i = 1, j = 0; i <= n ; i++)
     {
      if( lua_isstring( L, i))
       strcpy( Message, lua_tostring( L, i));
     }

     // 执行逻辑
     MessageBox( NULL, Message, "Lua Test", MB_OK );

     // 返回值压栈

     // 返回压栈参数的个数
     return 0;
    }
    //================================================================================================================
    //           Main Functions
    //================================================================================================================
    int main( void)
    {
     int error;

     L = lua_open();
     luaopen_base(L);
     luaL_openlibs(L);

      // 注册C/C++函数
      lua_register( L, "LuaC_MessageBox", LuaC_MessageBox);



    // load the script 
    // 加入了错误处理
     if ( (error = luaL_dofile(L, "test.lua")) != 0)
     {
      MessageBox( NULL, "出错啦:执行脚本出错!", "Lua Test", MB_OK );
      return 0;
     }

     
     getchar();
     lua_close( L);
     return 1;
    }

     


     

    额....这就是系列文章的好处:即使CSDN把原来的弄丢了,我也可以根据上下文来重写丢失的文章。

    如你所见,我将关键点全部标记为粗体。并且给出了足够的注释。让我们来一条条梳理:

    1、LuaC_MessageBox( "Last is ShowMessage! This is real MessageBox!");
    这就是Lua脚本调用自己写的函数。让我们接着看如何实现这个函数的。

    2、int LuaC_MessageBox( lua_State *L)
    这个就是函数的实体了,要想使自己的函数被Lua脚本所用,必须遵守以下规则:
            使用 int 函数名( lua_State *L) 的形式来声明和定义函数。
            使用Lua的堆栈来进行参数交换。
            调用Lua的注册函数。

    3、关于第2个规则,Lua是按照  __fastcall 的规则传递参数的,也就是从左到右一个个传。
    Lua压栈的顺序是:首先将函数压栈,然后将参数压栈。执行完毕后,将参数和函数都出栈,然后将返回值按顺序压栈。当然,还有很多类似的参数交换规则,不过别急我们慢慢来。

    4、retrun 0;
    在C函数中的返回值 指的是返回值的数量。因为Lua脚本是支持多个返回值的,结合上条和这条规则来实现。

    5、C文件中的函数体编写完了,还需要将该函数进行注册,如:
    lua_register( L, "LuaC_MessageBox", LuaC_MessageBox);
    第二个参数为Lua脚本中的函数名,第三个为C文件中的函数名。

    6、还有什么是我没涉及到的?返回值压栈!但是我想暂时不谈这个问题,因为我将(已经)在笔记四中详细讨论。所以,先熟悉这个基本流程。

    7、OK。重写的好处在于:我可以直接把笔记四的东西搬过来。哈哈,又一次时间旅行。
    Lua中有很多把各类返回值压栈的函数,只要你在Lua参考手册中搜索“lua_push”,你可以得到如下结果:
    lua_pushboolean
    lua_pushinteger
    lua_pushfstring
    lua_pushlstring
    lua_pushnil
    lua_pushnumber
    .....
    有很多这样的函数,解释可以参看参考手册(一定要看!)。
    但是在这个例子中,我们没有返回值,所以retrun 0。

    发表于 @ 2007年12月28日 09:48:00|评论(loading...)|编辑

    新一篇: Lua学习笔记三--表的应用 | 旧一篇: Lua学习笔记一

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © kun(小龙)