游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9860|回复: 8

在DELPHI中使用LUA,并且支持面向对象!

[复制链接]

16

主题

160

帖子

176

积分

注册会员

Rank: 2

积分
176
QQ
发表于 2005-12-7 21:20:00 | 显示全部楼层 |阅读模式
内容如标题,嘿嘿。 [em5]

sf_200512721206.rar

145.66 KB, 下载次数:

16

主题

160

帖子

176

积分

注册会员

Rank: 2

积分
176
QQ
 楼主| 发表于 2005-12-7 21:26:00 | 显示全部楼层

Re:在DELPHI中使用LUA,并且支持面向对象!

// luaoop.pas 注解
uses
  SysUtils, Lua, LuaPlus;

{$apptype console}

const
// 每个单独的类,都必须有个不同的TAG标志用来区分
  ZIP_TAG = 1000;

type
// 一个简单的类,只返回字符串参数而已
  TZip = class
  public
    function GetId: Integer;
    constructor Create(const filename: String);
  private
    m_filename: String;
  published
    property filename: String read m_filename;
  end;
// 创建
constructor TZip.Create(const filename: String);
begin
  m_filename := filename;
end;
// 暂时没有用到
function TZip.GetId: Integer;
begin
  Result := 0;
end;
// 通过ZIP_TAG判断LUA调用是否为TZip类
procedure _isArgZip(LS: p_lua_State; arg: Integer; const method: PChar);
begin
  if not _isChild(LS,arg,ZIP_TAG) then
    _argError(LS,arg,'Zip',method);
end;
// 用来创建LUA中用的ZIP类(也就是TABLE)
function Zip(LS: p_lua_State): Integer; cdecl;
var
  filename: PChar;
  zipFile: TZip;
  msg: string;
begin
  if(typeCheck)  then
  begin
    _hasArgs(LS,1,'Zip');
    _isArgString(LS,1,'Zip'); // zipFileName
  end;
  fileName := lua_tostring(LS,1);
  try
    zipFile := TZip.Create(filename);
    _createInstance(LS,ZIP_TAG,zipFile);
  except
    on e: Exception do
    begin
      msg := format('''Zip'' error: %s', [e.Message]);
      lua_pushstring(LS, pchar(msg));
      lua_error(LS);
    end;
  end;
  result := 1;
end;
// LUA中用来删除ZIP类的函数
function ZipDelete(LS: p_lua_State): Integer; cdecl;
var
  zipFile: TZip;
begin
  if(typeCheck) then
  begin
    _hasArgs(LS,1,'ZipDelete');
    _isArgZip(LS,1,'ZipDelete'); // self
  end;
  zipFile := TZip(_getSelfInstance(LS));
  zipFile.Destroy;
  _deleteSelfInstance(LS);
  result := 0;
end;
// LUA中用来调用TZip.filename
function ZipGetZippedFileName(LS: p_lua_State): Integer; cdecl;
var
  zipFile: TZip;
begin
  if(typeCheck) then
  begin
    _hasArgs(LS,1,'ZipGetZippedFileName');
    _isArgZip(LS,1,'ZipGetZippedFileName'); // self
  end;
  zipFile := TZip(_getSelfInstance(LS));
  lua_pushstring(LS, PChar(zipFile.filename));
  result := 1;
end;
// 为LUA中的Zip添加方法
procedure _addZipMethods(LS: p_lua_State);
begin
  _addMethod(LS,'getZippedFileName',ZipGetZippedFileName);
  _addMethod(LS,'delete',ZipDelete);
end;

{
var
  lua_engnlib : array[0..1] of luaL_reg = (
    (name:'Zip';func:Zip),
    (name:nil;func:nil)
  );
}

var
  LS: p_lua_State;
  cmd: String;

begin
  LS := lua_open();
  luaopen_base(LS);
  luaopen_table(LS);
  luaopen_io(LS);
  luaopen_string(LS);
  luaopen_math(LS);
  luaopen_debug(LS);

//  luaL_openlib(LS, nil,@lua_engnlib,0);
// 注册创建ZIP对象的LUA函数
  lua_register(LS,'Zip',Zip);
// 设置全局表
  lua_pushliteral(LS,'_G');
  lua_pushvalue(LS,LUA_GLOBALSINDEX);
  // Class
  lua_newtable(LS);
  lua_setglobal(LS,'_CLASS');
// 注册LUA中用的Zip类
  _setupClass(LS,'Zip',ZIP_TAG,_addZipMethods,ZipDelete);
// 运行 LuaOOP.lua 脚本
  lua_dofile(LS, 'LuaOOP.lua');
// 以下为直接运行LUA脚本
  lua_dostring(LS,'zips = Zip("abc")');
  lua_dostring(LS,'print(zips:getZippedFileName())');
  lua_dostring(LS,'if zips then zips:delete(); zips = nil end');
  lua_dostring(LS,'print(zips)');
// 处理命令行输入的脚本
  while true do
  begin
    readln(cmd);
    if cmd = 'quit' then break;
    lua_dostring(LS, PChar(cmd));
  end;
// 关闭LUA
  lua_close(LS);
end.

16

主题

160

帖子

176

积分

注册会员

Rank: 2

积分
176
QQ
 楼主| 发表于 2005-12-7 21:27:00 | 显示全部楼层

Re:在DELPHI中使用LUA,并且支持面向对象!

-- luaopp.lua 的文件内容:
objs = {}

for i = 0,9 do
  -- 创建对象
  objs = Zip('对象 ' .. i)
  -- 打印对象方法返回的字符串
  print(objs:getZippedFileName())
  -- 删除对象
  objs:delete()
  -- 别忘了设置为空
  objs = nil
end

0

主题

9

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2006-3-18 11:02:00 | 显示全部楼层

Re:在DELPHI中使用LUA,并且支持面向对象!

看不懂,请教能不能在你的文件中给出具体的实现原理,以便学习,谢谢。

13

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2006-5-5 18:11:00 | 显示全部楼层

Re:在DELPHI中使用LUA,并且支持面向对象!

楼主~~好人呐~~~感动ING.....


问一下`~~我在主机定义了一个函数MOVE成功在 LUA 中注册
也可以在 LUA脚本中正确的调用~~~
    但是我这个函数本身需要一定时间来完成~~
比如我在脚本中使用
move(100,200)
print('到达目标')

move(100,200)    ->主机下移动命令,角色开始移动 但是移动到目标需要一定的时间
但是现在的情况是 主机刚刚下了移动命令,脚本就执行下一个命令了~~如何能让脚本在 MOVE 到达目标后 再继续执行呢?

13

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2006-5-5 18:12:00 | 显示全部楼层

Re:在DELPHI中使用LUA,并且支持面向对象!

说明:主机是知道角色的位置的 [em2] [em2] [em2] [em2]

13

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2006-5-6 08:27:00 | 显示全部楼层

Re:在DELPHI中使用LUA,并且支持面向对象!

已经搞定`~ 在线程里面执行~~在函数里加 循环检测~~~使用 SLEEP

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-7-9 19:22:00 | 显示全部楼层

求教!!!

我有个代码在lua.exe里头可以通过odbc读出数据库里的字段.
但我把它做成函数,让delphi调用,想取得lua代码读出数据库的那个字段,,但就马上退出来.
是不是delphi要调用其它库才能支持读odbc数据库呢?.

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-7-9 19:23:00 | 显示全部楼层

请教如何把delphi中的动态数组传给lua

请教如何把delphi中的动态数组传给lua

知道的请回复.
也可发至邮箱:cocoanny999@163.com
qq: 85055315
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 21:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表