J2ME手機游戲設計案例源代碼GameEngineTiledLayer_第1頁
J2ME手機游戲設計案例源代碼GameEngineTiledLayer_第2頁
J2ME手機游戲設計案例源代碼GameEngineTiledLayer_第3頁
J2ME手機游戲設計案例源代碼GameEngineTiledLayer_第4頁
J2ME手機游戲設計案例源代碼GameEngineTiledLayer_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、*gamemid。java/* * to change this template, choose tools | templates * and open the template in the editor. */import javax.microedition.lcdui.display;import javax.microedition.midlet.*;/* * author administrator */public class gamemid extends midlet private display display; private gameworld gw=null;

2、public gamemid() display = display.getdisplay(this); /獲取display gw=new gameworld(this); /創(chuàng)建游戲畫布 display.setcurrent(gw); /設置游戲畫布為當前顯示畫面 public void startapp() if(gw!=null) gw.start(); /游戲開始執(zhí)行 public void pauseapp() if(gw!=null)gw.setpaused(true); /游戲暫停執(zhí)行 public void destroyapp(boolean unconditional)

3、/* 退出程序 */ public void exit() try destroyapp(false); catch(exception e) notifydestroyed(); *gameworld。javaimport java.io.ioexception;import javax.microedition.lcdui.font;import javax.microedition.lcdui.graphics;import javax.microedition.lcdui.image;import javax.microedition.lcdui.game.gamecanvas;imp

4、ort javax.microedition.lcdui.game.sprite;import javax.microedition.lcdui.game.tiledlayer;/* * to change this template, choose tools | templates * and open the template in the editor. */* * * author administrator */public class gameworld extends gamecanvas implements runnable gamemid mid; /游戲midlet t

5、hread mainthread; /游戲主線程 private final int ms_per_frame=30; /設置一次游戲循環(huán)所需時間,單位為毫秒(ms),每秒游戲幀數(shù)約為1000/ms_per_frame private int cps; /游戲幀速 private boolean ispaused; /游戲暫停狀態(tài) private boolean running; /游戲運行狀態(tài) graphics g; /游戲繪圖對象 public static int screenwidth; /游戲屏幕寬度,設置為靜態(tài)成員,方便外部訪問 public static int screenhe

6、ight; /游戲屏幕高度 public static int gamestate; /游戲狀態(tài),1為暫停,2為游戲進行中,3為游戲失敗 public static int keystate; /按鍵狀態(tài) private image imgenemy,imgboy;/精靈圖像 private sprite sprenemy; /定義敵人精靈 private mysprite sprboy; /用擴展的精靈類來定義玩家精靈 /定義三個不同方向的玩家精靈幀序列,右方向可由左方向鏡像變換得到 int lsequ=3,4,3,5; /定義左方向精靈幀序列 int usequ=6,7,6,8; /定義上

7、方向精靈幀序列 int dsequ=0,1,0,2; /定義下方向精靈幀序列 int enemyx,enemyy; /敵人精靈坐標 int enemyspeedx; /敵人精靈速度,這里設置為只能水平移動 boolean iscoll; /碰撞標志 long colltexttime; /碰撞文本顯示時間 tiledbg tbg; /創(chuàng)建貼圖層應用類 tiledlayer tl; /創(chuàng)建貼圖層類/定義字體private font largefont=font.getfont(font.face_system,font.style_bold, font.size_large); private

8、font mediumfont=font.getfont(font.face_system,font.style_bold, font.size_medium); public gameworld(gamemid midlet) super(true); this.mid=midlet; /獲取midlet this.setfullscreenmode(true); /設置為全屏模式 screenwidth=getwidth(); /獲取屏幕大小 screenheight=getheight(); g=this.getgraphics(); /獲取繪圖對象 running=false; /設置

9、游戲運行狀態(tài) ispaused=false; gameinit(); /游戲初始化 /* 游戲初始化 */ private void gameinit() try imgboy = image.createimage(/boy.png); imgenemy=image.createimage(/enemy.png); catch (ioexception ex) ex.printstacktrace(); / 使用image對象,幀寬度、幀高度,速度,限制范圍矩形左上角的x坐標、y坐標、高度和寬度來構造自定義精靈 sprboy=new mysprite(imgboy,32,48,3,0,0,s

10、creenwidth,screenheight); sprboy.setframesequence(lsequ); /設置初始化時的精靈幀序列和方向 sprboy.setdir( mysprite.left); /設置初始化時精靈方向 sprboy.definereferencepixel(sprboy.getwidth()/2, sprboy.getheight()/2); /設置參考點 sprboy.setrefpixelposition(screenwidth/2, screenheight/2); /通過參考點定位精靈 int sw=sprboy.getwidth(); int sh=

11、sprboy.getheight(); sprboy.definecollisionrectangle(sw/10, sh/10, sw*8/10,sh*8/10); /重設精靈的碰撞矩形范圍為原來的80 /創(chuàng)建敵人精靈 sprenemy=new sprite(imgenemy,imgenemy.getwidth()/3,imgenemy.getheight()/3); sprenemy.setframesequence(lsequ); /設置精靈循環(huán)序列 enemyx=50; /設置敵人精靈的坐標 enemyy=200; enemyspeedx=-2; /設置敵人精靈速度 tbg=new t

12、iledbg(); /創(chuàng)建tiledbg對象 tl=tbg.gettiledbg(); /獲取貼圖層 /* 游戲運行 */ public void run() int cyclesthissecond=0; /當前1秒內的循環(huán)次數(shù) long cyclestarttime; /循環(huán)開始時間 long lastcpstime=0; /上次計算幀速的時間 long cycleendtime=0; /循環(huán)結束時間 long cycletimes=0; /一次游戲循環(huán)熱所花的時間 boolean bskip = false; /游戲是否跳幀 cps=0; system.out.println(游戲開始)

13、;/在控制臺輸出開始信息,可屏蔽 /* 游戲主循環(huán) */ while(running) /檢查是否運行 cyclestarttime = system.currenttimemillis();/記錄游戲循環(huán)開始時間 / 下面語句用于處理游戲內容,如果游戲設置為跳幀, / 則本次循環(huán)不處理游戲內容 if(!bskip) gameinput(); /處理輸入消息 gamecycle(); /處理游戲邏輯 render(g); /渲染游戲畫面 flushgraphics(); /更新畫面 /* 下面語句用于計算游戲循環(huán)時間,并進行相應處理 */ cycleendtime=system.current

14、timemillis(); /記錄游戲循環(huán)結束時間 cycletimes=cycleendtime-cyclestarttime; /計算循環(huán)時間 /如果循環(huán)時間間隔小于ms_per_frame,則通過休眠,使其不小于rate, /并能讓系統(tǒng)有空閑轉去處理其他事務 if(cycletimes 1000) /檢查距上次計算幀數(shù)的/時間是否經(jīng)過1000ms lastcpstime=system.currenttimemillis(); /設定lastcps為當前時間 cps = cyclesthissecond; / system.out.println(cps:+cps); /輸出每秒的幀數(shù) c

15、yclesthissecond = 0; /重置幀數(shù) else cyclesthissecond+; /幀數(shù)遞增 system.out.println(游戲結束!); release(); /釋放資源 exit(); /退出游戲 /* 啟動游戲進程 */ public void start() /檢查游戲循環(huán)是否處于運行狀態(tài),如果未運行,則創(chuàng)建線程并啟動 /如果游戲處于運行狀態(tài),則表示是暫停后的繼續(xù)執(zhí)行,僅設置暫停狀態(tài)即可 if(!running) running=true; mainthread=new thread(this); mainthread.start(); gamestate=

16、2; else gamestate=2; setpaused(false); /退出游戲 private void exit() mid.exit(); /退出游戲 /* 停止游戲 */ private void stop() running=false; /終止游戲循環(huán) /* 釋放游戲資源 */ private void release() /此處為釋放游戲資源的代碼 imgenemy=null; imgboy=null; sprboy=null; sprenemy=null; tbg=null; tl=null; system.gc(); /*獲取暫停狀態(tài) */ public boolea

17、n getpaused() return ispaused; /* 設置暫停狀態(tài) */ public void setpaused(boolean ispaused) this.ispaused = ispaused; /* 處理游戲輸入信息 */ private void gameinput() int keystates = this.getkeystates(); /獲取按鍵狀態(tài) /* 下面是對按鍵事件的具體處理,應根據(jù)游戲需要進行修改*/ keystate=0; /fire if(keystates & fire_pressed )!=0) keystate=fire_pressed;

18、 / left if (keystates & left_pressed) != 0) keystate=left_pressed; / right if (keystates & right_pressed) !=0 ) keystate=right_pressed; / up if (keystates & up_pressed) != 0) keystate=up_pressed; / down if (keystates & down_pressed) !=0) keystate=down_pressed; /game_a if(keystates & game_a_pressed)!

19、=0) keystate=game_a_pressed; /game_b if(keystates & game_b_pressed)!=0) keystate=game_b_pressed; /game_c if(keystates & game_c_pressed)!=0) keystate=game_c_pressed; /game_d if(keystates & game_d_pressed)!=0) keystate=game_d_pressed; /* 渲染游戲畫面 */ private void render(graphics g) /* 填充背景 */ g.setcolor(

20、0xffffff); g.fillrect(0, 0, screenwidth,screenheight); /* 下面是對游戲渲染的具體處理,應根據(jù)游戲需要進行修改*/ tl.paint(g); /繪制貼圖層 / g.drawimage(imgbuild,100, 50, graphics.left|graphics.top); sprenemy.paint(g); /繪制敵人精靈 sprboy.paint(g); /繪制精靈 /當敵人精靈和玩家角色相碰撞時,繪制下面的內容 if(iscoll) g.setcolor(0xccbbcc); g.fillrect(50, 0, 120, 20)

21、; g.setcolor(0xffffff); g.setfont(largefont); g.drawstring(被敵人撞上啦!,60,0, graphics.left| graphics.top); /* 游戲邏輯處理*/ private void gamecycle() switch(gamestate) case 1: /游戲暫停狀態(tài)時的處理 /根據(jù)按鍵狀態(tài)執(zhí)行相應功能 switch(keystate) case game_a_pressed: /按下game_a鍵時的處理 gamestate=4; /設置游戲狀態(tài)會結束程序 break; case fire_pressed: /按下

22、fire鍵時的處理 if(getpaused() gamestate=2; setpaused(false); break; break; case 2: /游戲處于運行狀態(tài)時的處理 /根據(jù)按鍵狀態(tài)執(zhí)行相應功能 /根據(jù)按鍵狀態(tài)進行計算 switch(keystate) case fire_pressed: /按下fire鍵時 gamestate=1; /設置游戲狀態(tài)為暫停 setpaused(true); /設置暫停 break; case game_a_pressed: /按下game_a鍵時 gamestate=4; /設置游戲狀態(tài)為退出 break; case game_b_presse

23、d: /按下game_b鍵時 sprboy.setframe(2); break; default: update(); /更新數(shù)據(jù) break; break; case 3: /游戲失敗的處理 break; case 4: /游戲退出時的處理 stop(); /停止運行 break; /* 更新數(shù)據(jù) */ private void update() /敵人的運動 enemyx+=enemyspeedx; /計算坐標 if(enemyx=screenwidth+sprenemy.getwidth() & enemyspeedx0) enemyspeedx=-enemyspeedx; /改變速度

24、方向 sprenemy.settransform(sprite.trans_none); if(enemyx+sprenemy.getwidth()=0 & enemyspeedxsprboy.getx() sprboy.move(-sprboy.getspeed(), 0); /移動玩家角色精靈 sprenemy.settransform(sprite.trans_mirror); /設置敵人精靈方向 enemyx+=sprenemy.getwidth(); /重設敵人精靈坐標 enemyspeedx=2; /設置敵人精靈速度方向 else sprboy.move(sprboy.getspe

25、ed(), 0); /移動玩家角色精靈 sprenemy.settransform(sprite.trans_none); /設置敵人精靈方向 enemyx-=sprenemy.getwidth(); /重設敵人精靈坐標 enemyspeedx=-2; /設置敵人精靈速度方向 sprenemy.setrefpixelposition(enemyx, enemyy); /重設敵人位置 iscoll=true; /設置碰撞標志 colltexttime=120; /設置碰撞文本顯示時間 else if(colltexttime=0) iscoll=false; colltexttime-; /設置

26、碰撞文本顯示時間遞減 /根據(jù)按鍵狀態(tài)計算玩家角色精靈與貼圖層數(shù)據(jù) switch(keystate) case left_pressed: /按下left鍵時 /檢查原來是否為左方向的精靈幀序列,如果不是則設置為左方向精靈幀序列 if(sprboy.getdir()!=mysprite.left) sprboy.setframesequence(lsequ); /設置左方向精靈序列 sprboy.settransform(mysprite.trans_none); /設置為不變換 if(sprboy.move(mysprite.left) /向左移動,如果到屏幕邊緣則移動貼圖層 tbg.move

27、(sprboy.getspeed(), 0); break; case right_pressed: /按下right鍵時 /檢查原來是否為右方向的精靈幀序列,如果不是則設置為右方向精靈幀序列 if(sprboy.getdir()!=mysprite.right) sprboy.setframesequence(lsequ); /設置左方向精靈幀序列 sprboy.settransform(mysprite.trans_mirror); /設置為鏡像變換 /向右移動,如果到屏幕邊緣則移動貼圖層 if(sprboy.move(mysprite.right) tbg.move(-sprboy.ge

28、tspeed(), 0); break; case up_pressed: /按下up鍵時 /檢查原來是否為上方向的精靈幀序列,如果不是則設置為上方向精靈幀序列 if(sprboy.getdir()!=mysprite.up) sprboy.setframesequence(usequ); /向上移動,如果到屏幕邊緣則移動貼圖層 if(sprboy.move(mysprite. up) tbg.move(0,sprboy.getspeed() ); break; case down_pressed: /按下right鍵時 /檢查原來是否為下方向的精靈幀序列,如果不是則設置為下方向精靈幀序列 i

29、f(sprboy.getdir()!=mysprite.down) sprboy.setframesequence(dsequ); /向下移動,如果到屏幕邊緣則移動貼圖層 if( sprboy.move(mysprite.down) tbg.move(0,-sprboy.getspeed() ); break; tbg.update(); /更新動態(tài)貼圖 *mysprite.javaimport javax.microedition.lcdui.image;import javax.microedition.lcdui.game.sprite;/* * to change this templ

30、ate, choose tools | templates * and open the template in the editor. */* * * author administrator */public class mysprite extends sprite private int speed; /速度 private int dir; /方向 private int roundx; /限制矩形范圍的左上角坐標 private int roundy; private int roundwidth; /限制矩形范圍寬度 private int roundheight; /限制矩形范

31、圍高度 /定義各方向靜態(tài)常量 public final static int left=1; /左 public final static int right=2; /右 public final static int up=3; /上 public final static int down=4; /下 /* 使用image對象,幀寬度w和幀高度h構造精靈*/ public mysprite(image img,int w,int h) super(img,w,h); /使用基類(即sprite)構造方法創(chuàng)建精靈 this.speed=1; /設置默認速度 setdir(down); /設置

32、默認方向 setroundrect(0,0,240,309); /設置缺省時的限制矩形 /* 使用image對象,幀寬度w、幀高度h和速度speed構造精靈 */ public mysprite(image img,int w,int h,int speed) super(img,w,h); this.speed=speed; setdir(down); /設置默認方向 /* 使用image對象,幀寬度、幀高度,速度,限制范圍矩形左上角的x坐標、y坐標、高度和寬度來構造精靈 */ public mysprite(image img,int w,int h,int speed,int rx,in

33、t ry,int rw,int rh) super(img,w,h); this.speed=speed; /設置速度 setdir(down); /設置默認方向 setroundrect(rx,ry,rw,rh); /設置限制范圍矩形 /* 設置限制范圍矩形 */ public void setroundrect(int rx,int ry,int rw,int rh) setroundx(rx); setroundy(ry); setroundwidth(rw); setroundheight(rh); /* 向dir方向移動精靈,并返回是否已到達范圍矩形邊框*/ public boole

34、an move(int dir) boolean isround; isround=false; int movex=0; int movey=0; this.setdir(dir); /設置方向 switch(dir) /通過方向,按設置的速度距離移動精靈 case left: movex=-getspeed(); break; case right: movex=getspeed(); break; case up: movey=-getspeed(); break; case down: movey=getspeed(); break; /下面語句用于將移動點在范圍矩形內 if( getx()+movexgetroundx()+getroundwidth() movex=getroundx()+getroundwidth()-getx()-getwidth(); isround=true; if( gety()+moveygetroundy()+getroundheight() movey=getroundy()+getroundheight()-gety()-getheight(); isround=true; super.nextframe(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論