科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道J2ME游戏开发技巧

J2ME游戏开发技巧

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

不久前我曾用J2ME开发了一个MotoT720下的彩色游戏―宝石方块(GridOne)。开发过程中积累了一些经验,现在写出来与大家分享。   使用双缓冲避免屏幕闪烁   双缓冲技术是编写J2ME游戏程序的关键技术之一。

作者:中国IT实验室 来源:中国IT实验室 2007年9月22日

关键字: 游戏 J2ME

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共3页)

  首先定义一个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键,游戏继续运行。

  编写自己的工具类

  因为手机内存和功能的限制,J2ME只提供了部分的J2SE工具类供使用者调用。所以有时我们不得不编写自己的工具类来实现一些特殊的功能。下面给出的kSet类就类似于J2SE中Set工具类的功能。它用来记录游戏中被删去的方块集合,同时保证集合中没有相同元素。

/**
*<p>Description: Set类在J2ME上的实现</p>
*<p>Date:2003.2.28</p>
*<p>Author:TomJava</p>
*<p>email:tomjava@sohu.com</p> 
*/
public class kSet
{//用单链表实现
 private kSetNode head;
 public kSet()
 {
  head=null;
 }
 //将kSet清空
 public void clear()
 {
  head=null;
 }
 //向kSet中添加元素                    
 public boolean add(int x,int y)
 {
  kSetNode node=new kSetNode(x,y);
  return add(node);
 }
 //向kSet中添加元素
 public boolean add(kSetNode node)
 { 
  if(!contains(node))
  {  
   node.next=head;
   head=node;
   return true;
  }else
  {
   return false;
  }
 }
 //判断kSet是否为空
 public boolean isEmpty()
 {
  if(head==null)
   return true;
  else
   return false;
 }
 //摘下链表头元素并返回此元素
 public kSetNode getFirst()
 {  
  kSetNode p=head;
  head=p.next;
  return p;
 }
 //遍历kSet,如果有相同元素返回true,否则返回false    
 public boolean contains(kSetNode node)
 {
  kSetNode p = head;
  while (p != null) {
   if(p.equals(node))return true;
   p=p.next;   
  }
  return false;
 } 
}
//kSet中的元素
public class kSetNode
{ 
 public int x,y;
 public kSetNode next;
 public kSetNode(int x,int y)
 {
  this.x=x;
  this.y=y;
  next=null;
 }
 public boolean equals(kSetNode node)
 {
  if(node.x==x&&node.y==y)
   return true;
  else
   return false;
 }
 public int getX()
 {
  return x;
 }
 public int getY()
 {
  return y;
 }
      }



  kSetNode类负责记录被删除方块的坐标,它重载equals()方法用来判断两个方块是否是同一个方块。kSet类是由kSetNode对象组成的没有相同元素的集合,用单链表实现,并且提供了 getFirst()、add()、clear()、isEmpty()、contains()等方法供其它类调用。编写和使用一些这样的工具类,将大大加快编程的速度,也使程序变得更加清晰。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章