我一直在为自己的游戏模仿this article。这篇文章是关于程序生成地牢地图的。我已经成功翻译了本文中的大多数Haxe代码。我翻译的大多数代码都是通过猜测和反复试验来实现的。我有一个我不完全了解的部分:
现在的目标是连接每个房间,以便我们可以穿过地牢并最终到达通往下一个楼层的出口。我们可以通过在房间之间划出走廊来实现。
我们需要在代码中添加一个point变量,以跟踪创建的每个房间的中心。每当我们创建并放置一个房间时,我们都会确定其中心并将其连接到先前房间的中心。
首先,我们将实现走廊:
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 {
}
}
(顺便说说是行不通的。)
到目前为止,我可以添加我的代码,但是我认为将大量代码转储到问题中并不是一个好主意。
答案 0 :(得分:3)
但是,我不知道该行的等效速度是什么
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循环:
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非常方便。
答案 1 :(得分:2)
要解决@JeffWard的答案(这意味着我想他了解Haxe), a 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) {
}
答案 2 :(得分:1)
您引用的haxe for循环从最低的x值迭代到最高的x。 Math.min(x1,x2)将返回最小值,因此可以根据值从x1迭代到x2,或从x2迭代到x1。
Swift似乎有such comparison functions too,您当前的尝试似乎没有使用它或复制了此逻辑。