重力感應機制和手機的屏幕繪畫

摘要: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.遊戲結束界面:

遊戲自動暫停,並提示遊戲結束,同時也顯示了遊戲者的最終得分,若是該得分高於歷史最高得分,將會代替歷史最高得分保存進手機。

相關文章
相關標籤/搜索