获取 tileset 上的 tile 的 X 和 Y

get X and Y of a tile on a tileset

我正在尝试编写 returns 一个图块在图块集中的位置的函数。

我为此编写了一些代码,但这似乎不必要地复杂。

每个方块如何有一个数字:

// My old code:

    function getXPosByNumber(width, height, tilesize, tilenumber) {
    if ((tilenumber % (width / tilesize) - 1) < 0) {
        return width - tilesize;
    } else {
        return (tilenumber % (width / tilesize) - 1) * tilesize;
    }
}

function getYPosByNumber(width, height, tilesize, tilenumber) {
    return (Math.ceil(tilenumber / (width / tilesize)) - 1) * tilesize;
}

如何使用 cleaner/simpler 代码访问任何坐标的图块?

谢谢。

如果这个 tileset 总是相同的,我建议创建一种查找 table。将存储每个图块编号的预先计算位置的对象。由于您只需要访问对象的 属性。

,它将变得更加简单和快速

以下是我想到的要简化的内容。我发现高度与计算 X 或 Y 无关。这里的重要因素是它水平分布的程度。

然后,由于特定的 tileset 更可能始终具有相同的宽度和 tilesize,我建议使用更 "Object" 化的方法,这样您就不必经常记住它的配置。就个人而言,我喜欢包装常量和配置,这样我可以在之后编写轻量级代码:

var tileset = function(width, tilesize) {
    this.width = width;
    this.tilesize = tilesize;
};

// calculate X by tilenumber
tileset.prototype.getX = function(tilenumber) {
    return (tilenumber % this.width - 1) * this.tilesize;
};

// calculate Y by tilenumber
tileset.prototype.getY = function(tilenumber) {
    return Math.floor(tilenumber / this.width) * this.tilesize;
};

这允许您像这样使用它:

var mySet = new tileset(6, 10); // width=6, tilesize=10
var x = mySet.getX(16); // tilenumber=16
var y = mySet.getY(16); // tilenumber=16

要查看实际效果,请选中此 FIDDLE

请注意,它计算的是左上角的位置。如有需要,可另行调整。

希望对您有所帮助!