(str, 0,0, Graphics.TOP | Graphics.LEFT);
repaint();
while(stopFlag){}
}
public void keyPressed(int keyCode)
{
stopFlag=false;
}
}
J2ME游戏开发技巧(3)
时间:2011-01-13
首先定义一个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
retu
|