版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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); /設(shè)置游戲畫布為當(dāng)前顯示畫面 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; /設(shè)置一次游戲循環(huán)所需時(shí)間,單位為毫秒(ms),每秒游戲幀數(shù)約為1000/ms_per_frame private int cps; /游戲幀速 private boolean ispaused; /游戲暫停狀態(tài) private boolean running; /游戲運(yùn)行狀態(tài) graphics g; /游戲繪圖對(duì)象 public static int screenwidth; /游戲屏幕寬度,設(shè)置為靜態(tài)成員,方便外部訪問(wèn) public static int screenhe
6、ight; /游戲屏幕高度 public static int gamestate; /游戲狀態(tài),1為暫停,2為游戲進(jìn)行中,3為游戲失敗 public static int keystate; /按鍵狀態(tài) private image imgenemy,imgboy;/精靈圖像 private sprite sprenemy; /定義敵人精靈 private mysprite sprboy; /用擴(kuò)展的精靈類來(lái)定義玩家精靈 /定義三個(gè)不同方向的玩家精靈幀序列,右方向可由左方向鏡像變換得到 int lsequ=3,4,3,5; /定義左方向精靈幀序列 int usequ=6,7,6,8; /定義上
7、方向精靈幀序列 int dsequ=0,1,0,2; /定義下方向精靈幀序列 int enemyx,enemyy; /敵人精靈坐標(biāo) int enemyspeedx; /敵人精靈速度,這里設(shè)置為只能水平移動(dòng) boolean iscoll; /碰撞標(biāo)志 long colltexttime; /碰撞文本顯示時(shí)間 tiledbg tbg; /創(chuàng)建貼圖層應(yī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); /設(shè)置為全屏模式 screenwidth=getwidth(); /獲取屏幕大小 screenheight=getheight(); g=this.getgraphics(); /獲取繪圖對(duì)象 running=false; /設(shè)置
9、游戲運(yùn)行狀態(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對(duì)象,幀寬度、幀高度,速度,限制范圍矩形左上角的x坐標(biāo)、y坐標(biāo)、高度和寬度來(lái)構(gòu)造自定義精靈 sprboy=new mysprite(imgboy,32,48,3,0,0,s
10、creenwidth,screenheight); sprboy.setframesequence(lsequ); /設(shè)置初始化時(shí)的精靈幀序列和方向 sprboy.setdir( mysprite.left); /設(shè)置初始化時(shí)精靈方向 sprboy.definereferencepixel(sprboy.getwidth()/2, sprboy.getheight()/2); /設(shè)置參考點(diǎn) sprboy.setrefpixelposition(screenwidth/2, screenheight/2); /通過(guò)參考點(diǎn)定位精靈 int sw=sprboy.getwidth(); int sh=
11、sprboy.getheight(); sprboy.definecollisionrectangle(sw/10, sh/10, sw*8/10,sh*8/10); /重設(shè)精靈的碰撞矩形范圍為原來(lái)的80 /創(chuàng)建敵人精靈 sprenemy=new sprite(imgenemy,imgenemy.getwidth()/3,imgenemy.getheight()/3); sprenemy.setframesequence(lsequ); /設(shè)置精靈循環(huán)序列 enemyx=50; /設(shè)置敵人精靈的坐標(biāo) enemyy=200; enemyspeedx=-2; /設(shè)置敵人精靈速度 tbg=new t
12、iledbg(); /創(chuàng)建tiledbg對(duì)象 tl=tbg.gettiledbg(); /獲取貼圖層 /* 游戲運(yùn)行 */ public void run() int cyclesthissecond=0; /當(dāng)前1秒內(nèi)的循環(huán)次數(shù) long cyclestarttime; /循環(huán)開始時(shí)間 long lastcpstime=0; /上次計(jì)算幀速的時(shí)間 long cycleendtime=0; /循環(huán)結(jié)束時(shí)間 long cycletimes=0; /一次游戲循環(huán)熱所花的時(shí)間 boolean bskip = false; /游戲是否跳幀 cps=0; system.out.println(游戲開始)
13、;/在控制臺(tái)輸出開始信息,可屏蔽 /* 游戲主循環(huán) */ while(running) /檢查是否運(yùn)行 cyclestarttime = system.currenttimemillis();/記錄游戲循環(huán)開始時(shí)間 / 下面語(yǔ)句用于處理游戲內(nèi)容,如果游戲設(shè)置為跳幀, / 則本次循環(huán)不處理游戲內(nèi)容 if(!bskip) gameinput(); /處理輸入消息 gamecycle(); /處理游戲邏輯 render(g); /渲染游戲畫面 flushgraphics(); /更新畫面 /* 下面語(yǔ)句用于計(jì)算游戲循環(huán)時(shí)間,并進(jìn)行相應(yīng)處理 */ cycleendtime=system.current
14、timemillis(); /記錄游戲循環(huán)結(jié)束時(shí)間 cycletimes=cycleendtime-cyclestarttime; /計(jì)算循環(huán)時(shí)間 /如果循環(huán)時(shí)間間隔小于ms_per_frame,則通過(guò)休眠,使其不小于rate, /并能讓系統(tǒng)有空閑轉(zhuǎn)去處理其他事務(wù) if(cycletimes 1000) /檢查距上次計(jì)算幀數(shù)的/時(shí)間是否經(jīng)過(guò)1000ms lastcpstime=system.currenttimemillis(); /設(shè)定lastcps為當(dāng)前時(shí)間 cps = cyclesthissecond; / system.out.println(cps:+cps); /輸出每秒的幀數(shù) c
15、yclesthissecond = 0; /重置幀數(shù) else cyclesthissecond+; /幀數(shù)遞增 system.out.println(游戲結(jié)束!); release(); /釋放資源 exit(); /退出游戲 /* 啟動(dòng)游戲進(jìn)程 */ public void start() /檢查游戲循環(huán)是否處于運(yùn)行狀態(tài),如果未運(yùn)行,則創(chuàng)建線程并啟動(dòng) /如果游戲處于運(yùn)行狀態(tài),則表示是暫停后的繼續(xù)執(zhí)行,僅設(shè)置暫停狀態(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; /* 設(shè)置暫停狀態(tài) */ public void setpaused(boolean ispaused) this.ispaused = ispaused; /* 處理游戲輸入信息 */ private void gameinput() int keystates = this.getkeystates(); /獲取按鍵狀態(tài) /* 下面是對(duì)按鍵事件的具體處理,應(yīng)根據(jù)游戲需要進(jìn)行修改*/ 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); /* 下面是對(duì)游戲渲染的具體處理,應(yīng)根據(jù)游戲需要進(jìn)行修改*/ tl.paint(g); /繪制貼圖層 / g.drawimage(imgbuild,100, 50, graphics.left|graphics.top); sprenemy.paint(g); /繪制敵人精靈 sprboy.paint(g); /繪制精靈 /當(dāng)敵人精靈和玩家角色相碰撞時(shí),繪制下面的內(nèi)容 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)時(shí)的處理 /根據(jù)按鍵狀態(tài)執(zhí)行相應(yīng)功能 switch(keystate) case game_a_pressed: /按下game_a鍵時(shí)的處理 gamestate=4; /設(shè)置游戲狀態(tài)會(huì)結(jié)束程序 break; case fire_pressed: /按下
22、fire鍵時(shí)的處理 if(getpaused() gamestate=2; setpaused(false); break; break; case 2: /游戲處于運(yùn)行狀態(tài)時(shí)的處理 /根據(jù)按鍵狀態(tài)執(zhí)行相應(yīng)功能 /根據(jù)按鍵狀態(tài)進(jìn)行計(jì)算 switch(keystate) case fire_pressed: /按下fire鍵時(shí) gamestate=1; /設(shè)置游戲狀態(tài)為暫停 setpaused(true); /設(shè)置暫停 break; case game_a_pressed: /按下game_a鍵時(shí) gamestate=4; /設(shè)置游戲狀態(tài)為退出 break; case game_b_presse
23、d: /按下game_b鍵時(shí) sprboy.setframe(2); break; default: update(); /更新數(shù)據(jù) break; break; case 3: /游戲失敗的處理 break; case 4: /游戲退出時(shí)的處理 stop(); /停止運(yùn)行 break; /* 更新數(shù)據(jù) */ private void update() /敵人的運(yùn)動(dòng) enemyx+=enemyspeedx; /計(jì)算坐標(biāo) 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); /移動(dòng)玩家角色精靈 sprenemy.settransform(sprite.trans_mirror); /設(shè)置敵人精靈方向 enemyx+=sprenemy.getwidth(); /重設(shè)敵人精靈坐標(biāo) enemyspeedx=2; /設(shè)置敵人精靈速度方向 else sprboy.move(sprboy.getspe
25、ed(), 0); /移動(dòng)玩家角色精靈 sprenemy.settransform(sprite.trans_none); /設(shè)置敵人精靈方向 enemyx-=sprenemy.getwidth(); /重設(shè)敵人精靈坐標(biāo) enemyspeedx=-2; /設(shè)置敵人精靈速度方向 sprenemy.setrefpixelposition(enemyx, enemyy); /重設(shè)敵人位置 iscoll=true; /設(shè)置碰撞標(biāo)志 colltexttime=120; /設(shè)置碰撞文本顯示時(shí)間 else if(colltexttime=0) iscoll=false; colltexttime-; /設(shè)置
26、碰撞文本顯示時(shí)間遞減 /根據(jù)按鍵狀態(tài)計(jì)算玩家角色精靈與貼圖層數(shù)據(jù) switch(keystate) case left_pressed: /按下left鍵時(shí) /檢查原來(lái)是否為左方向的精靈幀序列,如果不是則設(shè)置為左方向精靈幀序列 if(sprboy.getdir()!=mysprite.left) sprboy.setframesequence(lsequ); /設(shè)置左方向精靈序列 sprboy.settransform(mysprite.trans_none); /設(shè)置為不變換 if(sprboy.move(mysprite.left) /向左移動(dòng),如果到屏幕邊緣則移動(dòng)貼圖層 tbg.move
27、(sprboy.getspeed(), 0); break; case right_pressed: /按下right鍵時(shí) /檢查原來(lái)是否為右方向的精靈幀序列,如果不是則設(shè)置為右方向精靈幀序列 if(sprboy.getdir()!=mysprite.right) sprboy.setframesequence(lsequ); /設(shè)置左方向精靈幀序列 sprboy.settransform(mysprite.trans_mirror); /設(shè)置為鏡像變換 /向右移動(dòng),如果到屏幕邊緣則移動(dòng)貼圖層 if(sprboy.move(mysprite.right) tbg.move(-sprboy.ge
28、tspeed(), 0); break; case up_pressed: /按下up鍵時(shí) /檢查原來(lái)是否為上方向的精靈幀序列,如果不是則設(shè)置為上方向精靈幀序列 if(sprboy.getdir()!=mysprite.up) sprboy.setframesequence(usequ); /向上移動(dòng),如果到屏幕邊緣則移動(dòng)貼圖層 if(sprboy.move(mysprite. up) tbg.move(0,sprboy.getspeed() ); break; case down_pressed: /按下right鍵時(shí) /檢查原來(lái)是否為下方向的精靈幀序列,如果不是則設(shè)置為下方向精靈幀序列 i
29、f(sprboy.getdir()!=mysprite.down) sprboy.setframesequence(dsequ); /向下移動(dòng),如果到屏幕邊緣則移動(dòng)貼圖層 if( sprboy.move(mysprite.down) tbg.move(0,-sprboy.getspeed() ); break; tbg.update(); /更新動(dòng)態(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; /限制矩形范圍的左上角坐標(biāo) 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對(duì)象,幀寬度w和幀高度h構(gòu)造精靈*/ public mysprite(image img,int w,int h) super(img,w,h); /使用基類(即sprite)構(gòu)造方法創(chuàng)建精靈 this.speed=1; /設(shè)置默認(rèn)速度 setdir(down); /設(shè)置
32、默認(rèn)方向 setroundrect(0,0,240,309); /設(shè)置缺省時(shí)的限制矩形 /* 使用image對(duì)象,幀寬度w、幀高度h和速度speed構(gòu)造精靈 */ public mysprite(image img,int w,int h,int speed) super(img,w,h); this.speed=speed; setdir(down); /設(shè)置默認(rèn)方向 /* 使用image對(duì)象,幀寬度、幀高度,速度,限制范圍矩形左上角的x坐標(biāo)、y坐標(biāo)、高度和寬度來(lái)構(gòu)造精靈 */ 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; /設(shè)置速度 setdir(down); /設(shè)置默認(rèn)方向 setroundrect(rx,ry,rw,rh); /設(shè)置限制范圍矩形 /* 設(shè)置限制范圍矩形 */ public void setroundrect(int rx,int ry,int rw,int rh) setroundx(rx); setroundy(ry); setroundwidth(rw); setroundheight(rh); /* 向dir方向移動(dòng)精靈,并返回是否已到達(dá)范圍矩形邊框*/ public boole
34、an move(int dir) boolean isround; isround=false; int movex=0; int movey=0; this.setdir(dir); /設(shè)置方向 switch(dir) /通過(guò)方向,按設(shè)置的速度距離移動(dòng)精靈 case left: movex=-getspeed(); break; case right: movex=getspeed(); break; case up: movey=-getspeed(); break; case down: movey=getspeed(); break; /下面語(yǔ)句用于將移動(dòng)點(diǎn)在范圍矩形內(nèi) if( getx()+movexgetroundx()+getroundwidth() movex=getroundx()+getroundwidth()-getx()-getwidth(); isround=true; if( gety()+moveygetroundy()+getroundheight() movey=getroundy()+getroundheight()-gety()-getheight(); isround=true; super.nextframe(); s
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)財(cái)務(wù)個(gè)人工作總結(jié)15篇
- 競(jìng)選部長(zhǎng)演講稿集合九篇
- 鄉(xiāng)鎮(zhèn)學(xué)校安全工作總結(jié)
- 土木工程實(shí)習(xí)日記3篇
- 影響和制約寧遠(yuǎn)教育發(fā)展的突出問(wèn)題
- 部編版歷史九年級(jí)上冊(cè)第五單元 第16課《早期殖民掠奪》說(shuō)課稿
- 五年級(jí)數(shù)學(xué)(小數(shù)除法)計(jì)算題專項(xiàng)練習(xí)及答案匯編
- 雇傭車輛免責(zé)協(xié)議書(2篇)
- 2025二級(jí)注冊(cè)建造師繼續(xù)教育機(jī)電工程考試題庫(kù)及答案
- 南京工業(yè)大學(xué)浦江學(xué)院《通信原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 六年級(jí)數(shù)學(xué)上冊(cè)解決問(wèn)題60道
- 第4章-管內(nèi)氣液兩相流阻力計(jì)算
- 醫(yī)院全員教育培訓(xùn)管理工作制度規(guī)定辦法.docx
- 二十四孝故事
- 英語(yǔ)課堂小說(shuō)《月亮與六便士》(課堂PPT)
- 專項(xiàng)基金投資募集合作框架協(xié)議模版
- (完整word版)拼音練習(xí)jqx和ü、üe的相拼
- 醫(yī)療質(zhì)量檢查分析、總結(jié)、反饋5篇
- 桅桿工藝技術(shù)及施工要求
- (完整版)六年級(jí)下冊(cè)體育教學(xué)計(jì)劃與教案
- 幼兒園教育和家庭教育的有效結(jié)合研究
評(píng)論
0/150
提交評(píng)論