我使用OpenTK(OpenGL)在C#中创建游戏引擎。我的游戏更新系统在事件队列中运行,当事件发生时,它会被添加到事件队列中。每个事件都有一组触发器和一组操作。
让我们说玩家走路了。 ' PlayerWalked'触发器运行。游戏中的每个事件都与玩家一起玩耍'列表中的触发器被添加到队列中。
现在,游戏的更新功能每秒被调用几次。每次调用时,都会运行队列中最旧的事件。事件的动作列表中的每个动作都会运行。
现在,我想添加一个条件系统。在触发器' PlayerWalked',而不是仅仅将其添加到列表中,它会检查触发器,检查条件,然后将其添加到队列中。
示例:
事件
名称:event1
触发器:' ChestOpened',' PlayerDigs'
条件:玩家位置为1,1(2D游戏)
行动:给予玩家10金币。
现在,我有触发检查和操作工作。现在我只需要添加条件。这是我的困境:
当我存储地图时,我需要一种方法将条件存储在事件的条件文件中。我在想这个文件会包含这个: ' playerPosition |(1,1)' 但这是非常广泛的,变量' playerPosition'可能不存在,我将不得不解析它怪异。
问题:如何在地图文件(字符串)中存储conparisions(条件,if语句)?
更多信息: 地图是存储在游戏可执行文件旁边的地图存储文件夹中的目录。在地图文件夹中,有一个事件文件夹。在events文件夹中,每个事件都有一个文件夹。在每个事件文件夹中都有一个触发器文件,一个条件文件和一个操作文件。触发器和操作现在正在运行,但条件是我想要添加的。
文件结构:
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;
}
}
答案 0 :(得分: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也有利于互操作性。