如何在游戏引擎中集成游戏逻辑

时间:2012-02-23 20:01:41

标签: c# .net game-engine

最近我正在使用C#开发.Net中的2d游戏引擎示例。我的主要问题是我无法弄清楚我应该如何在游戏中包含游戏逻辑。目前我有一个基本引擎,它是一组运行子系统的类,如RenderSoundInputCore功能。有一个编辑器可以帮助用户添加资源,构建级别,编写脚本和其他东西。

我提出了一个想法,即使用编辑器中的ReflectionCSharpCodeProvider来编译已编写的代码,这样我就可以得到我的产品的可执行文件。这种方式很好,但我想知道,实现这一点的解决方案和体系结构是什么。

感谢。

1 个答案:

答案 0 :(得分:0)

真的取决于您如何设计引擎。它不能只是负责渲染,声音,输入等不同事物的库。你必须有一个将它们组合在一起的部分。主要的两种方法是场景图或组件模型。这是将所有组合在一起的模块。获取输入将其传递给实体或组件,执行一些脚本,播放一些sfx,应用一些转换,将转换后的实体发送到渲染管道。在此流程中,执行某些脚本是您要集成的内容。有很多方法可以做到这一点。最好的方法是,如果这些脚本来自您的编辑器。它们将与实体模板,实体实例,触发器,UI元素,输入设备相关联。引擎不应该知道有关实体的任何具体信息。他们的模板应该在编辑器中定义,并使用编辑器再次放置在世界中。

修改:更多细节。

假设您完全想要跳过应用程序部分,并且所有特定于游戏的内容都在您的编辑器中编写脚本。然后你的引擎需要有一个主循环并更新并绘制你的场景。一个简单的开始是更新,然后尽可能快地绘制您的场景,而无需在循环中等待。

现在假设你有组件模型......每个组件都会有更新,而更新是你编写脚本的代码。您必须创建一些组件可以从引擎访问的接口。例如,您的绘图组件模板将具有属性模型,并且在其中更新将在引擎上调用DrawModel并传递该模型。一些其他游戏手柄组件将需要从它的更新来查询按下或释放的按钮。还需要一些能够在实体中找到其他组件,以便它可以修改物理组件的位置或速度。

您必须开始编写基本实体的基本组件,并且您将从脚本中找出您无权访问的内容。然后你必须将它暴露给你的脚本层。但在暴露每一个功能之前要三思而后行。 API越简单越好。

编辑:如何在运行时编译脚本

如果你有JavaScript的.NET实现,IronPython可以在没有编译的情况下评估代码我敢打赌它也可以做到。这是编译脚本的C#方法...如果您的编辑器在C#中,我建议您在编辑器中编译单独的程序集。

    private Assembly Compile(string fileName)
    {
        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

        CompilerParameters cp = new CompilerParameters();
        cp.GenerateExecutable = false;
        cp.GenerateInMemory = true;
        cp.TreatWarningsAsErrors = false;
        CompilerResults cr = provider.CompileAssemblyFromFile(cp, fileName);

        return cr.CompiledAssembly;
    }