游戏开发论坛

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

如何在游戏中使用LUA的脚本

[复制链接]

37

主题

171

帖子

177

积分

注册会员

Rank: 2

积分
177
发表于 2006-7-1 20:04:00 | 显示全部楼层 |阅读模式
如何在VB.NET+DX9编写的游戏中,使用LUA的脚本呢?是不是需要一个支持.NET的LUA的插件呢?
我其实是需要在程序中使用一个脚本语言来从外部控制程序的执行。我听说现在都使用LUA语言来做脚本。所以想尝试一下,但又不知道从何入手。
希望大家给我一些帮助。

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-7-2 06:14:00 | 显示全部楼层

Re:如何在游戏中使用LUA的脚本

有lua.net供下载,具体地址你到google去查一下就能看到。
另外,既然你用.net,其实你可以直接动态编译vb.net或者c#文件当作脚本,这样你可以更直接的控制脚本,如果楼主需要vb.net动态编译读取脚本的源码,我可以提供

37

主题

171

帖子

177

积分

注册会员

Rank: 2

积分
177
 楼主| 发表于 2006-7-2 08:57:00 | 显示全部楼层

Re:如何在游戏中使用LUA的脚本

如果有的话我当然想学习一下.多谢了.
我开始想用LUA其实也是想学习一下,主要感觉LUA比较通用.

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-7-2 21:16:00 | 显示全部楼层

Re:如何在游戏中使用LUA的脚本

主要代码就是下面这个部分:
#Region "脚本对象基类"
    Public MustInherit Class ScriptObject
        Public Sub New()

        End Sub
        Public Function GetClass(ByVal ClassName As String, ByVal asm As Reflection.Assembly) As Type
            Dim aa() As Reflection.Module
            'aa = asm.EntryPoint()
            aa = asm.GetLoadedModules()
            Return aa(0).GetType(ClassName)
        End Function
        Public Function LoadFunction(ByVal AsmType As Type, ByVal FunctionName As String, ByVal FunctionType As Type) As System.Delegate
            Dim bb As Reflection.MethodInfo
            bb = AsmType.GetMethod(FunctionName, BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static)
            Return System.Delegate.CreateDelegate(FunctionType, bb)
        End Function
    End Class
#End Region

    Public Class Script
        'Private AsmPlayer As Reflection.Assembly
        Public Shared Function LoadScript(ByVal Path As String) As [Assembly]
            Dim vbp As CodeDom.Compiler.CodeDomProvider
            'Dim cp As CodeDom.Compiler.CodeDomProvider = New Microsoft.CSharp.CSharpCodeProvider
            Dim files() As String
            Dim m_params = New CodeDom.Compiler.CompilerParameters
            m_params.GenerateInMemory = True
            m_params.GenerateExecutable = False
            m_params.CompilerOptions = "/target:library /optimize"
            m_params.WarningLevel = 4
            m_params.ReferencedAssemblies.Add("System.dll")
            m_params.ReferencedAssemblies.Add("Common.dll")
            m_params.ReferencedAssemblies.Add("CeguiDotNet.dll")
            m_params.ReferencedAssemblies.Add("OgreDotNet.dll")
            m_params.ReferencedAssemblies.Add("OgreDotNet.Cegui.dll")
            m_params.ReferencedAssemblies.Add("Math3D.dll")

            Try
                files = IO.Directory.GetFiles(Path)
            Catch ex As Exception
                MsgBox(Path & "目录不存在!")
                Return Nothing
            End Try
            If files.Length = 0 Then
                MsgBox(Path & "目录下缺少脚本文件!")
                Return Nothing
            End If
            If files(0).Substring(files(0).Length - 1, 1).ToLower = "b" Then vbp = New Microsoft.VisualBasic.VBCodeProvider Else vbp = New Microsoft.CSharp.CSharpCodeProvider
            Dim com As CodeDom.Compiler.ICodeCompiler = vbp.CreateCompiler
            Dim res As CodeDom.Compiler.CompilerResults = com.CompileAssemblyFromFileBatch(m_params, files)
            If res.Errors.Count <> 0 Then
                Dim i As Int16
                For i = 1 To res.Errors.Count
                    MsgBox("出错:" & res.Errors(i - 1).FileName & "的第" & res.Errors(i - 1).Line _
                    & "行 错误描述:" & res.Errors(i - 1).ErrorText)
                Next i
                Return Nothing
            End If
            Return res.CompiledAssembly
        End Function
    End Class

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-7-2 21:17:00 | 显示全部楼层

Re:如何在游戏中使用LUA的脚本

如果有看不懂的地方跟帖,我会解释的

37

主题

171

帖子

177

积分

注册会员

Rank: 2

积分
177
 楼主| 发表于 2006-7-4 07:09:00 | 显示全部楼层

Re:如何在游戏中使用LUA的脚本

感觉看不明白的地方太多了,第一个类没看明白是干什么用的。
第二个类似乎是把一个脚本读入之后根据扩展名判断语言。之后编译。但还是不知道应该如何使用这两个类。能不能写个使用这两个类的小程序呢。很简单的那种就行,比如做个运算或调用个程序中的函数就行。多谢了。

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-7-4 07:55:00 | 显示全部楼层

Re:如何在游戏中使用LUA的脚本

没问题~
第一个类是脚本文件基类,不能直接使用要创建新类继承这个类才能用。
比如,你现在要写一个处理人物角色信息的脚本,那么你就定义一个新的类,比如叫Player,然后继承第一个类。
先给你解释一下这两个函数是干什么的,第一个Getclass,用来指定你要读取脚本里面的哪个类,因为下面那个类编译是编译一个目录,所以会有很多文件,就有可能有很多个类,所以你这里一定要指明,你要读取哪个类。第二个,也是最关键的了,读取制定类中的指定函数。
下面给你一个继承第一个类的例子
Public Class GUIGroup
        Inherits ScriptObject
        Public sLoadGUIGroup As LoadGUIGroup
        Private mAsm As [Assembly]


        Public Sub New(ByVal path As String)
            mAsm = SndWorld.Client.Script.Script.LoadScript(path)
        End Sub
        Public Sub SetGUI(ByVal ClassName As String)
            Dim [Type] As Type
            Type = GetClass(ClassName, mAsm)
            sLoadGUIGroup = LoadFunction(Type, "LoadGUIGroup", GetType(LoadGUIGroup))
        End Sub
        Public Delegate Function LoadGUIGroup(ByVal fontmanager As SndWorld.Client.GUI.FontManager) As GUIElements.GUIGroup

这里面申明的有一个delegate,也就是托管的意思,你只要调用上面那个类的LoadGUIGroup.Involk过程,就可以执行你脚本的内容了。在上面那个Loadfunction函数是在基类里申明的函数,就是在第一个类里,第一个参数是你指定的类(也是用第一个类的Getclass函数取得),第二个参数是函数名,就是你在脚本文件里面用的文件名,第三个参数是取得申请托管的那个函数(LoadGUIGroup)的类型,也就是你要把脚本读到什么地方去,这里就是把脚本托管给LoadGUIGroup这个函数。

第二个类就是用来编译脚本的,然后返回一个Assembly类

37

主题

171

帖子

177

积分

注册会员

Rank: 2

积分
177
 楼主| 发表于 2006-7-4 22:26:00 | 显示全部楼层

Re:如何在游戏中使用LUA的脚本

多谢您了,这种使用脚本的方法我基本明白了。
不过还有两个问题,希望您能再给我一点帮助。

第一个问题比较简单,可能是因为我对VB.NET的还不太了解。您在程序中使用了一组中括号,我不太明白是干什么用的,比如在Private mAsm As [Assembly] 或在Dim [Type] As Type。在这里为什么要使用[],这个[]到底是干什么用的。

第二个问题是关于我正在做的一个小东西里的内容。
我想设计一个接口X,和一个类Y,在类Y中存在一个以接口X为类型的对象定义。情况如下:
Public Interface X
    .....
End Interface

Public Class Y
    Public temp As X
    .....
End Class

在运行的时候我会用Y产生很多对象(个数不定,很可能会一个对象数组),而且每个对象都得到一个实现接口X的类的对象给temp。
而且每个类中的temp所对应的X的实现类都不同。而且我想把那些类放在脚本中。例如:
Dim v(100) As Y
Dim i As Integer
For i = 0 To 99
    v(i) = New Y()
    v(i).temp=从脚本中读入的类(我会从100个不同的脚本中分别读入)
Next

比如其中一个脚本是这样的
Public Class v0
    Implements X
....
End Class
我想知道我的这个想法是否可行。

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-7-5 04:10:00 | 显示全部楼层

Re:如何在游戏中使用LUA的脚本

第一个问题,那个中括号是为了防止和系统已有的关键字重复,比如Class这个关键字,是类的关键字,但是你有想用这个名字当变量名,那么你在申明和使用的时候就要加[]

第二个问题,肯定可以实现,不过你要先另外一个工程,把x接口和y类写到另外一个类库当中,然后分别在脚本和程序中引用即可,这个类库也就是常说的公用类库,我那个例子里面添加的引用:“Common.dll”也是一个我自己写的公用类库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 20:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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