赛迪网 > IT技术 Java > (最新更新)Java基础
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

J2ME游戏开发技巧 (1)

发布时间:2006.04.03 14:43     来源:www.0240.cn    作者:

使用双缓冲避免屏幕闪烁

双缓冲技术是编写J2ME游戏程序的关键技术之一。实际上,双缓冲技术是计算机动画的一项传统技术。造成屏幕闪烁的主要原因在于,画面在显示的同时,程序又在改变它,于是画面闪烁。解决办法就是在内存中开辟一片区域作为后台画面,程序对它更新,修改,完成后再显示它。这样被显示的图像永远是已经完全画好的图像,程序修改的将不是正在被显示的图像。当然还有其它方法可以解决屏幕闪烁问题,但使用双缓冲技术是一种值得推荐的解决方案。具体方法可参见如下代码:

public class BlocksCanvas extends Canvas implements Runnable


{


Graphics bg;


Image buf;


public BlocksCanvas()


{


......


height = getHeight();


width = getWidth();


//按屏幕大小建立缓冲对象


buf = Image.createImage(width, height);


//将缓冲对象的Graphics附给bg


bg = buf.getGraphics();


......


}


public void run()


{......


for(i=0;i

{


for(j=0;j

{//画方块


drawBlock(x,y);


}


}


repaint();


}


private void drawBlock(int block_x, int block_y)


{


//取得方块的坐标


int x = getLeft(block_x);


int y = getTop(block_y);


//取得方块的颜色


int c= board[block_x][block_y];


bg.drawImage(imgs[c], x, y, Graphics.TOP | Graphics.LEFT);


}

public void paint(Graphics g)


{


g.drawImage(buf, 0, 0, Graphics.TOP | Graphics.LEFT);


}


}

由上面代码可见,双缓冲思想体现在程序上就是要依次完成以下几步工作:

   1. 定义一个Graphics对象bg和一个Image对象buf,按屏幕大小建立一个缓冲对象附给buf,然后取得buf的Graphics对象附给bg。在这里,Graphics对象可以理解为缓冲的屏幕,Image对象则可当成缓冲屏幕上的图片。

   2. 在bg(缓冲屏幕)上用drawImage()和drawString等语句画图,相当于在缓冲屏幕上画图。

   3. 调用repaint()语句,它的功能是告知系统调用paint()来完成真实屏幕的显示。这里需要注意的是,paint()是一个系统调用语句,不能手工调用,只能通过paint()语句来调用。

   4. 在paint(Graphics g)函数里,将buf(缓冲屏幕上的图片)画到真实屏幕上。

   以上的步骤虽然看似繁琐,但是效果还是很不错的。如果想要在屏幕上显示什么东西,只管画在bg上,然后调用repaint()将其显示出来就可以了。

编写自己的断点函数





   图1 断点测试


   在开发J2ME程序过程中,最困扰人的问题就是程序容易莫名其妙地死机。当使用JBuilder或者CodeWarrior设置断点功能来查找程序错误时,死机的概率就更大了。即使不死机,也会担心程序受到了意外的干扰,所以一般不推荐使用开发工具自带的断点功能。但有时候又需要一个功能来显示当前各变量的值,以便查错时做出正确的判断。于是我想了一个办法,就是编写自己的断点函数。具体代码如下:
public class BlocksCanvas extends Canvas implements Runnable


{


private boolean stopFlag=false;//调试标志


......


public void run()


{


//断点位置1


testFun(“x:”+x+“y:”+y);


......


//断点位置2


testFun(“”);


......


}


private void testFun(String str)


{


stopFlag=true;


//画一个白色长方形


bg.setGrayScale(255);


bg.fillRect(0,0, fontW, fontH);


//在白色长方形上显示str的内容


bg.setGrayScale(0);


bg.drawString(str, 0,0, Graphics.TOP | Graphics.LEFT);


repaint();





while(stopFlag){}


}

public void keyPressed(int keyCode)


{


stopFlag=false;


}


}

首先定义一个boolean类型的stopFlag变量来记录调试标志。一开始它的值为false,进入testFun()函数后,值设为true。显示完str的内容后,因为stopFlag的值为true,所以while语句进入了死循环,程序停了下来。这时可以仔细地看清楚变量的值。然后当按下任意键时,keyPressed()函数捕捉到这一事件,将stopFlag设为false,死循环自动解开。使用此方法非常方便,只要在需要断点的地方放置testFun()语句即可,一个程序可以放置多个testFun()语句,在循环语句中也可以放置testFun()语句。程序运行到testFun()语句会自动停下显示变量值,按任意键程序又会自动运行,程序也不会受到意外的干扰。图1是调试时的截图。

   还有一点需要说明,此方法的testFun()语句必须放在run()函数中或者run()函数运行时调用的函数中,否则就会因为while()占用了所有CPU时间而导致keyPressed()函数无法捕捉按键事件,最后导致死机。

   此方法只要稍加修改,就可以用做游戏的暂停功能,而且比sleep()方法好,毕竟理论上sleep()方法不能无限期暂停下去。下面给出相应的代码:

public class BlocksCanvas extends Canvas implements Runnable


{


private boolean stopFlag=false;//暂停标志


......


public void run()


{......


testFun();


......


}





private void testFun()


{


while(stopFlag){}


}

public void keyPressed(int keyCode)


{


int action = getGameAction(keyCode);


if(action== FIRE)stopFlag=!stopFlag;


}


}

该程序段的功能为,当使用者按下FIRE键时,游戏暂停;再次按下FIRE键,游戏继续运行。 

1 2 3 下一页>>


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· J2ME平台简介 (04-03) · NetBeans 4.0创建J2ME手机RSS阅读器 (04-03)
· J2ME开发站点资源 (04-03) · 使用J2ME与MIDP进行手机开发的全工略 (04-03)
· 用简单的J2ME程序测试MIDlet生命周期 (04-03) · J2ME中使用记录存储系统(RMS)存储信息 (04-03)
· MVC模式在J2ME项目中的实际应用 (04-03) · 在J2ME手机编程中内存的优化三招 (04-03)
· J2ME开发中记录管理系统的详细介绍 (04-03) · J2ME开发中如何从MIDlet中调用JSP页面 (04-03)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 网银交易收费 我国银行业如何达国际化标准
· 家庭信息化普及率提高 网上缴费成为新时尚
· 五条黄金准则能够让CIO巧妙加薪 CIO焦虑调查
· 网上书店解决方案 深圳边检指挥中心ITSM项目
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统