游戏地图编辑器,JAVA版简单实现

来源:互联网 发布:好用的安卓模拟器知乎 编辑:程序博客网 时间:2024/05/17 08:37

    魔兽争霸、星际争霸,这两款游戏相信大家并不陌生,在游戏中有地图编辑功能,只要编辑好地图我们就可以开始玩了,可见游戏地图在游戏中发挥着多么重要的作用,它承载这非常多的数据,比如地形标示,一些做得比较精密的游戏,在切换到不同地形时,会有明显的变化,比较雪地,人物行走将会变慢,并且会发出踩到雪里的声音;再比如一些特定地点的触发事件,我们的主角经过某一个特定地方时,会触发到一些特殊事件,这也可以在地图设计之初为其设定好。所谓的3D引擎,既为我们的图形元素按照一定的算法,编辑我们的图形元素(比如添加阴影或者粒子效果),并且提供接口,给游戏主程序调用,下面,会以一个简单游戏地图编辑器的实现讲解下游戏地图编辑器的开发。

       首先一步:图形元素编辑,每个游戏画面其实可以分割为多个不可再分割的图形元素,就好像拼图一样,它们拼织在一起形成了我们游戏的主画面,所以我们要做的第一步当然就是对图形元素经行编辑。

       程序预览:

 

导入图形元素:

       每个图形元素对应一个实体对象,图形界面可采用二维数组保存,比如item[x][y]对应一个实体对象,在界面对应(x,y)坐标处加载item[x][y]对象中所保存的图片。

    这里的实体类应包含自身高、宽、图片名称等一些信息,所含含方法应包含绘制自身等,张孝祥举过一个列子非常的棒,人在黑板画圆,画圆的方法是属于黑板还是属于人,在面向对象的世界里,正确答案是圆,这个例子很受用。

 

对图形元素的具体编辑:

 

 

   

    编辑分三类,占位位置、可遇事件触发点、不可通过点,占位表示在我们对图层经行编辑时,鼠标所指向位置即图形占位符所处图形元素位置所落下的位置,拿上图为例,左上角为占位,那么当鼠标点击坐标(0,0)的时候,落于(0,0)坐标的就是图形元素的左上位置;可遇事件触发点表示该点将会记录下一个商定好的值,比如当我们的主角位于该坐标时,我们的主程序检测到这个值就会播放一个特定动画等等;不可通过点表示该位置不允许通过。

       对图形元素的编辑可以根据自身的需要经行特别的操作。

       游戏可能分很多层,每一层也许都有自身的设定,每层的一个设定可对应一个map,或者数组,不宜用列表或者set

 

保存元素列表:

 

    当编辑好需要使用的各图形元素后,我们就要对其通过序列化的方法经行一个保存,以供地图样式编辑器使用。

    特别提一点,当我们要使用某个对象的副本,第一想到的是clone()这个方法,我们也可以重写这个方法,但是需要注意的是,类似一些基础属性,比如String、int可以直接克隆,因为当我们XXX=XXX时候,对于这些基础属性是一个值传递而不是引用传递,当对象中包含数组之类的属性类型时要特别小心,直接克隆会出问题。

 

    对图形元素编辑完成后,下一步就是拼装这些图形元素了,地图应分层设计,一个游戏有10几层也不奇怪。

 

加载元素列表:

 

    加载元素列表既加载刚才导出的元素列表,这里涉及到一个序列化的问题,序列化为保存实例化对象的方法,主要涉及类:ObjectOutputStreamObjectInputStream,当然我们也可以弄成XML的,需要导入xstream-1.3.1.jar,使用xstream在保存中文时需要转码,转码的方法很多,比如URLEncoder、URLDecoder等。

 

拖动图形元素到面板中进行拼装:

 

 

 

这种拖动效果可由对鼠标事件监听做出来,鼠标监听在面板上拖动,并根据右侧列表选取获得图片,就可以了,半透明效果为Graphics2D setComposite方法,具体可上网查找。

 

编辑图形元素:

 

 

    设计者在明确地图层次结构后,遍可以经行拼装工作,一般由美工负责。

 

设置地形触发点:

 

 

   触发事件点设置为在已经于开发人员商议好的情况下,给某个坐标点经行事件赋值,用以当程序与到该值时做出相应操作。

 

地形设置:

 

 

 

与触发事件点同理,用于记录当前地形。

 

图层设计:

 

 

 

图层编辑效果,以上没有经过分层,为起到演示作用,不建议这样经行编辑。

 

删除地图元素:

 

 

 

    某些位置可能有多个元素重叠了,当我们要删除的时候需要提示具体删除信息,毕竟当我们以数组形式保存对象信息时,我们保存的是一个点,我们还需要通过图片元素高、宽来判断在删除时,这给删除带来了多一步的工作。

 

保存地图文件与图层文件:

 

 

 

    地图与图层最大的区别在于,图层不包含事件处理,二地图层则记录了所有事件的信息,比如同一副地图,当我们主角经过触发了一次该类事件,下一次我们不想触发了,我们可以用三种做法,一种通过接口修改地图文件中的值,这种方法涉及导入导出复制等问题,一种是根据地图事件信息值和主角自身某一信息值联合触发,这种是比较好的,还有一种就是预设两种样式相同而具体事件信息不同的地图,虽然增加了存储空间,不过还是比较方便的。

 

    模拟部分是为测试显示是否正确,与主程序接口用的是同一套。

 

图层组合画面:

 

 

    导入图形层位置直接影响渲染效果,层级关系在设计前就要商议好,非则无法达到预计效果。

 

 

绘制预览:

 

 

    绘制预览以查看具体渲染效果,并且通过鼠标点击获得某坐标的信息值。

 

模拟画面开始:

 

 

    要做两步,第一步初始化精灵出现位置,如果该位置为不可通过或者边界以为则无法经行模拟,第二部则是精灵出现层,一般是在顶层,当然也有特殊情况,这样做是为了做出假3D效果,例如人物在树后,人物走入天桥的桥洞中,都可以这样实现。

 

模拟画面:

 

 

    当精灵经过特定地点,右侧框体将会提示当前坐标的信息。

 

      

 程序演示就到这里了,对于地图数据的保存,我们可能有很多种方法,例如不可通过的坐标点,可遇事件的坐标点,它们可能是一个二维数组,然后我们再将它们放入一个map中,它们就组成了一种新的数据存储形式,不同的存储方式就直接影响程序的效率以及使用的便捷程度,这需要大量的实践来使我们对数据更敏感。

       以上就是本人简单制作的一个游戏地图编辑小程序,希望对想学习如何制作游戏的朋友们有所启发,今天能做出自己的地图编辑器了么?J