最近我正在使用C#开发.Net中的2d游戏引擎示例。我的主要问题是我无法弄清楚我应该如何在游戏中包含游戏逻辑。目前我有一个基本引擎,它是一组运行子系统的类,如Render
,Sound
,Input
和Core
功能。有一个编辑器可以帮助用户添加资源,构建级别,编写脚本和其他东西。
我提出了一个想法,即使用编辑器中的Reflection
和CSharpCodeProvider
来编译已编写的代码,这样我就可以得到我的产品的可执行文件。这种方式很好,但我想知道,实现这一点的解决方案和体系结构是什么。
感谢。
答案 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;
}