我一直在为我的游戏模仿this article。这篇文章是关于程序生成地下城地图的。我已成功翻译了本文中的大部分Haxe代码。我翻译的大多数代码,我通过大多数猜测和试验/错误来完成。我得到了一个我不完全理解的部分:
现在的目标是连接每个房间,以便我们可以穿过我们的地牢,最终到达通往下一个楼层的出口。我们可以通过在房间之间划出走廊来实现这一目标。
我们需要在代码中添加一个点变量来跟踪创建的每个房间的中心。每当我们创建和放置房间时,我们确定其中心并将其连接到前一个房间的中心。
首先,我们将实施走廊:
private function hCorridor(x1:Int, x2:Int, y) {
for (x in Std.int(Math.min(x1, x2))...Std.int(Math.max(x1, x2)) + 1) {
// destory the tiles to "carve" out corridor
map[x][y].parent.removeChild(map[x][y]);
// place a new unblocked tile
map[x][y] = new Tile(Tile.DARK_GROUND, false, false);
// add tile as a new game object
addChild(map[x][y]);
// set the location of the tile appropriately
map[x][y].setLoc(x, y);
}
}
// create vertical corridor to connect rooms
private function vCorridor(y1:Int, y2:Int, x) {
for (y in Std.int(Math.min(y1, y2))...Std.int(Math.max(y1, y2)) + 1) {
// destroy the tiles to "carve" out corridor
map[x][y].parent.removeChild(map[x][y]);
// place a new unblocked tile
map[x][y] = new Tile(Tile.DARK_GROUND, false, false);
// add tile as a new game object
addChild(map[x][y]);
// set the location of the tile appropriately
map[x][y].setLoc(x, y);
}
}
这些功能几乎以相同的方式起作用,但是一个水平切割而另一个垂直切割。
为了做到这一点,我们需要三个值。对于水平走廊,我们需要起始x值,结束x值和当前y值。对于垂直走廊,我们需要起始和结束y值以及当前x值。
由于我们从左向右移动,我们需要两个相应的x值,但只有一个y值,因为我们不会向上或向下移动。当我们垂直移动时,我们将需要y值。在每个函数开头的for循环中,我们从起始值(x或y)迭代到结束值,直到我们划分出整个走廊。
直接引用文章。
我试图弄清楚如何在Swift中编写这些相同的for循环。我理解函数参数以及函数应该做什么。但是,我不了解这条线的快速等价物是什么:
for (x in Std.int(Math.min(x1, x2))...Std.int(Math.max(x1, x2)) + 1)
我翻译它的所有尝试都失败了。说实话,我完全糊涂了,不知道这条线甚至在做什么。
这是我目前的尝试:
func hCorridor(x1: Int, x2:Int, y: Int) {
for x in x1...x2 {
}
}
func vCorridor(y1: Int, y2:Int, x: Int) {
for y in y1...y2 {
}
}
(顺便说一句,它不起作用。)
到目前为止,我可以添加我的代码,但我不认为将大量代码转储到一个问题中是一个好主意。
关闭@ JeffWard的答案(意思是我认为他理解Haxe),Swift翻译将是:
let min_x = min(x1, x2)
let max_x = max(x1, x2)
for _ in min_x...max_x {
}
还有一些事情:
x1 == x2
。 (但在后一种情况下,你应该只通过循环两次。var
,;
或C风格的循环。编辑:
我马上想出了许多人会说更好或“更快”的东西! :-)
for _ in min(x1,x2)...(max(x1,x2) {
}
但是,我不了解这条线的快速等价物是什么:
for (x in Std.int(Math.min(x1, x2))...Std.int(Math.max(x1, x2)) + 1)
这在Haxe被称为range iteration:
for (x in a...b) { }
它相当于以下C风格的循环:
for (x=a; x<b; x++) { }
一旦你意识到它只是使用几个函数调用a
和b
,那个循环就不会让人困惑。虽然我不能告诉你等效的Swift代码,但我可以告诉你该循环的伪代码:
var min_x = smaller_of(x1, x2);
var max_x = larger_of(x1, x2);
for (x = min_x; x<max_x + 1; x++) { }
注意:您可以忽略Std.int()
,因为它只是将Float转换为Int。
您可能会发现Haxe manual对于您可能遇到的任何其他问题都非常方便。
您引用的haxe for-loop从最低x值迭代到最高值。 Math.min(x1,x2)将返回最低值,因此它可以从x1迭代到x2,或者x2到x1,具体取决于值。
Swift似乎有such comparison functions too,你当前的尝试似乎没有使用它或复制这个逻辑。