【问题标题】:How to integrate game logic in game engines如何在游戏引擎中集成游戏逻辑
【发布时间】:2012-02-25 07:30:07
【问题描述】:

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

我想出了一个想法,使用我的编辑器中的ReflectionCSharpCodeProvider 来编译书面代码,这样我也可以获得我的产品的可执行文件。这种方式很好,但我想知道,这样做的真正解决方案和架构是什么。

谢谢。

【问题讨论】:

  • 过于依赖游戏类型 - 其中一些可以包含在主循环中,但 RPG 可能需要完整的规则引擎...
  • 假设它在二维平台上。顺便说一句,我对事件没有任何问题。例如,主循环可以运行Step 事件或每一帧。完全没问题。
  • 您的用户是否使用C# 指定游戏逻辑?
  • 我会尝试在gamedev.stackexchange.com上询问这个问题
  • 是的,脚本语言现在使用 C#,因为我现在不能包含任何其他可嵌入的语言。游戏需要编译,CSharpCodeProvider 是我同时编译的唯一方法。

标签: c# .net game-engine


【解决方案1】:

实际上取决于您如何设计引擎。它不能只是负责不同事物(如渲染、声音、输入等)的库片段。你必须有一个将它们组合在一起的片段。主要的两种方法是场景图或组件模型。这是将所有这些结合起来的模块。获取输入将其传递给实体或组件,执行一些脚本,播放一些 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;
    }

【讨论】:

  • 你是对的。实际上我知道引擎的流程,但我不知道我应该如何在我的引擎中实现这部分流程。即使有你的演讲我也想不通!
  • 感谢您的详细信息。我现在实际上正在我的引擎中执行此操作。正如我之前所说,执行脚本的时间或地点没有问题,而不是我不知道我应该如何将脚本交给我的引擎并说:'嘿,为我运行它!'。我尝试了 IronPython 和 JavaScript wrapper 之类的东西,但是每次您想要运行脚本时,它们都需要编译代码。这样它就像一个应用程序,它一开始没有编译,它应该在运行时编译它的代码。
  • 谢谢@Aleks。我在第一篇文章中说过,我现在正在这样做Reflection。正如其他人所说,编译确切的 C# 代码会很危险。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2012-02-25
  • 2022-01-12
  • 2020-01-17
  • 2011-12-13
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多