摘要:java
利用手機的重力感應機制和手機的屏幕繪畫功能,實現一款躲避休閒遊戲。安全
實現平臺,工具:異步
採用java ADT工具,java語言,ZTE中興手機硬件測試。工具
UML設計:測試
核心代碼:this
1.從當前的activity跳轉與下一個activity,主要的代碼以下:spa
Intent intent = new Intent( mContext,SurfaceViewAcitvity.class ); startActivity( intent );
2.提取和保存本身定義的數據。這裏用了SharedPreferences對象提取手機裏的數據,而Editor對象則是向手機裏寫 數據。線程
Context ctx = SurfaceViewAcitvity.this; SharedPreferences sp = ctx.getSharedPreferences("MYDATA", MODE_PRIVATE); //獲取數據,若是SCROSE不存在,則返回值爲-1 int i = sp.getInt("SCROSE", -1); /**若是沒有數據,則初始化數據**/ if(i==-1){ Editor editor = sp.edit(); editor.putInt("SCROSE", 0); editor.commit(); }
3.繪製屏幕,每秒鐘程序都會自動繪製手機屏幕50次,每次從新繪製屏幕都會從新繪製遊戲的背景,當前小球的位置和流動的小魚的位置。核心代碼以下:設計
private void Draw() { /**繪製遊戲背景**/ mCanvas.drawBitmap(mbitmapBg,0,0, mPaint); /**繪製小球**/ mCanvas.drawBitmap(mbitmapBall, mPosX,mPosY, mPaint); /**繪製最高分和當前得分**/ if(scrose>0) myscrose = scrose; mCanvas.drawText("最高分 :" + maxscrose+"分", 10, 30, mPaint); mCanvas.drawText("得 分 :" + myscrose+"分", 10, 60, mPaint); /**繪製遊動的小魚**/ mCanvas.drawBitmap(fish1, fish_1_X,fish_1_Y, mPaint); mCanvas.drawBitmap(fish2, fish_2_X,fish_2_Y, mPaint); mCanvas.drawBitmap(fish3, fish_3_X,fish_3_Y, mPaint); mCanvas.drawBitmap(fish4, fish_4_X,fish_4_Y, mPaint); mCanvas.drawBitmap(fish5, fish_5_X,fish_5_Y, mPaint); }
4.重繪屏幕,這裏用了線程安全鎖,在異步操做中保證了同一時間只對屏重繪一次。經過獲取系統的先後時間,確保每秒鐘更新屏幕50幀。code
public void run() { while (mIsRunning) { /** 取得更新遊戲以前的時間 **/ long startTime = System.currentTimeMillis(); /** 在這裏加上線程安全鎖 **/ synchronized (mSurfaceHolder) { /** 拿到當前畫布 而後鎖定 **/ mCanvas = mSurfaceHolder.lockCanvas(); Draw(); /** 繪製結束後解鎖顯示在屏幕上 **/ mSurfaceHolder.unlockCanvasAndPost(mCanvas); } /** 取得更新遊戲結束的時間 **/ long endTime = System.currentTimeMillis(); /** 計算出遊戲一次更新的毫秒數 **/ int diffTime = (int) (endTime - startTime); /** 確保每次更新時間爲50幀 **/ while (diffTime <= TIME_IN_FRAME) { diffTime = (int) (System.currentTimeMillis() - startTime); /** 線程等待 **/ Thread.yield(); }
5.獲取手機重力機制下重心的偏移量,用於肯定小球的座標位置,同時當小球的座標超出手機的邊界時,使它不離開手機邊界。
public void onSensorChanged(SensorEvent event) { mGX = event.values[SensorManager.DATA_X]; mGY= event.values[SensorManager.DATA_Y]; mGZ = event.values[SensorManager.DATA_Z]; //這裏乘以6是爲了讓小球移動的更快 mPosX += mGY * 6; mPosY += mGX * 6; //檢測小球是否超出邊界 if (mPosX < 0) { mPosX = 0; } else if (mPosX > mScreenBallWidth) { mPosX = mScreenBallWidth; } if (mPosY < 0) { mPosY = 0; } else if (mPosY > mScreenBallHeight) { mPosY = mScreenBallHeight; }
效果展現:
1.遊戲的開始界面:
全部的背景和圖標都是本身上網查找後並用PS處理過的,力求符合遊戲的主題。其中「開始」按鈕和「退出」按鈕被我換成了小魚的圖標。
2.進入遊戲界面:
當遊戲即將開始裏,會有提示出現,符合人性化設計。
3.遊戲中的界面:
遊戲者經過控制小球躲避不停遊過的小魚來得到得分,堅持的時間越久,得分越高,爲了激發遊戲者的鬥志,界面上還保存了遊戲的至今的最高得分。
4.遊戲結束界面:
遊戲自動暫停,並提示遊戲結束,同時也顯示了遊戲者的最終得分,若是該得分高於歷史最高得分,將會代替歷史最高得分保存進手機。