首先定義一個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:[email protected]
*/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;
}
}