程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> j2me游戲教程(三)——如何使用上次構建的狀態機框架,一直不停的繪制圖形到屏幕上!

j2me游戲教程(三)——如何使用上次構建的狀態機框架,一直不停的繪制圖形到屏幕上!

編輯:J2ME
J2ME游戲教程(三)——如何使用上次構建的狀態機框架,一直不停的繪制圖形到屏幕上! 作者:iooirrr    文章來源:J2MEdev.com    更新時間:2006-12-13 10:06:18 278

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

>> 1, 128 >> 1, Graphics.TOP | Graphics.HCENTER);

                //畫一個字符串。具體參數以後再講,

>>是Java中的右移符號 ,>> 1相當於除以2,在J2ME中位移很常見。

//如果在這個狀態中不改變gameState這個變量,程序就會一直處於這個狀態,畫字符串。
                break; //記住加break
            }

            repaint(); //
為什麼在這兒還加repaint()?因為使用Graphics畫東西還不夠,還必須調用repaint,讓系統調用其他方法之Graphic畫的東西刷新在屏­幕上。

//現在流行的方法是把狀態機放在paint()中,下面有示例,和這個一摸一樣,只不過是把switch移動一下。
        }

把狀態機放在paint()中的例子:
-------------------------------------
while (true) {
        repaint();//就留這一句。

}
-------------------------------------
protected void paint(Graphics g) {
   if (ourGraphics == null) {
                   ourGraphics = g;
   }

         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

>> 1, 128 >> 1, Graphics.TOP | Graphics.HCENTER);

                break;
   }

}
-------------------------------------
如果獲得API幫助??
-------------------------------------
例如,我想知道Graphics裡面有哪些畫圖或者畫字符串的方法,參數的意義是什麼,怎麼辦?
在JBuilder裡,把鼠標移到Graphics
g上,左鍵點一下,然後按F1,
Graphics這個類的說明就有了。
在Method
Summary區域,可以看到他的所有方法。比如,fillRect,點進取就有詳細說明。
JBuilder的幫助做的窗口很小,看起來不方面。
直接到JBuilder的J2MEwtk的安裝目錄:
例如:E:\JBuilder2005\J2MEwtk2.1\docs\api\midp
然後打開index.Html,然後點上面一個index(在help旁邊)
如果要查Graphics,就點字母G,然後按字母排序找就行了.比較麻煩.
可以Ctrl+ F 輸入Graphics,
只要找到一個連接,點進去之後就可以看說明了.
目前,大概知道有查API這回事即可.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved