2013-01-08 33 views
0

我正在使用自己的平鋪磚引擎,這個使用的是六角磚 - 但我認爲它與普通磚沒有多大差別。Scaling tile grid

我有巨大的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

我的問題是如何將瓷磚轉換爲始終從中心縮放。所以如果在比例縮放之前10:10位於屏幕的中心,那麼在縮放之後它應該保持在那裏 。

回答

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

我沒有測試過這一點,我剛畫出來的圖紙。讓我知道它是否有效。

+0

是的,但這只是改變了每個瓷磚的寬度和高度的一半。這如何幫助縮放? – notmyrealname

+0

通過將瓷磚位置向左/向上移動縮放寬度/高度的一半,每個瓷磚的中心總是位於_tile.x,_tile.y,即使瓷磚被縮放。這是你的目標,還是我誤解了這個問題? – bwroga

+0

這是不同的。我需要將所有拼貼放在一起並放到一起,以便在縮放後保持10:10(或當時畫布中央的任何拼貼)。 我只能縮小比例,所以請保持中心位置10:10,以便將其偏移一些+ x + y值,我認爲這個值應該與「canvas」的尺寸和比例有關 – notmyrealname