欢迎来到天天文库
浏览记录
ID:5312363
大小:288.83 KB
页数:12页
时间:2017-12-07
《j2me手机游戏开发技巧》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、J2ME手机游戏开发技巧双缓冲技术是编写J2ME游戏程序的关键技术之一。实际上,双缓冲技术是计算机动画的一项传统技术。造成屏幕闪烁的主要原因在于,画面在显示的同时,程序又在改变它...不久前我曾用J2ME开发了一个MotoT720下的彩色游戏—宝石方块(GridOne)。开发过程中积累了一些经验,现在写出来与大家分享。使用双缓冲避免屏幕闪烁双缓冲技术是编写J2ME游戏程序的关键技术之一。实际上,双缓冲技术是计算机动画的一项传统技术。造成屏幕闪烁的主要原因在于,画面在显示的同时,程序又在改变它,于是画面闪烁。解决办法就是在内存中开辟一片区域作为后台画面,程序对它更新
2、,修改,完成后再显示它。这样被显示的图像永远是已经完全画好的图像,程序修改的将不是正在被显示的图像。当然还有其它方法可以解决屏幕闪烁问题,但使用双缓冲技术是一种值得推荐的解决方案。具体方法可参见如下代码:publicclassBlocksCanvasextendsCanvasimplementsRunnable{Graphicsbg;Imagebuf;publicBlocksCanvas(){height=getHeight();width=getWidth();//按屏幕大小建立缓冲对象buf=Image.createImage(width,height);//
3、将缓冲对象的Graphics附给bgbg=buf.getGraphics();......}publicvoidrun(){......for(i=0;i{for(j=0;j{//画方块drawBlock(x,y);}}repaint();}privatevoiddrawBlock(intblock_x,intblock_y){//取得方块的坐标intx=getLeft(block_x);inty=getTop(block_y);//取得方块的颜色intc=board[block_x][block_y];bg.drawImage(imgs[c],x,y,Graph
4、ics.TOPGraphics.LEFT);}publicvoidpaint(Graphicsg){g.drawImage(buf,0,0,Graphics.TOPGraphics.LEFT);}}由上面代码可见,双缓冲思想体现在程序上就是要依次完成以下几步工作:1.定义一个Graphics对象bg和一个Image对象buf,按屏幕大小建立一个缓冲对象附给buf,然后取得buf的Graphics对象附给bg。在这里,Graphics对象可以理解为缓冲的屏幕,Image对象则可当成缓冲屏幕上的图片。2.在bg(缓冲屏幕)上用drawImage()和drawStrin
5、g等语句画图,相当于在缓冲屏幕上画图。3.调用repaint()语句,它的功能是告知系统调用paint()来完成真实屏幕的显示。这里需要注意的是,paint()是一个系统调用语句,不能手工调用,只能通过paint()语句来调用。4.在paint(Graphicsg)函数里,将buf(缓冲屏幕上的图片)画到真实屏幕上。以上的步骤虽然看似繁琐,但是效果还是很不错的。如果想要在屏幕上显示什么东西,只管画在bg上,然后调用repaint()将其显示出来就可以了。编写自己的断点函数。图1:断点测试在开发J2ME程序过程中,最困扰人的问题就是程序容易莫名其妙地死机。当使用JB
6、uilder或者CodeWarrior设置断点功能来查找程序错误时,死机的概率就更大了。即使不死机,也会担心程序受到了意外的干扰,所以一般不推荐使用开发工具自带的断点功能。但有时候又需要一个功能来显示当前各变量的值,以便查错时做出正确的判断。于是我想了一个办法,就是编写自己的断点函数。具体代码如下:publicclassBlocksCanvasextendsCanvasimplementsRunnable{privatebooleanstopFlag=false;//调试标志......publicvoidrun(){//断点位置1testFun(“x:”+x+“
7、y:”+y);......//断点位置2testFun(“”);......}privatevoidtestFun(Stringstr){stopFlag=true;//画一个白色长方形bg.setGrayScale(255);bg.fillRect(0,0,fontW,fontH);//在白色长方形上显示str的内容bg.setGrayScale(0);bg.drawString(str,0,0,Graphics.TOPGraphics.LEFT);repaint();while(stopFlag){}}publicvoidkeyPressed(intkeyCo
8、de){s
此文档下载收益归作者所有