j2me游戏教程(3)如何使用上次构建的状态机框架,一直不停的绘制图形到屏幕
|
|
Author: 一滴蔚蓝色 | Date: 2007-02-22 |
View: 1843 |
开发技术 - 程序设计 | Digg:
0
|
|
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这回事即可. 更多阅读: |
|
| 最近更新 ( 2008-09-10 ) |
尚无评论发表