Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制javascript画布中的平铺区域_Javascript_Canvas_Tiles - Fatal编程技术网

复制javascript画布中的平铺区域

复制javascript画布中的平铺区域,javascript,canvas,tiles,Javascript,Canvas,Tiles,我有一张画布,上面显示着一张平铺地图。滚动时,我不想刷新整个平铺列表,而是想选择可以重用的平铺贴图的有用部分,并将其复制到另一个画布 例如,如果平铺贴图的宽度为5个平铺: 0 1 2 3 4 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 我想向右移动(x)1个瓷砖。。。我可以复制瓷砖1到4,因为它们将在下一帧中使用。因此,我将复制: 1 2 3 4 2 3 4 5 3 4 5 6 4 5 6 7 5 6 7 8 我似乎很难想出正确的数学 目前,我有以下代码:

我有一张画布,上面显示着一张平铺地图。滚动时,我不想刷新整个平铺列表,而是想选择可以重用的平铺贴图的有用部分,并将其复制到另一个画布

例如,如果平铺贴图的宽度为5个平铺:

0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
我想向右移动(x)1个瓷砖。。。我可以复制瓷砖1到4,因为它们将在下一帧中使用。因此,我将复制:

1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
我似乎很难想出正确的数学

目前,我有以下代码:

// Calculate from and to for x and y
// Change formula if positive or negative movement
    // movX / movY = amount to move across x or y
    // (i.e. movX = 1 (right) or movX = -1 (left)
    // tileXFrom / tileYFrom = tile to start copy from
    // tileXTo / tileYTo = tile to finish copying at
if(movX > 0)
{
    tileXFrom = origX + movX;
    tileXTo = tileXFrom + (tilesCountX - movX);
}
else
{
    tileXFrom = origX;
    tileXTo = tileXFrom + (tilesCountX + movX);
}

if(movY > 0)
{
    tileYFrom = origY + movY;
    tileYTo = tileYFrom + (tilesCountY - movY);
}
else
{
    tileYFrom = origY;
    tileYTo = tileYFrom + (tilesCountY + movY);
}
这些计算很好,但是有更好的方法吗?我想知道是否有办法绕过肯定/否定的if语句

我现在要做的是如何得到每个对象的真实x,y位置

因此,我需要将磁贴1,0转换为屏幕上的x,y位置,以便从那里开始复制

如果这一切都有意义


干杯

您可以使用三元运算符缩短代码,但这不会改变功能:

tileXFrom = (movX > 0) ? origX + movX : origX;
tileXTo   = (movX > 0) ? tileXFrom + (tilesCountX - movX) : tileXFrom + (tilesCountX + movX);
tileYFrom = (movY > 0) ? origY + movY : origY;
tileYTo   = (movY > 0) ? tileYFrom + (tilesCountY - movY) : tileYFrom + (tilesCountY + movY);

在您的上下文中,瓷砖到底是什么?它是某种可重用对象吗?这就是我将如何实现它。例如,使用,从一个地方移动(或复制)分片到另一个地方是很简单的。它是游戏循环中的分片地图。如果已经绘制了平铺贴图,那么将其重新绘制到画布上没有意义,因此将已经绘制的位复制到新画布上,然后只填充剩余的平铺。谢谢,它们看起来肯定比以前更好。关于转换成x,y有什么想法吗?