我有一个小游戏中.它使用一个数据库作为后端。它的 一个 交易的纸牌游戏, 我想要实现的功能卡作为一个脚本。

我的意思是,我基本上有一个接口, ICard, ,其中一个卡片类实现了(public class Card056: ICard)和其中包含的功能是通过所谓的游戏。

现在,要做的事情可维护/moddable,我想有类的每个卡源码在数据库和基本汇编在第一次使用。所以当我加入/更改卡,我只是将它添加到数据库,并告诉我的应用程序,以刷新,不需要任何组件的部署(尤其是由于我们会谈论1大会每卡,这意味着数以百计的组件)。

这可能吗?注册一个类从一个来源文件,然后实例,等等。

ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);

语言是C#但是额外奖励,如果它能够编写脚本,在任一。净的语言。

有帮助吗?

解决方案

奥列格Shilo的C#脚本解决方案(在项目代码)真是一个伟大的介绍提供剧本的能力,在应用程序。

一种不同的方法将是要考虑的一种语言,是具体建立为编写脚本,例如 如何从语言特性, IronPython, 或 Lua.

IronPython和如何从语言特性提供的今天。

为指导,以嵌入IronPython读 如何嵌入IronPython脚本支持在现有的应用程序,在10个简单的步骤.

卢脚本语言中通常使用的游戏。有一个Lua编译器。净,可从更-- http://www.codeplex.com/Nua

是代码是一个伟大的阅读如果您想要了解关于建立一个编译器。网。

一个不同的角度完全是尝试 PowerShell.有许多例子中的嵌入PowerShell入应用程序--这里是彻底的项目的主题:Powershell隧道

其他提示

你可能可以使用如何从语言特性。

否则我建议你有一个目录的地方预先编译程序集。然后你能有一个参考数据库,以大会和类,并使用反映对负荷的适当的组件在运行时间。

如果你真的想要汇编在运行的时间可以使用CodeDOM,然后你可以使用反射载荷的动态组件。 微软文件篇文章,其中可能有帮助.

如果你不想使用的DLR你可以 使用嘘(其中有一名口译) 或者你可以考虑 的Script.NET (S#)项目上更.与嘘解决方案之间可以选择汇编的剧本或使用口译员和Boo让一个很好的脚本语言,有一个灵活的语法和一个可扩展的语言通过其打开编译器的架构。Script.NET 看起来不错,虽然,你可以很容易地延长这种语言以及作为其一个开放源码项目,并使用一个非常友好的编译器生成器(Irony.net).

你可以使用的任何德国航天中心的语言,这提供一种可以很容易地举办自己的脚本平台。但是,你不需要使用一个脚本语言。你可以使用C#和汇编与C#码提供者。只要你载在它自己的程序域,可以装载和卸载到你的心内容。

我建议使用 LuaInterface 因为它已完全实现Lua它在哪里出现,Nua是不完整的,且可能没有实现一些非常有用功能(协同程序等)。

如果你想使用一些外部预装Lua模块,我建议使用一些沿线的1.5.x而不是2.x系列建立全面管理的代码,无法获得必要C API。

我使用的LuaInterface1.3+Lua5.0净1.1申请。

问题嘘是的,每次分析/编译/eval你的代码,它创建了一个组嘘类的所以你会得到存储器的泄漏。

Lua在另一方面,不这样做,所以它是非常非常稳定工作的精彩(我可以通过对象从C#Lua和向后).

到目前为止,我还没有把它放在生产,但似乎非常有前途。

我没有存储器泄漏的问题促使使用LuaInterface+Lua5.0, 因此,我使用Lua5.2和直接链接到C#与DllImport. 存储器泄露了内部的LuaInterface图书馆。

Lua5.2:从 http://luabinaries.sourceforge.nethttp://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download

一旦我做了这个,我所有的存储器泄漏走了和应用程序是非常稳定。

主要应用程序,我的司销售并非常类似的东西提供客户定制(这意味着我不能发布的任何来源)。我们有C#应用程序载的动态VB.NET 脚本(虽然任。净的语言可以容易地支持VB被选中是因为该定制的团队,来自一个ASP背景)。

使用。净的CodeDom我们编写脚本,从数据库,使用VB CodeDomProvider (烦人的默认。净2,如果你想要支持的3.5功能你需要通过一词典"CompilerVersion"="v3。5"其constructor).使用 CodeDomProvider.CompileAssemblyFromSource 方法编译(你可以通过设置,以迫使它在编译存储只。

这将导致数以百计的组件在内存,但是你可以把所有的动态班代码连成一个单一的组装,以及重新编译整个地时的任何改变。这具有的优点在于你可以添加一个标志汇编磁盘上有 PDB 当你的测试,允许你在调试通过动态的代码。

是的,我想过,但我很快就想出了另一个领域特定的语言(DSL)将是有点太多了。

从本质上讲,他们需要与我的游戏状态中可能是不可预测的方式。例如,卡可能有一个规则"当这个卡进入播放,所有你不死的奴才获得+3攻击飞行的敌人,除非当敌人是有福的".作为交易的纸牌游戏是基于转,的游戏状态管理,将防火OnStageX事件,并让卡修改其他的卡或者游戏状态的任何方式卡片的需求。

如果我尝试创建一个DSL,我要实现一个相当大的功能设置和可能不断更新,其中转移的维护工作的另一部分没有实际上去除它。

这就是为什么我想留的"真实"。净的语言基本上可以只开火的事件,并让卡操纵的游戏状态的任何方式(限制内的代码的访问安全)。

下一个版本。网(5.0?) 已经谈了很多关于开的"编译器作为一个服务",这会使事情喜欢直接的脚本评估可能的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top