首  页 | 资讯中心 | 网络学院 | 天新汽车 | 天新手机 | 天新游戏 | 软件开发 | 考试认证
品 牌 机 | 笔 记 本 | 服 务 器 | 天新数码 - DC - DV - MP3 - MP4 - GPS - TV | 数字家庭
硬件 DIY - 主板 - CPU - 内 存 - 硬 盘 - 显示器 - 显卡 - 光驱 - 机箱 - 键鼠 - 网络设备
办公设备 | 打 印 机 | 扫 描 仪 | 投 影 仪 | 一 体 机 | 传 真 机 | 路 由 器 | 交 换 机
软件下载 | 驱动下载 | 游戏下载 | 源码下载 | 教程下载 | 站长在线 | 产品中心 | 报价中心
开发首页 | 开发语言 | .Net开发 | Java开发 | Web开发 | 移动开发 | 游戏开发 | 数据库开发 | 企业开发 | 操作系统 | 软件工程
VB VC Delphi PB BCB C++ - ASP.net C# VB.net - J2EE J2SE J2ME EJB - ASP PHP JSP CGI - MSSQL Oracle DB2 MySQL - CodingLife
  Java开发首页 | Java基础 | Java高级编程 | J2EE | J2SE | EJB | J2ME | Servlet/JSP | Applet/Swing | Struts/Hibernate
  您现在的位置:天新网 > 软件开发 > Java开发 > J2ME > 程序设计
J2ME游戏开发技巧
http://dev.21tx.com 2004年04月03日 张磊

每日文章精萃
.Net:ASP.NET创建并使用Web组件 Java:用Java生成文本文件
ASP:构建免受 FSO 威胁虚拟主机(三) PHP:第九节--绑定 -- Classes and Object
JSP:JSP由浅入深(6)JSP声明 CGI:CGI教程(9)编写安全的CGI脚本
VB:用vb实现DES加解密算法(三)(2) VC:一个显示树状目录的组合框类

1 2 3 下一页

  不久前我曾用J2ME开发了一个MotoT720下的彩色游戏—宝石方块(GridOne)。开发过程中积累了一些经验,现在写出来与大家分享。


  使用双缓冲避免屏幕闪烁


  双缓冲技术是编写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<ROWS;i++)
{
for(j=0;j<COLS;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游戏开发技巧
·利用J2ME与ASP建立数据库连接
·用 J2ME 进行联网
·J2ME开发手机游戏:宝石方块
·J2ME开发及JBuilder工具的应用
·利用J2ME与ASP建立数据库连接
·三维圈夹游戏人机编程
·用 J2ME 进行联网
·J2ME开发手机游戏:宝石方块
·KJava在移动设备中的应用
·J2ME开发及JBuilder工具的应用
·游戏引擎剖析(一)
·游戏引擎剖析(二)
·游戏引擎剖析(三)
·游戏引擎剖析(四)
最近更新
人气最热
·利用J2ME与ASP建立数据库连接
·用 J2ME 进行联网
·J2ME开发手机游戏:宝石方块
·J2ME开发及JBuilder工具的应用
·J2ME开发手机游戏:宝石方块
·J2ME开发及JBuilder工具的应用
·用 J2ME 进行联网
·利用J2ME与ASP建立数据库连接

 
·[硬件]老兵新传 3COM3c17206再降200元
·[数码]提防小手!史上最安全的iPod用保险套
·[汽车][西安]数千辆车被堵十余天 目前仍未畅
·[开发]IE相关的API
·[资讯]美国科学家称全球变暖正改变热带大气循
·[游戏]《冰封王座》中国2006城际电竞精英赛开
·[本本]绝不手软!AMD正式发布Turion64
·[办公]2006年独立功放音响时代全面来临
·[手机]简约精致 摩托罗拉超薄机L2仅售1298元
·[考试]百万年薪老总高校征"长相一般"女友
·[学院]学好二十二条“军规” 电脑维修经验点
·[娱乐]京华春梦
 

关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图
Copyright © 2000-2008 , www.21tx.com , All Rights Reserved .
© 晨新科技 版权所有 Created by TXSite.net