双缓冲技术是编写J2ME游戏程序的关键技术之一。实际上,双缓冲技术是计算机动画的一项传统技术。造成屏幕闪烁的主要原因在于,画面在显示的同时,程序又在改变它...
首先定义一个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工具类的功能...
编写自己的工具类
因为手机内存和功能的限制,J2ME只提供了部分的J2SE工具类供使用者调用。所以有时我们不得不编写自己的工具类来实现一些特殊的功能。下面给出的kSet类就类似于J2SE中Set工具类的功能。它用来记录游戏中被删去的方块集合,同时保证集合中没有相同元素。
/***
Description: Set类在J2ME上的实现
*Date:2003.2.28*Author:TomJava
*email:tomjava@sohu.com
*/ 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;elsereturn 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;elsereturn false;
}
public int getX(){return x;
}
public int getY(){return y;}
|
kSetNode类负责记录被删除方块的坐标,它重载equals()方法用来判断两个方块是否是同一个方块。kSet类是由kSetNode对象组成的没有相同元素的集合,用单链表实现,并且提供了 getFirst()、add()、clear()、isEmpty()、contains()等方法供其它类调用。编写和使用一些这样的工具类,将大大加快编程的速度,也使程序变得更加清晰。
矫正屏幕坐标
GridOne这个游戏是专门为MotoT720开发的,也就是说游戏背景图片大小和MotoT720型手机的大小是相等的。如果它在那些屏幕比MotoT720大的手机上运行,游戏背景图片会显示在屏幕左上角而影响美观,这时就要用到屏幕矫正技术,使得游戏背景图片居中显示。矫正屏幕坐标代码如下:
public class BlocksCanvas extends Canvas implements Runnable{
private final int addX;//坐标矫正
private final int addY;
private final int SCREEN_X;//屏幕顶点
private final int SCREEN_Y;
private final int WAITBLOCK_X;//等待方块顶点
private final int WAITBLOCK_Y;
private final int SCORES_X;//分数顶点
private final int SCORES_Y;
private final int STAR_X;//五角星的顶点
private final int STAR_Y; public BlocksCanvas() {//取得当前手机屏幕的高度和宽度
height = getHeight();
width = getWidth();//坐标矫正量
addX = (width-120)/2;
addY = (height-142)/2;//初始化屏幕参数
SCREEN_X = addX + 48;//屏幕顶点
SCREEN_Y = addY + 10;
WAITBLOCK_X = addX + 19;//等待方块顶点
WAITBLOCK_Y = addY + 103;
SCORES_X = addX + 36;//分数顶点
SCORES_Y = addY + 34;
STAR_X=addX+4;//五角星的顶点
STAR_Y=addY+70;
}
}
|