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