2017-02-28 55 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,所以我不太熟悉它。 –