重力感应机制和手机的屏幕绘画
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
摘要:
利用手機的重力感應(yīng)機制和手機的屏幕繪畫功能,實現(xiàn)一款躲避休閑游戲。
實現(xiàn)平臺,工具:
采用java ADT工具,java語言,ZTE中興手機硬件測試。
UML設(shè)計:
核心代碼:
1.從當前的activity跳轉(zhuǎn)與下一個activity,主要的代碼如下:
Intent?intent?=?new?Intent(?mContext,SurfaceViewAcitvity.class?); startActivity(?intent?);2.提取和保存自己定義的數(shù)據(jù)。這里用了SharedPreferences對象提取手機里的數(shù)據(jù),而Editor對象則是向手機里寫 數(shù)據(jù)。
Context?ctx?=?SurfaceViewAcitvity.this;??????SharedPreferences?sp?=?ctx.getSharedPreferences("MYDATA",?MODE_PRIVATE);//獲取數(shù)據(jù),如果SCROSE不存在,則返回值為-1int?i?=?sp.getInt("SCROSE",?-1);/**如果沒有數(shù)據(jù),則初始化數(shù)據(jù)**/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.重繪屏幕,這里用了線程安全鎖,在異步操作中保證了同一時間只對屏重繪一次。通過獲取系統(tǒng)的前后時間,確保每秒鐘更新屏幕50幀。
public?void?run()?{while?(mIsRunning)?{/**?取得更新游戲之前的時間?**/long?startTime?=?System.currentTimeMillis();/**?在這里加上線程安全鎖?**/synchronized?(mSurfaceHolder)?{/**?拿到當前畫布?然后鎖定?**/mCanvas?=?mSurfaceHolder.lockCanvas();Draw();/**?繪制結(jié)束后解鎖顯示在屏幕上?**/mSurfaceHolder.unlockCanvasAndPost(mCanvas);}/**?取得更新游戲結(jié)束的時間?**/long?endTime?=?System.currentTimeMillis();/**?計算出游戲一次更新的毫秒數(shù)?**/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.游戲的開始界面:
所有的背景和圖標都是自己上網(wǎng)查找后并用PS處理過的,力求符合游戲的主題。其中“開始”按鈕和“退出”按鈕被我換成了小魚的圖標。
2.進入游戲界面:
當游戲即將開始里,會有提示出現(xiàn),符合人性化設(shè)計。
3.游戲中的界面:
游戲者通過控制小球躲避不停游過的小魚來獲得得分,堅持的時間越久,得分越高,為了激發(fā)游戲者的斗志,界面上還保存了游戲的至今的最高得分。
4.游戲結(jié)束界面:
游戲自動暫停,并提示游戲結(jié)束,同時也顯示了游戲者的最終得分,如果該得分高于歷史最高得分,將會代替歷史最高得分保存進手機。
轉(zhuǎn)載于:https://my.oschina.net/u/1540055/blog/280523
總結(jié)
以上是生活随笔為你收集整理的重力感应机制和手机的屏幕绘画的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RMQ(Range Minimum Qu
- 下一篇: 管道和过滤器模式----POSA模式助记