Paint方法:
protected void paint(Graphics g) {
/** @todo Add paint codes */
}
這個方法是Game這個Canvas的。
我們在這裡只是繼承,並需要重寫。
它由系統調用,每當我們調用repaint()方法,系統就會去調用paint方法。
那個Graphics g 也是系統傳入的。
邏輯上是這樣的:
Graphics g,這個圖像處理參數,具有一些繪圖的API,
我們使用它在paint中寫好繪制圖像的方法之後,
一旦系統調用paint方法,就相當於開始進行繪制了。
比如:
在run這個方法中,添加repaint()方法。
public void run() {
while (true) {
System.out.println("xx");
repaint(); //意味著提醒系統去調用paint
}
}
不斷的調用repaint,就會使系統不斷的調用paint方法。
如果我們在paint方法中添加一個繪制圖形的語句:
protected void paint(Graphics g) {
g.setColor(0); //設置黑色
g.fillRect(0, 0, 128, 128); //填充一個矩形區域
}
然後運行,按模擬器的select,然後屏幕就一直有個128x128的方塊處於被刷黑狀態。
現在可以試試狀態機:
------------------------------
先定義一個static Graphics ourGraphics;
//我們用的Graphics.默認值是null(空)
然後,在paint中,把系統的g賦給我們的ourGraphics.
這樣做在於,以後我們也有了一個系統的Graphics了,可以用ourGraphics在別的方法裡面繪制,而不是只能跑到paint(Graphics
g)中使用g進行繪制。
protected void paint(Graphics g) {
if (ourGraphics == null) {
ourGraphics = g; //賦值一次就夠了
}
}
------------------------------
在Game.Java中,加個變量表示游戲狀態:
static int gameState = 0;
static int temp;
然後在run方法的 wile(true)裡面加上 switch語句:
while (true) {
switch (gameState) {
case 0:
repaint(); // 得到ourGraphics變量。
gameState = 1; //
改變gameState,讓他變成1,下一次循環就會到 case 1
的狀態。
break;
case 1:
if (ourGraphics == null) {
return;
//如果這個變量還沒有被賦值,啥也不干。有的時候調用repaint之後,系統調用paint會遲一些,所以ourGraphics仍然可能處於null(空)的狀態。
}
ourGraphics.setColor(0); //設置黑色
ourGraphics.fillRect(0, 0, 128, 128);
//填充一個矩形區域
ourGraphics.setColor(0x00ff00);
//設置綠色,畫一個小綠框。下面有講顏色。
ourGraphics.fillRect(20, 20, 88, 88);
temp++;
if (temp == 1000) {
gameState = 2;
//可以給gameState的改變加些條件,例如,case
1運行了1000次以後,才把它變成 case 2
}
break;
case 2:
ourGraphics.setColor(0);
ourGraphics.fillRect(0, 0, 128, 128);
ourGraphics.setColor(0xffffff);
//設置為白色。Java中0x開頭表示16進制。0xffffff中的 ff
ff ff分別表示R,G,B三種顏色,
//在Photoshop的前景或背景的顏色選擇器中選一種顏色,下面就有這種顏色的16進制值。
//例如: 0xff0000 代表紅, 0x00ff00代表綠,
0x0000ff代表藍
ourGraphics.drawString("Fuck Man! It's New Game!", 128
//畫一個字符串。具體參數以後再講,
//如果在這個狀態中不改變gameState這個變量,程序就會一直處於這個狀態,畫字符串。
break; //記住加break
}
repaint(); //
為什麼在這兒還加repaint()?因為使用Graphics畫東西還不夠,還必須調用repaint,讓系統調用其他方法之Graphic畫的東西刷新在屏幕上。
//現在流行的方法是把狀態機放在paint()中,下面有示例,和這個一摸一樣,只不過是把switch移動一下。
}
把狀態機放在paint()中的例子:
-------------------------------------
while (true) {
repaint();//就留這一句。
switch (gameState) {
case 0:
repaint();
gameState = 1;
break;
case 1:
if (ourGraphics == null) {
return;
}
ourGraphics.setColor(0);
ourGraphics.fillRect(0, 0, 128, 128);
ourGraphics.setColor(0x00ff00);
ourGraphics.fillRect(20, 20, 88, 88);
temp++;
if (temp == 1000) {
gameState = 2;
}
break;
case 2:
ourGraphics.setColor(0);
ourGraphics.fillRect(0, 0, 128, 128);
ourGraphics.setColor(0xffffff);
ourGraphics.drawString("Fuck Man! It's New Game!", 128
break;
}