編碼速度比預想中的快,當然也是由原因的:上個星期的學習階段就寫好了一些框架,所以現在寫起來基本得心應手,唯一郁悶的是一些屏幕坐標的處理,尤其是對於tiledLayer使用活動下標來進行卷屏時,纏了很久才弄對。
建立工程之類的東西就不說了,新建一個工程,DeathFlight
現在先提幾個預備知識
顯示:
MIDlet的顯示相關基類是Displayable,其具有兩個派生類:Canvas和Screen,前者跟在屏幕上繪圖有關,一般用於顯示游戲畫面,後者主要是用來顯示用戶界面。
Canvas有一個派生類:GameCanvas,這是我需要用到的,在這裡我對GameCanvas進行了繼承,叫GameLoop,使其具有更強大的功能
Screen則有四個派生類: Alert(顯示提示窗口) ,Form(顯示數據交互窗口) ,List(顯示列表框),TextBox(文本框)
顯然都是用來做用戶界面的.在我的游戲裡,我使用Form來顯示高分窗口和添加高分的窗口,用List來顯示主菜單.
存儲:
RecordStore類.直接提供字段形式的信息存取功能.但給的方法還是比較少的,我們把它進行了封裝,並最後派生出一個叫Score的類,用來存取高分紀錄
畫面繪制:
Canvas裡能夠得到Graphics,Graphics提供直接的,低級的繪圖操作,包括點,線,填充,字符串繪制等.當然我們不能指望用一大堆的低級繪圖指令來一點點畫出我們的游戲場景. J2ME非常體貼地提供了一組專門用於游戲的類:
GameCanvas(上面已經提到)
Layer( 層,用於在屏幕上重疊多層畫面) ,
LayerManager(管理層,比如層的顯隱,位置,前後關系等),
TiledLayer(柵格層,按我自己的理解翻譯的,能夠把小格的圖片用矩陣組織起成一整塊,然後整塊地畫到屏幕上,這個在本游戲中起到非常重要的作用,等會兒將會看到),
Sprite.( 精靈,一般用來做游戲上的運動主體,比如超級瑪莉中的玩家角色)
在這個游戲裡我用一個叫Terrain的類擴展了TiledLayer,用來動態地生成崎岖的地形和障礙物,並在其中完成碰撞檢測的工作和分數計算的工作.
而Sprite則被我封裝成GameObject,又用GameObject封裝成Helicopter.
現在開始分別講各個模塊
1。 Flight.Java:游戲主MIDlet
MIDlet是第一個被初始化的類,在所有接下來的模塊都將由這個類直接或間接調用。我個人的看法是最好所有的模塊都盡可能由這個類來調度。
新建一個MIDlet,叫Flight
import Javax.microedition.midlet.MIDlet;
import Javax.microedition.midlet.MIDletStateChangeException;
import Javax.microedition.lcdui.*;
import Java.io.*;
public class Flight extends MIDlet {
protected Display display = null; // 保存當前midlet的 Display
protected Score score; // Score 類,繼承自BaseRMS,保存高分紀錄
protected int scorevalue; // 保存當前玩家的分數
private MainMenu mainmenu = null; // MainMenu,繼承自List,游戲主菜單
private HighScoreScreen highscorescreen = null; // 顯示高分的屏幕,繼承自 Form
private GameLoop Game = null; //游戲主模塊,繼承自GameCanvas
public Flight() {
super();
display = Display.getDisplay(this);
score = new Score("HallOfFame");
mainmenu = new MainMenu(this);
highscorescreen = new HighScoreScreen(this,score);
}
protected void startApp() throws MIDletStateChangeException {
showMainMenu();
}
protected void pauseApp() {
}
protected void destroyApp(boolean arg0){
System.gc(); // 顯式的垃圾收集,怎麼強調垃圾收集應該都不為過
notifyDestroyed();
}
protected void Quit(){
this.destroyApp(true); //退出MIDlet,供MainMenu調用
}
protected void startGame(){
Game = null;
Game = new GameLoop(this);
Game.start();
display.setCurrent(Game); //將GameLoop綁定到display上, 即顯示游戲屏幕
}
protected void showHighScore(){
try{
highscorescreen.init();
}catch(Exception e){
e.printStackTrace();
}
display.setCurrent(highscorescreen);
}
protected void showMainMenu(){
display.setCurrent(mainmenu); //顯示MainMenu,供玩家從游戲中返回到主菜單
}
protected void getScore(){
try{
scorevalue = Game.getScore(); // 在游戲結束後調用,得到分數
}catch(Exception e){
e.printStackTrace();
}
}
protected void addHighScore(int scorevalue){
try{
if(highscorescreen.isHighScore(scorevalue) == true){
//如果是高分則顯示添加高分的窗口
AddHighScoreScreen addhighscorescreen = new AddHighScoreScreen(this,scorevalue);
this.display.setCurrent(addhighscorescreen);
}
}catch(Exception e){
e.printStackTrace();
}
}
protected void showHelp(){
//幫助窗口
Alert helpScreen = new Alert(null,"按#健往上飛,否則飛機將自動下墜,碰撞到障礙物游戲即結束\n\nSilentVoid制作\nhttp://blog.csdn.Net/Silentvoid\
[email protected]",null,AlertType.INFO);
helpScreen.setTimeout(5000);
display.setCurrent(helpScreen,mainmenu);
}
}