在tileset

时间:2016-09-03 21:13:20

标签: javascript math canvas game-engine tile

我试图编写一个函数来返回tileset上tile的位置。

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

每个瓷砖的编号如何:

img



// 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;
}
&#13;
&#13;
&#13;

如何使用更干净/更简单的代码访问任何tile coordonates?

感谢。

2 个答案:

答案 0 :(得分:0)

如果这个tileset始终相同,我建议创建一种查找表。将存储每个图块编号的预先计算位置的对象。它会更加简单和快速,因为您只需要访问对象的属性。

答案 1 :(得分:0)

这是我想要简化的内容。我发现高度与计算X或Y无关。这里重要的因素是它在水平方向上传播的程度。

然后,由于特定的tileset更可能总是具有相同的宽度和tileize,我建议采用更“对象”的方法,这样您就不必经常记住它的配置。就个人而言,我喜欢包装常量和配置,以便我可以在之后编写轻量级代码:

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

请注意,它会计算左上角的位置。如果需要,可以进行其他调整。

希望这有帮助!