JME手機(jī)游戲設(shè)計案例源代碼GameEngine_mySprite_第1頁
JME手機(jī)游戲設(shè)計案例源代碼GameEngine_mySprite_第2頁
JME手機(jī)游戲設(shè)計案例源代碼GameEngine_mySprite_第3頁
JME手機(jī)游戲設(shè)計案例源代碼GameEngine_mySprite_第4頁
JME手機(jī)游戲設(shè)計案例源代碼GameEngine_mySprite_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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;/* * 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 Thread MainThread; /游戲主線程 private final int MS_PE

5、R_FRAME=30; /設(shè)置一次游戲循環(huán)所需時間,單位為毫秒(ms),每秒游戲幀數(shù)約為1000/MS_PER_FRAME private int cps; /游戲幀速 private boolean isPaused; /游戲暫停狀態(tài) private boolean running; /游戲運行狀態(tài) Graphics g; /游戲繪圖對象 private int ScreenWidth; /游戲屏幕寬度 private int ScreenHeight; /游戲屏幕高度 public static int GameState; /游戲狀態(tài),1為暫停,2為游戲進(jìn)行中,3為游戲失敗 public

6、 static int KeyState; /按鍵狀態(tài) private Image img;/圖像 private int currentX;/圖像坐標(biāo) private int currentY; private Image imgBoy; /精靈圖像 private Sprite sprBoy; /定義精靈 private mySprite spr;/定義字體private Font largeFont=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD, Font.SIZE_LARGE); private Font mediumFont=Font.g

7、etFont(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(); /獲取繪圖對象 running=false; /設(shè)置游戲運行狀態(tài) isPaused=false;

8、 GameInit(); /游戲初始化 /* 游戲初始化 */ private void GameInit() try img=Image.createImage("/fox.png"); imgBoy = Image.createImage("/Boy.png"); /創(chuàng)建圖像 catch (IOException ex) ex.printStackTrace(); / sprBoy=new Sprite(imgBoy,imgBoy.getWidth()/3,imgBoy.getHeight()/3); sprBoy=new Sprite(imgBoy

9、,32,48); int LeftSequ=3,4,3,5; sprBoy.setFrameSequence(LeftSequ); sprBoy.setFrame(3); int sw=sprBoy.getWidth(); int sh=sprBoy.getHeight(); sprBoy.defineCollisionRectangle(sw/10, sh/10, sw*8/10,sh*8/10); sprBoy.defineReferencePixel(sprBoy.getWidth()/2, sprBoy.getHeight()/2); System.out.println(sprBoy

10、.getFrameSequenceLength();System.out.println(sprBoy.getRawFrameCount(); currentX =ScreenWidth / 2; /初始化圖像坐標(biāo) currentY = ScreenHeight / 2; spr=new mySprite(imgBoy,32,48); /* 游戲運行 */ public void run() int cyclesThisSecond=0; /當(dāng)前1秒內(nèi)的循環(huán)次數(shù) long cycleStartTime; /循環(huán)開始時間 long lastCPSTime=0; /上次計算幀速的時間 long c

11、ycleEndTime=0; /循環(huán)結(jié)束時間 long cycleTimes=0; /一次游戲循環(huán)熱所花的時間 boolean bSkip = false; /游戲是否跳幀 cps=0; System.out.println("游戲開始");/在控制臺輸出開始信息,可屏蔽 /* 游戲主循環(huán) */ while(running) /檢查是否運行 cycleStartTime = System.currentTimeMillis();/記錄游戲循環(huán)開始時間 / 下面語句用于處理游戲內(nèi)容,如果游戲設(shè)置為跳幀, / 則本次循環(huán)不處理游戲內(nèi)容 if(!bSkip) GameInput(

12、); /處理輸入消息 GameCycle(); /處理游戲邏輯 render(g); /渲染游戲畫面 flushGraphics(); /更新畫面 /* 下面語句用于計算游戲循環(huán)時間,并進(jìn)行相應(yīng)處理 */ cycleEndTime=System.currentTimeMillis(); /記錄游戲循環(huán)結(jié)束時間 cycleTimes=cycleEndTime-cycleStartTime; /計算循環(huán)時間 /如果循環(huán)時間間隔小于MS_PER_FRAME,則通過休眠,使其不小于rate, /并能讓系統(tǒng)有空閑轉(zhuǎn)去處理其他事務(wù) if(cycleTimes<MS_PER_FRAME) bSkip

13、= false; try Thread.sleep(MS_PER_FRAME - cycleTimes); /休眠 catch (InterruptedException ex) ex.printStackTrace(); else /如果循環(huán)時間大于MS_PER_FRAME,則設(shè)置bSkip為true, /讓程序跳過一次循環(huán),以主動丟幀的方式換取游戲速度 bSkip = true; /下面語句用于計算每秒的循環(huán)次數(shù),即幀速,在游戲中如果不需要,/可將這部分語句及相關(guān)變量注釋屏蔽 if (System.currentTimeMillis() - lastCPSTime > 1000) /

14、檢查距上次計算幀數(shù)的/時間是否經(jīng)過1000ms lastCPSTime=System.currentTimeMillis(); /設(shè)定lastCPS為當(dāng)前時間 cps = cyclesThisSecond; System.out.println("cps:"+cps); /輸出每秒的幀數(shù) cyclesThisSecond = 0; /重置幀數(shù) else cyclesThisSecond+; /幀數(shù)遞增 System.out.println("游戲結(jié)束!"); release(); /釋放資源 exit(); /退出游戲 /* 啟動游戲進(jìn)程 */ publ

15、ic void start() /檢查游戲循環(huán)是否處于運行狀態(tài),如果未運行,則創(chuàng)建線程并啟動 /如果游戲處于運行狀態(tài),則表示是暫停后的繼續(xù)執(zhí)行,僅設(shè)置暫停狀態(tài)即可 if(!running) running=true; MainThread=new Thread(this); MainThread.start(); GameState=2; else GameState=2; setPaused(false); /退出游戲 private void exit() mid.exit(); /退出游戲 /* 停止游戲 */ private void stop() running=false; /終止

16、游戲循環(huán) /* 釋放游戲資源 */ private void release() /此處為釋放游戲資源的代碼 img=null; System.gc(); /*獲取暫停狀態(tài) */ public boolean getPaused() return isPaused; /* 設(shè)置暫停狀態(tài) */ public void setPaused(boolean isPaused) this.isPaused = isPaused; /* 處理游戲輸入信息 */ private void GameInput() int keyStates = this.getKeyStates(); /獲取按鍵狀態(tài) /*

17、 下面是對按鍵事件的具體處理,應(yīng)根據(jù)游戲需要進(jìn)行修改*/ KeyState=0; /Fire if(keyStates & FIRE_PRESSED )!=0) KeyState=FIRE_PRESSED; / Left if (keyStates & LEFT_PRESSED) != 0) KeyState=LEFT_PRESSED; / Right if (keyStates & RIGHT_PRESSED) !=0 ) KeyState=RIGHT_PRESSED; / Up if (keyStates & UP_PRESSED) != 0) KeySta

18、te=UP_PRESSED; / Down if (keyStates & DOWN_PRESSED) !=0) KeyState=DOWN_PRESSED; /Game_A if(keyStates & GAME_A_PRESSED)!=0) KeyState=GAME_A_PRESSED; /Game_B if(keyStates & GAME_B_PRESSED)!=0) KeyState=GAME_B_PRESSED; /* 渲染游戲畫面 */ private void render(Graphics g) /* 填充背景 */ g.setColor(0xfff

19、fff); g.fillRect(0, 0, ScreenWidth,ScreenHeight); g.drawImage(img,100, 150, Graphics.LEFT|Graphics.TOP); /* 下面是對游戲渲染的具體處理,應(yīng)根據(jù)游戲需要進(jìn)行修改*/ /繪制圖像,圖像位置隨按鍵移動 / g.drawImage(img,currentX, currentY, Graphics.HCENTER|Graphics.VCENTER); / sprBoy.setPosition(currentX, currentY); / sprBoy.setPosition(80, 100); /

20、 sprBoy.setRefPixelPosition(80, 100); sprBoy.setTransform(Sprite.TRANS_MIRROR); if(sprBoy.collidesWith(img, 100, 150, false) System.out.println("dddd"); sprBoy.move(1, 1); / sprBoy.setTransform(Sprite.TRANS_ROT90); sprBoy.paint(g); spr.setFrame(9); spr.render(g); /下面語句用于繪制屏幕尺寸和游戲幀速 /定義字符串

21、String strWH="Width:"+String.valueOf(ScreenWidth)+" Height:"+String.valueOf(ScreenHeight); String strCPS="CPS:"+String.valueOf(cps); /繪制背景矩形 g.setColor(0xccbb00); g.fillRect(15, 8, 60, 20); g.fillRect(115, 8, 120, 20); /繪制字符串 g.setColor(0xffffff); g.setFont(mediumFont);

22、 /設(shè)置字體 g.drawString(strCPS,20,10, Graphics.LEFT| Graphics.TOP); g.drawString(strWH,120,10, Graphics.LEFT| Graphics.TOP); /當(dāng)處于游戲暫停狀態(tài)時,繪制下面的內(nèi)容 if(getPaused() g.setColor(0xccbbcc); g.fillRect(70, 100, 100, 20); g.setColor(0xffffff); g.setFont(largeFont); g.drawString("游 戲 暫 停",85,100, Graphic

23、s.LEFT| Graphics.TOP); /* 游戲主函數(shù),處理游戲邏輯*/ private void GameCycle() switch(GameState) case 1: /游戲暫停狀態(tài)時的處理 /根據(jù)按鍵狀態(tài)執(zhí)行相應(yīng)功能 switch(KeyState) case GAME_A_PRESSED: /按下GAME_A鍵時的處理 GameState=4; /設(shè)置游戲狀態(tài)會結(jié)束程序 break; case FIRE_PRESSED: /按下FIRE鍵時的處理 if(getPaused() GameState=2; setPaused(false); break; break; case

24、 2: /游戲處于運行狀態(tài)時的處理 /根據(jù)按鍵狀態(tài)執(zhí)行相應(yīng)功能 switch(KeyState) case FIRE_PRESSED: /按下Fire鍵時 GameState=1; /設(shè)置游戲狀態(tài)為暫停 setPaused(true); /設(shè)置暫停 break; case LEFT_PRESSED: /按下Left鍵時 currentX = Math.max(0, currentX - 2); /改變水平坐標(biāo) sprBoy.nextFrame(); break; case RIGHT_PRESSED: /按下Right鍵時 currentX = Math.min(ScreenWidth - 2

25、, currentX + 2);/改變水平坐標(biāo) break; case UP_PRESSED: /按下Up鍵時 currentY = Math.max(0, currentY - 2); /改變垂直坐標(biāo) break; case DOWN_PRESSED: /按下Right鍵時 currentY = Math.min(ScreenHeight - 2, currentY + 2); /改變垂直坐標(biāo) break; case GAME_A_PRESSED: /按下Game_A鍵時 GameState=4; /設(shè)置游戲狀態(tài)為退出 break; case GAME_B_PRESSED: /按下Game_

26、B鍵時 sprBoy.setFrame(2); break; break; case 3: /游戲失敗的處理 break; case 4: /游戲退出時的處理 stop(); /停止運行 break; *mySprite。Javaimport javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image;import javax.microedition.lcdui.game.Sprite;/* * To change this template, choose Tools | Templates * and o

27、pen the template in the editor. */* * * author Administrator */public class mySprite private Image imgSrc; /精靈源圖像 private Image imgSpr; /精靈當(dāng)前幀圖像 private int positionX; /精靈坐標(biāo) private int positionY; private int width; /精靈寬度 private int height; /精靈高度 private int r; /圓形包圍框的半徑 private int countFrames; /精

28、靈幀總數(shù) private int rows; /精靈幀行數(shù) private int cols; /精靈幀列數(shù) private int currentFrame; /當(dāng)前幀序號 private boolean isVisible; /是否可見 private int speed; /速度 private int dir; /方向 /* 使用image,幀寬度和幀高度構(gòu)造精靈*/ public mySprite(Image image, int frameWidth, int frameHeight) this.imgSrc = image; this.width = frameWidth; th

29、is.height = frameHeight; cols=image.getWidth()/frameWidth; /計算精靈幀列數(shù) rows=image.getHeight()/frameHeight; /計算精靈幀行數(shù) this.countFrames = cols*rows; /計算精靈幀總數(shù) isVisible=true; /設(shè)置精靈為可見 positionY=0; /設(shè)置精靈初始坐標(biāo) positionX=0; setFrame(0); /設(shè)置精靈當(dāng)前幀序號 r=(frameWidth>frameWidth?frameWidth:frameWidth)/2; /默認(rèn)以矩形較短的

30、邊的一半作為圓形包圍框的半徑 /* 獲取X坐標(biāo) */ public int getX() return this.positionX; /* 設(shè)置X坐標(biāo) */ public void setX(int positionX) this.positionX = positionX; /* 獲取Y坐標(biāo) */ public int getY() return this.positionY; /* 設(shè)置Y坐標(biāo) */ public void setY(int positionY) this.positionY = positionY; /* 設(shè)置當(dāng)前幀為指定幀 */ public void setFram

31、e(int index) if(currentFrame<countFrames && currentFrame>=0) currentFrame=index; imgSpr=Image.createImage(imgSrc, index%cols*getWidth(),index/cols*getHeight() ,getWidth(),getHeight(), Sprite.TRANS_NONE); /* 設(shè)置精靈當(dāng)前幀到下一幀 */ public void nextFrame() currentFrame+; if(currentFrame>=count

32、Frames) currentFrame=0; setFrame(getFrame(); /* 渲染精靈 */ public void render(Graphics g) if(isVisible) g.drawImage(imgSpr, positionX, positionY, Graphics.LEFT|Graphics.TOP); /* 獲取當(dāng)前幀序號 */ public int getFrame() return currentFrame; /* 通過矩形框進(jìn)行精靈碰撞檢測 */ public boolean collideRectwith(mySprite spr) if(spr

33、.getY() + spr.getHeight() < this.getHeight() | / 如果spr的底邊在當(dāng)前精靈的頂邊之上, spr.getY() > this.getY() + this.getHeight() | / spr的頂邊在當(dāng)前精靈的底邊之下, spr.getX() + spr.getWidth() < this.getX() | / spr的左邊在當(dāng)前精靈的右邊之右, spr.getX() > this.getX() + this.getWidth() ) / spr的右邊在當(dāng)前精靈的左邊之左,則表示spr與當(dāng)前精靈沒有碰撞 return fa

34、lse; return true; /* 通過圓形包圍框進(jìn)行精靈碰撞檢測*/ public boolean collideRound(mySprite spr) int x1,y1,x2,y2; x1=getX()+getWidth()/2; y1=getY()+getHeight()/2; x2=spr.getX()+spr.getWidth()/2; y2=spr.getY()+spr.getHeight()/2; /計算兩個圓心之間的距離是否小于兩個圓的半徑和,如果小于則發(fā)生碰撞 if(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<(r+spr.getR()*(r+spr.getR() return true; return false; /* 檢測指定的點是否在精靈范圍內(nèi)*/ public boolean isCollidingWith(int px, int py) if (px >= getX() && px <= (getX() + getWidth() && py >

溫馨提示

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

評論

0/150

提交評論