0

私は独自のタイル ブリッティング エンジンに取り組んでいます。これは六角形のタイルを使用していますが、通常のタイルとあまり変わらないと思います。

タイルの巨大な 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);
        }

これはうまく機能しますが、唯一の問題は、左上隅からタイルをスケーリングすることです(通常のスケーリングが機能するように)

スケール前


スケール後

私の質問は、常に中心から拡大縮小するようにタイルを変換する方法です。したがって、スケーリング前にタイル 10:10 が画面の中央にある場合、スケーリング後もそこにとどまります。

4

1 に答える 1

0

申し訳ありませんが、質問を誤解していましたが、今は理解できたと思います:

// 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);

私はこれをテストしていません。方眼紙に描いただけです。うまくいくかどうか教えてください。

于 2013-01-08T14:07:41.063 に答える