j2me游戏教程(3)如何使用上次构建的状态机框架,一直不停的绘制图形到屏幕

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,然后屏幕就一直有个128×128的方块处于被刷黑状态。

现在可以试试状态机:
——————————
先定义一个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这回事即可.