如何实现一个游戏地图编辑器

参与的一个项目,策划使用类似csv的格式进行配置数据填写。csv数据格式相比于excel格式虽然有可以merge,读写简单的优点,但也有不少缺点(不支持公式存储,不支持注释,添加图片等等)。于是,我们觉得需要一个地图编辑器,来协助策划完成数据的填写工作,以提高数据填写的效率和正确率。

读书时,接触过一些网游私服的编辑器,但印象最深的还是war3地图编辑器。所以,我的直觉就是是不是可以实现一个类似的上图的编辑器,感觉已经完全够用了。

我们的目标主要有2个。帮助策划更方便的编辑和查找数据;为不同的数据做定制化的组件支持(有的是combobox,有的用checkbox等等),减少数据出错的可能性。

数据格式

首先,我们希望我们地图编辑器支持的数据格式是一种扩展的csv格式,因为我们除了数据本身外,还需要一些头文件信息。我们需要至少知道各个字段的名字,字段的类型(便于做数据检查)等等。

于是,我们确定了这样的数据格式。比较简单,head是表头信息,data即是csv格式的数据。

数据的加载

确定了数据格式,我们就可以把数据头和数据本身,分别加载到一个内存对象中。数据本身,建议就使用字典来存储(一般的实体表都是有唯一id的),唯一id用来做主键,List<string>类型的数据作为值。数据字典中的值,不论具体的字段类型,都使用string存储,会比较简单。并且对编辑器而言,所有的数据都是字符串,只是不同的字段类型,在改变数据时需要有一些约束。

将数据加载到内存的对象(DataPack)中,DataPack除了具有数据加载的接口外,还可以有数据查找,修改,导出等等方法。

基本布局

再回头看上图的内容,我们发现左图(导航栏)的数据都来自于DataPack中的数据信息(每一条记录的Name构成的列表或Tree)。右图(编辑栏)则是DataPack的表头信息,以及某一条记录的所有数据。

导航栏,我们可以很容易的使用ListView控件来填充完成,通过处理其选中目标变化的事件就可以刷新编辑栏中的数据。

对于编辑栏,通过循环所有表头信息,我们可以为每一个字段生成一组组件(包括2个Label和一个TextBox,如上图)。生成时的主要问题就是控制各个控件的位置。此时TextBox应该是空的。而当导航栏的选取目标发生变化时,面板加载对应的数据,并填充对应的TextBox。

组件的定制

通过定制,我们可以对上图的控件进行改进。

我们通过一种ini文件的格式来定制的规则,主要是告诉系统,哪一个字段该对应使用哪一种控件,以及一些配置值。

当生成表组件排布时,系统发现对应的ini文件中有特殊组件规则,便会使用特定的组件来取代TextBox。

不管是默认的Textbox控件还是各种自定义的组件,都是实现了上图的IAutoControl接口。通过这种约束,面板的数据赋值/取值等过程不需要区分是哪一种控件的,只需要面向接口进行编程。比如,默认的TextBox控件只是将Value属性映射到TextBox组件的Text字段是。而复杂组件的行为可能就会复杂的多。

总结

整个编辑器程序,我们需要处理两种数据,数据和元数据(表头),然后通过一个编辑器的显示类(View)来完成数据的加载、显示和编辑修改。

猜你喜欢

转载自blog.csdn.net/narlon/article/details/85262976
今日推荐