靜態繪製(二)
圖元的位置變換
這篇文章主要介紹圖元位置變換方法。
[位置變換]:
再次提醒:默認分辨率爲800X600,這裏使用的圖形單位以分辨率爲準,而非OpenGl上下文式的座標,這點請注意。
我們繼續使用上節中的例子:
public static void main(String[] args) {
UESI UES = new R();
Obj rect = UES.creatObj(UESI.BGIndex);
rect.addGLRect("FFFFFF",0,0,300f,300f);
rect.addGLLine("00FF00",0,0,300f,300f);
rect.addGLOval("FFFF00",0,0,300f,300f);
rect.show();
rect.setDx(100);
rect.setDy(100);
}
其實我們已經使用了位置變換方法中的setDx與setDy了,它們會將圖元位置設置在指定的座標位置,我們繪製圖形時都是以原點爲起點繪製的,之後使用set方法將其偏離原點100個像素,因爲以原點繪製圖形較爲容易。
拋棄座標: 但沒人願意校準座標的,相信我;假如此時我們希望將這個圖元放到屏幕中心,該如何呢?計算座標麼?我在很多遊戲UI設計時花費了大量的時間校準座標,這相當不值得,因此纔有了校準API:
使用rect.setPosition(CANExPos.POS_CENTER);方法替換掉兩個set方法。
Obj rect = UES.creatObj(UESI.BGIndex);
rect.addGLRect("FFFFFF",0,0,300f,300f);
rect.addGLLine("00FF00",0,0,300f,300f);
rect.addGLOval("FFFF00",0,0,300f,300f);
rect.show();
rect.setPosition(CANExPos.POS_CENTER);
校準API詳解:
其中,FLAG參數是CANExPos或CANRefPos接口中的靜態量。CAN開頭的接口是圖形標準,Obj已經將他們全部實現。
在上述setPosition方法中分爲兩類,一種是絕對定位類,它定位相對於屏幕的位置,Flag使用CANExPos中的值。
另一種是相對座標類(其參數包含了rO),它用於相對其他圖元進行定位。Flag使用CANRefPos中的值。
=====================================================
絕對定位FLAG
POS_CENTER:圖元中心校準在屏幕中心,也就是上例所用。
POS_CORNER系列對應於屏幕四個角
POS_X、Y系列對應於X、Y軸位置。
當然,我們可以使用包含margin參數的重載進行縮進,例如,我們希望把圖形放置在屏幕右上角,並進行縮進100個單位:
只需要將:rect.setPosition(CANExPos.POS_CENTER);
替換爲:rect.setPosition(CANExPos.POS_CORNER_RIGHTTOP,100f);
結果:
縮進指的是橫縱向縮進,而非斜向;
setPosition除了提供margin重載外,還提供了圖形索引重載,可以對圖元中的指定圖形進行校準。
Margin參數是float型,如果大意寫成了Int型,則會進行視圖索引重載方法,而產生潛在的越界異常。
相對定位Flag
這些常量的名字比較容易理解:
CORNER系列爲角相對位置,LEFTTHAN\RIGHTTHAN\BOTTOMTHAN\TOPTHAN分別對應在rO左、右、下、上的位置,當然你也可以使用margin進行相對縮進。
相對定位需要一個相對的標準(rO),它可以是一個圖元Obj。
例子:
Obj rect =UES.creatObj(UESI.BGIndex);
rect.addGLRect("FFFFFF",0,0,300f,300f);
rect.addGLLine("00FF00",0,0,300f,300f);
rect.addGLOval("FFFF00",0,0,300f,300f);
rect.show();
rect.setPosition(CANExPos.POS_CENTER);
//以上是中心位置的例子,在下面進行拓展。
Obj rect2 = UES.creatObj(UESI.BGIndex);
rect2.addGLRect("004FFF",0,0,300f,100f);
rect2.setPosition(CANRefPos.RPO_Y_BOTTOMTHAN, rect);
rect2.show();
結果:
我們創建了300X100的藍色矩形rect2,並將其放置在rect1的下方。
獲得圖元座標:
使用setDx()\setDy()可以設置圖元座標。
同理,使用getDx()\getDy()可以獲得圖元當前座標。
當然,它們包含有圖元索引重載,你可以獲得圖元中某一圖形的位置座標。
除了位置座標
一個圖元圖形如果包括了兩個以上的點,例如矩形,除了標示位置的座標DxDy外,還有其四個點座標(注意位置座標並不是第一個頂點的座標,它們僅是在未進行旋轉變換前恰巧重合着);對於多點圖形的頂點座標,可使用getDxs\getDys方法獲得,你可以使用getPointNumber方法獲得圖形的頂點數。
[例子]
在相對定位例子中末尾,加入如下語句:
for(int i = 0;i < 4;i++){
System.out.println(rect2.getDxs(i) +"," + rect2.getDys(i));
}
控制檯打印結果:
250.0,450.0
550.0,450.0
550.0,550.0
250.0,550.0
同樣,你可以使用setDxs\setDys方法設置這些座標,它們同樣具備圖元索引重載。
[總結]
通過這一節內容,我們知道了改變圖元位置的各種方法,包括使用setDx、setDy這樣的直接設置法,也包括校準API中的絕對校準與相對校準。最後,我們介紹了獲得圖元座標或圖元內圖形座標的方法,以及除去位置座標,圖形頂點的座標的設置及獲得方法。