2017-02-28 56 views
0

我使用OpenTK(OpenGL)在C#中创建了一个游戏引擎。我的游戏的更新系统在事件队列中运行,当事件发生时,它被添加到事件队列中。每个事件都有一组触发器和一组操作。如何将if语句存储为字符串? C#

让我们说玩家走。 'PlayerWalked'触发器运行。游戏中每一个在其列表中带有“PlayerWalked”触发器的事件都被添加到队列中。

现在,游戏的更新功能每秒被调用几次。每次调用时,都会运行队列中最旧的事件。事件操作列表中的每个操作都会运行。

现在,我想添加一个条件系统。在触发器'PlayerWalked'上,不是将它添加到列表中,而是检查触发器,检查条件,然后将其添加到队列中。

实施例:

事件 名称:事件1
触发器: 'ChestOpened', 'PlayerDigs'
条件:球员位置为1,1(2D游戏)。
行动:给玩家10金币。

现在,我有触发器检查和操作工作。现在我需要的是添加条件。这是我的困境:

当我存储地图时,我需要一种方法将条件存储在事件的条件文件中。我以为这个文件会包含这个内容: 'playerPosition |(1,1)' 但是,这是非常广泛的,变量'playerPosition'可能不存在,我将不得不解析它怪异。

问题:如何在映射文件(字符串)中存储conparisions(条件,if语句)?

更多信息: 地图是存储在游戏可执行文件旁边的地图存储文件夹中的目录。在地图文件夹中,有一个事件文件夹。在事件文件夹中,每个事件都有一个文件夹。在每个事件文件夹中都有用于触发器的文件,用于条件的文件和用于操作的文件。触发器和动作现在正在工作,但条件是我想要添加的。

文件结构:

Maps (Directory) 
    Map1 (Directory) 
     Events (Directory) 
      Event1 (Directory) 
       Triggers (File) 
       Conditions (File) 
       Actions (File) 
      Event2 (Directory) 
       Triggers (File) 
       Conditions (File) 
       Actions (File) 
      Event3 (Directory) 
       Triggers (File) 
       Conditions (File) 
       Actions (File) 

我使用OpenTK作为包装到OpenGL,但没有任何声音引擎呢。这是一款2D RPG游戏。

编辑:有人引起了我的注意,它看起来像我问如何写在C#文件。我知道。
什么我问的是:如何将

if (playerPosition == new Point(0, 0)) { } 

翻译成我会在一个变量分析和存储的文本文件?我如何将If语句存储在变量中,以及如何将该变量存储在文件中?

解决:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web.Script.Serialization; 
using System.Windows.Forms; 

namespace Entropy 
{ 
    public partial class MainForm : Form 
    { 
     public MainForm() 
     { 
      InitializeComponent(); 

      a b = new a { s = ":D" }; 

      string json = new JavaScriptSerializer().Serialize(b); 

      Dictionary<string, object> c = (Dictionary<string, object>)new  JavaScriptSerializer().DeserializeObject(json); 
      MessageBox.Show(c["s"].ToString()); 
      //Out: ':D' 
     } 
    } 

    public class a 
    { 
     public string s = string.Empty; 
    } 
} 
+1

您有哪些'if'逻辑里面的它创造一些像'公共类PlayerAtPositionCondition'并创建一个方法'公布尔IsSatisfied()'什么?因此,不要在某处存储'if'语句,只需将类名称存储为通过反射实例化,或者稍后可以使用一些代码使用'FactoryMethod'模式实例化适当的类?你会为每个条件创建一个类,并且可能传递参数给这个类... – Alisson

+0

好吧,会有很多比较。 PlayerLocation,PlayerHasInventoryItem,GameIsOver,GameHasStarted等等。可能有数百个。现在,我可以为所有这些使用枚举。 Mabey ... –

回答

1

存储在一个字符串比较,然后把它们变成代码....这被称为编写编译器!计算机科学有你的背影!

所以你问,什么是我可以逃脱,我的领域特定语言最简单的编译器?

你是小型的语言是非常小:它只有谓词(可能是嵌套谓词)

你可以看一下C#编译器的解析器/发电机。在你面前阅读有一些乐趣。

或者,你可以创建一个类结构中保存这些嵌套的谓词,然后将它们序列化为JSON,并存储JSON。

所以你可能有

var condition = new Condition { 
    Object = Objects.Player, 
    Comparison = Comparisons.Equals, 
    Value = new Value { type = Position, innerValue = "2,1" } 
}; 

然后你把它序列化到一个字符串,你可以节省...

var json = new JavaScriptSerializer().Serialize(obj); 

然后你就可以稍后再加载它,通过反序列化JSON回到对象中。

有一些你比较对象上称之为“评估”的方法,它通过撕裂对象层次结构,计算为你找出答案。

我已经不是引用的脚本语言做这样的事情在过去,Lua是流行在游戏中这种类型的活动,但是Python是良好的互操作性,以及。

+0

谢谢!这正是我所期待的! –

+1

看看这个类似的问题:http://stackoverflow.com/questions/821365/how-to-convert-a-string-to-its-equivalent-linq-expression-tree –

+0

谢谢!我没有真正使用过LINQ,所以我不太熟悉它。 –