《G SRPG》项目讲解(一) Level&Map
《G SRPG》是使用Godot游戏引擎制作的一个【SRPG】类型的项目。该项目的源码可访问:
获取。这个专栏主要是说说我在制作《G SRPG》时的想法与思路。棋盘是SRPG的基础要素之一。本文简要分享我在制作《G SRPG》的实现思路。
关于棋盘:
在此项目中,棋盘的场景及组件都存放在了【Map】文件夹下。文件结构如下:

虽然说该文件夹下的文件比较多(而且分类做得不好),但核心组件只是如下几项:
Sub.tscn :选中下标。非常重要的一个组件(因为该项目设计上操作是全键盘的)。
Clicks.gd :提供可让Sub选中的区域。
Map.gd :管理绘制的TileMap
Units.gd :管理棋子的增减与行动系统(此项目中以棋子的速度决定行动顺序)
Level.tscn :初始化组件
下面来介绍Level与Map:
Level.tscn
level

level的作用主要是做组件的初始化工作。
设置了三个变量方便设计关卡:
winNextScene :获胜后载入的场景
loseNextScene :失败后载入的场景
joinUnitNum :可以参加战斗的棋子的人数,这与另外一个场景(Plan)有关,此处不介绍。
Map.gd
这脚本主要提供了用于棋子寻路的A*算法与用于显示棋子可以抵达的区域的洪水算法。
obsSet :为了方便修改障碍物与设置经过障碍物所消耗的代价。以key为图块下标;value为经过代价。如果代价是1以下的数值将是不可穿越的。

前面有几段是转换棋子们的坐标
此函数使用了 MakeGrid.gd ,关于这个可以看我之前的视频。显示攻击区域的话,不在Map中调用也是没有问题的,不过在写的时候,考虑到可能后续会有什么“不能隔着障碍物攻击目标”的攻击模式所以就就将攻击的显示可攻击区域的函数放到了Map中。

当前的设计来说,无论攻击区域上有没有障碍物都是可以显示攻击区域。
接下来就是移动了,移动的话,一般显示移动都是一个范围,这个可以使用洪水算法这个我也是在搜索后才知道的,所以有问题果然还是马上搜索一下比较好。

这里在写的时候,我做了将得到的范围减去内圈只保留最外面一圈的操作,这一段没有什么愿意,即使删掉减去内圈的代码也没有什么影响。

既然现在有区域了,那接下来就需要让棋子移动到一个位置上去,这个项目中使用的是A*,我在这个项目中得到,大家可以去看载看一下。

说点闲话
这是第一次写这种东西,写得不好请见谅。