无法理解这些Haxe函数

时间:2018-09-06 15:26:21

标签: ios swift haxe

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

这些功能的作用几乎相同,但其中一个水平地切开,另一个垂直地切开。

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 {

    }
}

(顺便说说是行不通的。)

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

3 个答案:

答案 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++) { }

该循环不会造成混乱,一旦您意识到它只是使用了几个函数调用,如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 :(得分: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样式循环。
  • 我试图强调这是“ a” Swift翻译。我相信其他人可以做得更好。

编辑:

我立即想出了很多人会说更好还是“更快”的说法! :-)

 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,您当前的尝试似乎没有使用它或复制了此逻辑。