Overview
简单介绍如何在游戏中加入玩家自定义的方块形状。
自定义形状
您可以在游戏的本地文件中找到游戏自动生成的shapes.lua(Windows7操作系统下位于C:Users[Your user name]Saved GamesReassemblydata)(如果您找不到这个文件,请在cvars.txt里设置kWriteBlocks = 1,重启游戏即会生成该文件),
您可以用Notepad++等软件打开它来查看官方原版方块使用的大部分形状。它们的格式例如:
— RECT/长方形 (官方默认形状)
{5, {{verts={{5, -1.464}, {-5, -1.464}, {-5, 1.464}, {5, 1.464}}, ports={{3, 0.5}, {0, 0.5}, {1, 0.5},
{2, 0.5}}},
{verts={{5, -2.5}, {-5, -2.5}, {-5, 2.5}, {5, 2.5}}, ports={{3, 0.5}, {0, 0.5}, {1, 0.5}, {2, 0.5}}},
{verts={{5, -3.536}, {-5, -3.536}, {-5, 3.536}, {5, 3.536}}, ports={{3, 0.5}, {0, 0.5}, {1, 0.5},
{2, 0.5}}},
{verts={{10, -2.929}, {-10, -2.929}, {-10, 2.929}, {10, 2.929}}, ports={{3, 0.5}, {0, 0.25}, {0,
0.75}, {1, 0.5}, {2, 0.25}, {2, 0.75}}},
{verts={{10, -7.071}, {-10, -7.071}, {-10, 7.071}, {10, 7.071}}, ports={{3, 0.5}, {0, 0.25}, {0,
0.75}, {1, 0.5}, {2, 0.25}, {2, 0.75}}}}}
在上面的例子里,5是长方形的形状ID,在blocks.lua里指定shape=RECT与shape=5是一样的,但自定义形状的ID只能是数字,不能用英语等字符串。verts指定了该形状的顶点位置,ports指定了该形状上连接点的位置。要让一个形状有多个可选尺寸,就在同一形状下指定多组顶点与接点,上面的长方形有5个可选尺寸。
verts的格式是在平面直角坐标系中用横轴和纵轴沿顺时针方向指定多边形顶点的位置,游戏会以线段将顶点依次连接成多边形。自定义形状应为封闭的凸多边形(非封闭图形会报错,一部分凹多边形虽然可以使用,但往往会显示不正常且也可能报错)。
整个形状应该是以向右为正方向,即整个形状从左向右。一个形状最多由16个节点构成。
例:verts={{5, -5}, {-5, -5}, {-5,5}, {5,5}}
这是边长为10的正方形,指定的第一个顶点是右下角,第二个顶点是左下角,
第三个顶点是左上角,第四个顶点是右上角。
ports的格式是{从指定顶点开始定位,到指定顶点的距离占所在边长度的比例,接点的类型},比例的格式是0到1,接点的类型不设定时默认为“普通”。
可用的接点类型:
空缺(普通),
WEAPON_IN 武器入点(只能接武器出点),
WEAPON_OUT 武器出点(只能接武器入点),
THRUSTER_IN/推进入点,
THRUSTER_OUT/推进出点(只能接推进入点),
NONE/无(该位置没有接点),
LAUNCHER/发射点,
MISSILE/导弹点(只能从这个点开始生长在发射点上,该方块设置了推进时也会从这个点推进),
ROOT/扎根点(建筑和植物用以连接在环境方块,该方块设置了推进时也会从这个点推进)
例:
ports={{0, 0.5, THRUSTER_OUT}} 从第一个顶点开始定位,在该边中点上有一个推进出点;
ports={{1, 0.33, LAUNCHER}} 从第二个顶点开始定位,在该边三分之一处有一个发射点。
形状的特殊属性
空缺(普通),
mirror_of 选定一个形状,作为其镜像,在游戏中可以M翻转,
launcher_radial=true 修改发射物的发射方向
例:
{1002,{},mirror_of=1001},
此处形状1002为1001的x轴镜像。但此处的镜像只是单纯的翻转,有可能造成渲染bug。
{1005,{{verts={{-5,5},{5,5},{5,-5},{-5,-5}},ports={{0,0.5, LAUNCHER},{1,0.5, LAUNCHER},{2,0.5, LAUNCHER},{3,0.5}}}}},
{1006,{{verts={{-5,5},{5,5},{5,-5},{-5,-5}},ports={{0,0.5, LAUNCHER},{1,0.5, LAUNCHER},{2,0.5, LAUNCHER},{3,0.5}}}},launcher_radial=true},
左为1006,右为1005。
重新审视上面的官方长方形:
— RECT/长方形 (官方默认形状)
{5, {{verts={{5, -1.464}, {-5, -1.464}, {-5, 1.464}, {5, 1.464}}, ports={{3, 0.5}, {0, 0.5}, {1, 0.5}, {2, 0.5}}},
这段代码是长方形的第一个尺寸,指定顶点的顺序是右下-左下-左上-右上,其长边的长度是5+5=10,短边的长度是1.464+1.464=2.928。每条边的中点有1个普通接点。
以下是自定义形状的例子:
–自定义的多接口推进器形状,可以向侧面接其它推进器,但本身推进方向仍然是唯一固定的
{1001, {{verts={{2.378, -5}, {-2.378, -6.545}, {-2.378, 6.545}, {2.378, 5}}, ports={{3, 0.5, THRUSTER_IN}, {1, 0.5, THRUSTER_OUT}, {0, 0.5, THRUSTER_OUT}, {2, 0.5, THRUSTER_OUT}}},
{verts={{4.755, -10}, {-4.755, -13.09}, {-4.755, 13.09}, {4.755, 10}}, ports={{3, 0.5, THRUSTER_IN}, {1, 0.5, THRUSTER_OUT}, {0, 0.5, THRUSTER_OUT}, {2, 0.5, THRUSTER_OUT}}},
{verts={{7.133, -15}, {-7.133, -19.635}, {-7.133, 19.635}, {7.133, 15}}, ports={{3, 0.5, THRUSTER_IN}, {1, 0.5, THRUSTER_OUT}, {0, 0.5, THRUSTER_OUT}, {2, 0.5, THRUSTER_OUT}}},
{verts={{9.511, -20}, {-9.511, -26.18}, {-9.511, 26.18}, {9.511, 20}}, ports={{3, 0.5, THRUSTER_IN}, {1, 0.5, THRUSTER_OUT}, {0, 0.5, THRUSTER_OUT}, {2, 0.5, THRUSTER_OUT}}}}},
–自定义的多接口模块炮形状,可以向侧面接模块,但不设置炮塔时发射方向仍然是唯一固定的
{1002, {{verts={{5, -2.5}, {-5, -2.5}, {-5, 2.5}, {5, 2.5}}, ports={{3, 0.5, WEAPON_OUT}, {3, 0.1, WEAPON_OUT}, {3, 0.9, WEAPON_OUT},
{0, 0.5}, {0, 0.75, WEAPON_OUT}, {1, 0.5}, {2, 0.5}, {2, 0.75, WEAPON_OUT},}}}}
方块渲染
方块的颜色渲染采用以第一个点为起点,再连接到其他顶点渲染。所以,一些凹状图形会导致渲染出形状。
按左边的形状构造顶点会产生形状外的渲染,圆圈内的红点为设置的第一个顶点。
如果您要在自己的mod里自定义形状,只要在您的mod文件夹内新建shapes.lua,按上述格式在里面指定新形状,然后在您mod的blocks.lua里将方块设为新形状,例如shape=1001。
官方凹多边形SENSOR与CANNON2不在原版shapes.lua里。shapes.lua虽然能定义凹多边形,但往往显示得不正常。
根据官方形状的代码,在某个位置设定类型为NONE的点的结果似乎和根本不在该位置设点是一样的。
官方自定义形状的顶点坐标精度为小数点后三位,如果按照这个精度,方块的连接可能会发生无法连接的情况,原因是误差太大。因此作者设置了相应的叠船系数来防止这种情况。