我是godot 3.4的新手!我的第一个项目是正字法国际象棋制作。我不能生成棋盘。我写了以下脚本,试图生成棋盘:
using Godot;
using System;
public class TileSpawner : Spatial {
[Export] private readonly Material lightSquare;
[Export] private readonly Material darkSquare;
private bool isLight = false;
public override void _Ready() {
Vector2 coordinates = new Vector2(0, 0);
for (int y = 0; y < 8; y++)
for (int x = 0; x < 8; x++) {
coordinates.x = x; coordinates.y = y;
AddChild(MakeTile(coordinates));
}
}
private MeshInstance MakeTile(Vector2 coordinates) {
MeshInstance mesh = new MeshInstance() {
Mesh = new CubeMesh() {
Material = isLight ? lightSquare : darkSquare
}
};
mesh.Translate(new Vector3(-coordinates.x, 0, coordinates.y) + new Vector3(coordinates.x/2, 0, -coordinates.y/2));
mesh.Scale = new Vector3(1.0f, 0.2f, 1.0f);
isLight = !isLight;
return mesh;
}
}
结果忽隐忽现。。。一个对象与另一个重叠
所以我在MakeTile函数上添加了这一行,以清楚地看到问题:
mesh.Translate(isLight ? Vector3.Up : Vector3.Down);
有这样的东西。有两个大的块在适当的地方小64瓷砖
不知道发生了什么事。我已经试着解决这个问题4个小时了。
@Theraot的回答很有希望,但没有改变任何事情。我的解决方案:步骤1:创建一个包含深色和浅色方形网格的场景。步骤2:转到场景(在屏幕的左上角(>转换为…>网格库。步骤3:勾选";"与现有合并";复选框并将文件另存为name.meshlib步骤4:在你想要你的棋盘所在的场景上创建一个GridMap。步骤5:在GridMap节点上加载name.meshlib,并附加以下脚本:
using Godot;
using System;
public class FillWithTile : GridMap {
public override void _Ready() {
Vector2 coordinates = new Vector2(0, 0);
for (int y = -4; y < 4; y++)
for (int x = -4; x < 4; x++) {
coordinates.x = x; coordinates.y = y;
MakeTile(coordinates);
}
}
private void MakeTile(Vector2 coordinates) {
SetCellItem((int)coordinates.x, 0, (int)coordinates.y, (coordinates.x % 2 == 0) != (coordinates.y % 2 == 0)?1:0);
}
}
我们将制作一个Transform
:
var t = new Transform(
x_axis,
y_axis,
z_axis,
origin
);
因此,让我们定义我们在那里使用的组件。首先,对于origin
,我想让它为零是可以的。您可以更改它来移动棋盘。
var origin = Vector3.Zero;
我还假设轴可以在通常的方向上,只是按比例缩放:
var x_axis = Vector3.Right;
var y_axis = Vector3.Up * 2.0f;
var z_axis = Vector3.Back;
或者,您希望它们旋转吗?你可以这样做:
var x_axis = (Vector3.Right + Vector3.Back).Normalized();
var y_axis = Vector3.Up * 2.0f;
var z_axis = (Vector3.Back + Vector3.Left).Normalized();
附录:刻度太大。瓷砖占据了四个牢房的面积。因此,在x和z轴上收缩一半:
var x_axis = Vector3.Right * 0.5f;
var y_axis = Vector3.Up * 2.0f;
var z_axis = Vector3.Back * 0.5f;
或者对于另一种情况:
var x_axis = (Vector3.Right + Vector3.Back).Normalized() * 0.5f;
var y_axis = Vector3.Up * 2.0f;
var z_axis = (Vector3.Back + Vector3.Left).Normalized() * 0.5f;
现在,你还记得我说过这是Transform
吗?
var t = new Transform(
x_axis,
y_axis,
z_axis,
origin
);
不完全是这样。我们将根据我们得到的coordinates
来替换它,如下所示:
var t = new Transform(
x_axis,
y_axis,
z_axis,
origin + x_axis * coordinates.x + z_axis * coordinates.y
);
附录:我认为您需要通过将此处的偏移量加倍来补偿规模减半:origin + x_axis * coordinates.x * 2.0f + z_axis * coordinates.y * 2.0f
并将其设置为mesh
:
mesh.Transform = t;
附录:光明与黑暗的决定是错误的。它按行和切换进行,如下所示:
10101010
10101010
…
这里有一个替代算法:
isLight = (((int)coordinates.x) % 2 == 0) != (((int)coordinates.y) % 2 == 0)