我們說下Android游戲,當我們過關卡的時候游戲中或許出現場景切換,這對做游戲開發的同學們在熟悉不過了,這裡我簡單介紹下,一來自己鞏固下學習的知識,二來把我學習的心得分享出來,以便大家共同進步.
實現原理:首先我們對屏幕進行clipRect獲取相應的矩形模塊.然後在用圖片進行填充.
矩形(橫向)交差場景實現:
/***
* 矩形場景(橫向)
*/
public void doRect_H() {
/** 交錯的實現矩形相交 **/
int ractHeight = (mScreenHeight / ractCount);// 獲取每個矩形寬度.
// 左邊開始(偶數0,2,4...)
for (int i = 0; i < ractCount; i += 2) {
drawFillRect(mCanvas, Color.BLACK, 0, i * ractHeight, rectStep,
ractHeight);
}
// 右邊開始(奇數1,3,5...)
for (int i = 1; i < ractCount; i += 2) {
drawFillRect(mCanvas, Color.BLACK, mScreenWidth - rectStep, i
* ractHeight, rectStep, ractHeight);
}
}
我簡單講解下流程:針對屏幕我們分割成10條矩形,然後我們在對這10條矩形進行一一填充.而填充的就是下一個的場景.矩形(縱向)交差場景同理.
這裡要說明一點,你要理解canvas的save和restore方法.
save:用來保存Canvas的狀態。save之後,可以調用Canvas的平移、放縮、旋轉、錯切、裁剪等操作。
restore:用來恢復Canvas之前保存的狀態。防止save後對Canvas執行的操作對後續的繪制有影響。
save和restore要配對使用(restore可以比save少,但不能多),如果restore調用次數比save多,會引發Error。save和restore之間,往往夾雜的是對Canvas的特殊操作。
百葉窗場景實現:
/***
* 百葉窗場景
*/
public void doSQUARE() {
/** 百葉窗效果利用雙for循環 修改每個矩形繪制的寬度 **/
for (int i = 0; i <= (mScreenWidth / squareRange); i++) {// 算取寬包含多少個正方形,
for (int j = 0; j <= (mScreenHeight / squareRange); j++) {// 算去高包含多少正方形.
drawFillRect(mCanvas, Color.BLACK, i * squareRange, j
* squareRange, rectStep, rectStep);
}
}
}
簡單說明:根據View的寬高分割成若干個正方形然後一一進行填充.
滾動(向右)水紋場景:
/***
* 滾動水紋場景(右移動)
*/
public void doSHADOW_RINGHT() {
/***
* 在這裡我們要算去各個矩形的寬度以及起始的X坐標
*
* 注意要理解其含義.
*/
int X1 = rectStep + rectX1;// 矩形1的x坐標
int rectWidth1 = rectW + 12;// 矩形1的寬度
int X2 = X1 + rectWidth1 + rectX2;
int rectWidth2 = rectW + 5;
int X3 = X2 + rectWidth2 + rectX3;
int rectWidth3 = rectW;
/** 水紋效果其實繪制了4個矩形 中間留一些縫隙 **/
drawFillRect(mCanvas, Color.BLACK, 0, 0, rectStep, mScreenHeight);
drawFillRect(mCanvas, Color.BLACK, X1, 0, rectWidth1, mScreenHeight);
drawFillRect(mCanvas, Color.BLACK, X2, 0, rectWidth2, mScreenHeight);// 繪制第二條矩形
drawFillRect(mCanvas, Color.BLACK, X3, 0, rectWidth3, mScreenHeight);// 繪制第三條矩形
}
簡單說明:首先我們將屏幕分割四個長方形.第一個會時時增大及向右移動,而其余三個長方形也跟隨右移動,所以感覺類似於滾動波紋.滾動(向左)水紋場景同理.
橫向分割場:
/***
* 橫向分割圖片
*/
public void doHalf_V() {
int Y = mScreenHeight / 2;// 獲取中間分割線
int Y1 = Y - rectStep;// 上半部分X坐標
drawFillRect(mCanvas, Color.BLACK, 0, Y1, mScreenWidth, rectStep);// 繪制上部分
drawFillRect(mCanvas, Color.BLACK, 0, Y, mScreenWidth, rectStep);// 繪制下部分
}