您现在的位置: J2ME开发网 >> Java技术 >> 游戏开发 >> 文章正文
j2me游戏教程(3)如何使用上次构建的状态机框架,一直不停的绘制图形到屏幕上!
作者:iooirrr    文章来源:本站原创    点击数:    更新时间:2006-11-17

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这回事即可.