實在是等不及了吧?加把勁,讓我們加入游戲的主角飛機吧。
你可以將這個游戲定位在動作游戲,一個動作游戲需要不斷的從用戶端獲得輸入,基本上不間斷,所以plane需要不斷的改變位置。那麼這個基於桢的游戲應該定在多少桢合適呢?這需要在手機中測試,在模擬器上,如果定在15-18桢左右,是比較合適的。聽csdn的幾位xd說有的游戲僅僅定在12桢,所以不同的游戲是不一定的。基本上動作游戲對機子的要求是要高一點。我們的游戲框架是線性的,即輸出顯示和接受輸入是在同一個線程中,15桢以下的游戲處理輸入會顯得比較苯,高於20桢如果處理器速度較慢,很容易出現輸入卡在緩沖區,處理不過來的情況。現階段盡量讓桢數降下來吧,你不能和pc上用dx編程時,統一30fps的情況相提並論。
在這個以控制精靈移動為主要內容的游戲中,我們不封裝任何的游戲事件,我們的程序可能有些稚嫩,沒關系,一步一步來吧。
1. 飛機
plane是一個標准的plane。由三桢畫面組成,:
在構造函數中,我們加入對飛機的初始化對象語句:
Image img=ImageTools.getImage("/pic/MyPlaneFrames.png");
plane=new GameObject(img,24,24);
在gameInit()中初始化狀態,位置居中:
plane.reset();
plane.moveto((screenwidth-plane.sprite.getWidth())/2,(screenheight-plane.sprite.getHeight())/2);
在gameMain中加入:
plane.paint(g);
接下來,讓飛機在控制下移動,主要是在gameMain中加入輸入處理,如果飛機左移就更新畫面到飛機左傾的畫面,如果飛機右傾反之,沒有輸入的時候讓飛機處於正常。
if (gameover) {
}else{
if (keyevent) {
if(key_up){
plane.move(0, -3);
plane.sprite.setFrame(0);
}
if(key_down){
plane.move(0, 3);
plane.sprite.setFrame(0);
}
if(key_left){
plane.move( -3, 0);
plane.sprite.setFrame(1);
}
if(key_right){
plane.move(3, 0);
plane.sprite.setFrame(2);
}
if(key_fire){
}
}
}
else {
plane.sprite.setFrame(0);
}
}
盡管很簡單,但這是控制精靈移動的主要方式。可以想象一下,如果往左飛不是簡單的一桢畫面而是播放動畫,該怎麼實現呢?我們的GameObject功能有限,沒有對spriite的動畫序列進行增強,今後我們可以增強GameObject,使其支持多個動畫序列,彌補spriite的不足。現在逐漸體會到一個好的游戲引擎是多麼重要了吧…
2. 背景
讓飛機在海面飛行吧,我們用一個藍色的背景圖片代表海面,我們需要他鋪滿整個背景。我們使用TiledLayer來繪畫背景。
初始化:
img=ImageTools.getImage("/pic/back_water.png");
int backcolumns=screenwidth/img.getWidth()+1;//計算橫向
int backrows=screenheight/img.getHeight()+1;
background=new TiledLayer(backcolumns,backrows,img,img.getWidth(),img.getHeight());
int x,y;
for (int i = 0; i < backcolumns*backrows; i++) {
x=i%backcolumns;
y=i/backcolumns;
System.out.println("x="+x+" y="+y);
background.setCell(x,y,1);
}
接下來在gameMain中加入繪制語句。
background.paint(g);//draw background
注意,要保證背景的繪制在飛機的繪畫之前。如果使用Layermanager可以很方便的的控制繪制層,但是我們的接下來的子彈要求多個子彈對象共用一個sprite的圖像,但是Layermanager繪畫的時候以Layer為單位,由Layermanager幫助我們調用各個layer的paint,so一次只支持將一個sprite畫在一個地方,所以我覺得Layermanager有些雞肋。一般時候我們還是自己paint吧。當然,層是一個很重要的概念,利用層,屏幕校准將非常方便,震動整個屏幕等特效將很實現。也許你有個好法,可以讓我不在Layermanager層與sprite狀態對象組之間矛盾…
可喜可賀呀,我們的飛機動起來了,哈哈,讓我們期待加入子彈吧,那是本游戲的“精華”。