【问题标题】:Scaling tile grid缩放平铺网格
【发布时间】:2012-12-22 08:11:06
【问题描述】:

我正在开发自己的 tile bliting 引擎,这个引擎使用的是六边形 tile - 但我认为它与常规 tile 没有太大区别。

我有巨大的 x,y 瓷砖数组,它们有用于在画布上渲染的 x,y 坐标,我只迭代在当前相机位置上应该在画布上可见的那些。

所以我坚持缩放并且无法自己解决这个问题。 这是我在画布上绘制图块的代码:

public function draw():Void{
    clearCanvas(); //Clear canvas (bitmapData)
            var _m:Matrix;
            iterateTiles(function(_tile:HexTile):Void{ // loop every tile that is visible on screen
                _m = new Matrix();
                _m.translate(_tile.x + cameraPoint.x,_tile.y  + cameraPoint.y);//Get pre calculated tile x,y and add camera x,y
                _m.scale(matrixScale, matrixScale);
                drawToCanvas(_tile,_m);//Send to draw tile on canvas using Matrix
            },true);
        }

这很好用而且速度很快,但唯一的问题是它从左上角缩放图块(就像常规缩放一样)

Before scale


After scale

我的问题是如何将图块转换为始终从中心缩放。因此,如果 tile 10:10 在缩放之前位于屏幕中心,那么它应该 缩放后留在那里。

【问题讨论】:

    标签: actionscript-3 matrix grid scaling tile


    【解决方案1】:

    对不起,我误解了这个问题,但我想我现在明白了:

    // Scale the distance from the original point to the center of the canvas
    var xDistance:Number = ((_tile.x + cameraPoint.x) - xCenter) * matrixScale;
    var yDistance:Number = ((_tile.y + cameraPoint.y) - yCenter) * matrixScale;
    
    // Add the distances to the center of the canvas. This is where you want the tile 
    // to appear.
    var x:Number = xCenter + xDistance;
    var y:Number = yCenter + yDistance;
    
    // Because the coordinate is going to be scaled, you need to increase it first.
    x = (1 / matrixScale) * x;
    y = (1 / matrixScale) * y;
    
    _m.translate(x, y);
    

    我没有测试过这个,我只是在方格纸上画出来的。让我知道它是否有效。

    【讨论】:

    • 是的,但这只是将每个图块的位置更改为宽度和高度的一半。这对扩展有什么帮助?
    • 通过将瓦片位置向左/向上移动缩放宽度/高度的一半,每个瓦片的中心将始终位于 _tile.x、_tile.y 处,即使在瓦片被缩放时也是如此。这是你的目标,还是我误解了这个问题?
    • 这是不同的东西。我需要将所有图块一起缩放并一起偏移,以在缩放后将 10:10(或当时位于画布中心的任何图块)保持在中心。我只是按比例缩小,所以将 10:10 保持在中心,这将涉及将它偏移一些 +x +y 值,我认为这个值应该与“画布”的尺寸和比例有关
    • 他不担心单个图块,而是同时关注所有图块,这样缩放就不会将它们向上和向左移动。您需要计算缩放时发生的偏移 x,y。例如,如果瓷砖 10,10 在比例之后移动 -50 x 和 -50 y,则找出一个处理所有比例的公式并将其添加到绘图函数中。代码的问题在于屏幕上的图块数量会发生变化,因此您可能需要重新考虑如何渲染它们。
    • 请看我上面修改后的答案。
    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多