无法理解这些Haxe功能

问题描述 投票:-1回答:3

我一直在为我的游戏模仿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);
    }
}

这些功能几乎以相同的方式起作用,但是一个水平切割而另一个垂直切割。

Image 1

为了做到这一点,我们需要三个值。对于水平走廊,我们需要起始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 {

    }
}

(顺便说一句,它不起作用。)

到目前为止,我可以添加我的代码,但我不认为将大量代码转储到一个问题中是一个好主意。

ios swift haxe
3个回答
2
投票

关闭@ 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风格的循环。
  • 我试图强调这是“一个”Swift翻译。我相信别人可以做得更好。

编辑:

我马上想出了许多人会说更好或“更快”的东西! :-)

 for _ in min(x1,x2)...(max(x1,x2) {

 }

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 (x=a; x<b; x++) { }

一旦你意识到它只是使用几个函数调用ab,那个循环就不会让人困惑。虽然我不能告诉你等效的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
投票

您引用的haxe for-loop从最低x值迭代到最高值。 Math.min(x1,x2)将返回最低值,因此它可以从x1迭代到x2,或者x2到x1,具体取决于值。

Swift似乎有such comparison functions too,你当前的尝试似乎没有使用它或复制这个逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.