版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、【Android游戲開發(fā)二十】物理游戲之重力系統(tǒng)開發(fā),讓你的游戲變得有質(zhì)有量!Himi 原創(chuàng), 歡迎轉(zhuǎn)載,轉(zhuǎn)載請在明顯處注明! 謝謝。原文地址:今天群里一哥哥說急需關(guān)于物理游戲方面的資料,so下午就隨手寫了一個簡單的圓形自由落體Demo,正好一起分享給大家學(xué)習(xí)下吧;先大概說一下,之前的文章中,給大家介紹過重力傳感器,那么和今天要說的重力系統(tǒng),其實是一樣的! 在重力傳感器中,雖然我也實現(xiàn)了一個圓形會根據(jù)手機反轉(zhuǎn)的角度而擁有不同的速度,但是其內(nèi)置加速度算法都是Android os封裝好的,而今天我們要講的重力系統(tǒng)就是去模擬這個加速度,從而讓一個自由落體的圓形,感覺跟現(xiàn)實中的皮球一樣有質(zhì)有量!下落的
2、時候速度加快,反彈起來以后速度慢慢減下來OK,先上兩張截圖,然后簡單介紹之后進行講解:Demo:簡介:(咳咳、玩的有點H,狂點按鈕搞的滿屏都是 - -)當你點擊模擬器任意按鍵的時候會隨機在屏幕上生成一個隨機大小、隨即顏色、隨即位置、不停閃爍的一個圓形,并且圓形都擁有重力,在做自由落體,當圓形觸到屏幕底部的時候會反彈,并且反彈的高度一次比一次低!這個實例中,為了好看,我沒有讓圓形最終慢到停下來,會一直在一個高度進行的反彈,下落; 還有一點:對于圓形當從一個高度自由落體的時候可能它在X坐標系上沒有發(fā)生改變,當然這是在我們代碼中,屬于理想狀態(tài),因為現(xiàn)實生活中,一般X/Y坐標系都會有變動,在此Demo
3、中,我主要把垂直下落并且反彈的功能做出來了,關(guān)于水平的加速度我沒做,第一是因為和垂直的處理思路基本一致,第二點我沒時間 - -.好了 不廢話!先介紹一下我自定義的圓形類: MyArc.java view plaincopy to clipboardprint?·········10········20········30··
4、183;·····40········50········60········70········80········90··
5、183;·····100·······110·······120·······130·······140·······150 1. package com.himi;7. /*8. * author
6、Himi9. * 自定義圓形類10. */11. public class MyArc 12. private int arc_x, arc_y, arc_r;/圓形的X,Y坐標和半徑13. private float speed_x = 1.2f, speed_y = 1.2f;/小球的x、y的速度14. private float vertical_speed;/加速度15. private float horizontal_speed;/水平加速度,大家自己試著添加吧16. private final float ACC = 0.135f;/為了模擬加速度的偏移值17. private
7、final float RECESSION = 0.2f;/每次彈起的衰退系數(shù)18. private boolean isDown = true;/是否處于下落 狀態(tài)19. private Random ran;/隨即數(shù)庫20. /*21. * 定義圓形的構(gòu)造函數(shù)22. * param x 圓形X坐標23. * param y 圓形Y坐標24. * param r 圓形半徑25. */26. public MyArc(int x, int y, int r) 27. ran = new Random();28. this.arc_x = x;29. this.arc_y = y;30. thi
8、s.arc_r = r;31. 32. public void drawMyArc(Canvas canvas, Paint paint) /每個圓形都應(yīng)該擁有一套繪畫方法33. paint.setColor(getRandomColor();/不斷的獲取隨即顏色,對圓形進行填充(實現(xiàn)圓形閃爍效果)34. canvas.drawArc(new RectF(arc_x + speed_x, arc_y + speed_y, arc_x + 2 *35. arc_r + speed_x, arc_y + 2 * arc_r + speed_y), 0, 360,true, paint);36. 3
9、7. /*38. * return39. * 返回一個隨即顏色40. */41. public int getRandomColor() 42. int ran_color = ran.nextInt(8);43. int temp_color = 0;44. switch (ran_color) 45. case 0:46. temp_color = Color.WHITE;47. break;48. case 1:49. temp_color = Color.BLUE;50. break;51. case 2:52. temp_color = Color.CYAN;53. break;54
10、. case 3:55. temp_color = Color.DKGRAY;56. break;57. case 4:58. temp_color = Color.RED;59. break;60. case 6:61. temp_color = Color.GREEN;62. case 7:63. temp_color = Color.GRAY;64. case 8:65. temp_color = Color.YELLOW;66. break;67. 68. return temp_color;69. 70. /*71. * 圓形的邏輯72. */73. public void logi
11、c() /每個圓形都應(yīng)該擁有一套邏輯74. if (isDown) /圓形下落邏輯75. /*-備注1-*/speed_y += vertical_speed;/圓形的Y軸速度加上加速度76. int count = (int) vertical_speed+;77. /這里拿另外一個變量記下當前速度偏移量78. /如果下面的for (int i = 0; i < vertical_speed+; i+) 這樣就就死循環(huán)了 - -79. for (int i = 0; i < count; i+) /備注180. /*-備注2-*/ vertical_speed += ACC;81
12、. 82. else /圓形反彈邏輯83. speed_y -= vertical_speed;84. int count = (int) vertical_speed-;85. for (int i = 0; i < count; i+) 86. vertical_speed -= ACC;87. 88. 89. if (isCollision() 90. isDown = !isDown;/當發(fā)生碰撞說明圓形的方向要改變一下了!91. vertical_speed -= vertical_speed * RECESSION;/每次碰撞都會衰減反彈的加速度92. 93. 94. /*9
13、5. * 圓形與屏幕底部的碰撞96. * return97. * 返回true 發(fā)生碰撞98. */99. public boolean isCollision() 100. return arc_y + 2 * arc_r + speed_y >= MySurfaceViee.screenH;101. 102. 代碼比較簡單主要講解下幾個備注:備注1: 估計有些同學(xué)看到這里有點小暈,我解釋下,大家都知道自由落體的時候,速度是越來越快的,這是受到加速度的影響,所以這里我們對原有的圓形y速度基礎(chǔ)上再加上加速度!備注2:雖然加速度影響了圓形原有的速度,但是我們的加速度也不是恒定的,為了模擬真
14、實球體的自由下落,這里我們不僅對加速度增加了偏移量ACC,而且我們還要對其變化的規(guī)律進行模擬,讓下次的加速度偏移量成倍增加!所以為什么要for循環(huán)的時候把加速度的值當成for循環(huán)的一個判定條件!好了,下面來看我們SurfaceView!view plaincopy to clipboardprint?·········10········20·······&
15、#183;30········40········50········60········70········80·······&
16、#183;90········100·······110·······120·······130·······140·······150 1. package com.h
17、imi;13. public class MySurfaceViee extends SurfaceView implements Callback, Runnable 14. private Thread th;15. private SurfaceHolder sfh;16. private Canvas canvas;17. private Paint paint;18. private boolean flag;19. public static int screenW, screenH;20. private Vector<MyArc> vc;/這里定義裝我們自定義圓形的
18、容器21. private Random ran;/隨即庫22. public MySurfaceViee(Context context) 23. super(context);24. this.setKeepScreenOn(true);25. vc = new Vector<MyArc>();26. ran = new Random();/備注127. sfh = this.getHolder();28. sfh.addCallback(this);29. paint = new Paint();30. paint.setAntiAlias(true);31. setFocu
19、sable(true);32. 33. public void surfaceCreated(SurfaceHolder holder) 34. flag = true;/這里都是上一篇剛講過的。35. th = new Thread(this);36. screenW = this.getWidth();37. screenH = this.getHeight();38. th.start();39. 40. public void draw() 41. try 42. canvas = sfh.lockCanvas();43. canvas.drawColor(Color.BLACK);4
20、4. if (vc != null) /當容器不為空,遍歷容器中所有圓形畫方法45. for (int i = 0; i < vc.size(); i+) 46. vc.elementAt(i).drawMyArc(canvas, paint);47. 48. 49. catch (Exception e) 50. / TODO: handle exception51. finally 52. try 53. if (canvas != null)54. sfh.unlockCanvasAndPost(canvas);55. catch (Exception e2) 56. 57. 58
21、. 59. private void logic() /主邏輯60. if (vc != null) /當容器不為空,遍歷容器中所有圓形邏輯61. for (int i = 0; i < vc.size(); i+) 62. vc.elementAt(i).logic();63. 64. 65. 66. Override67. public boolean onKeyDown(int keyCode, KeyEvent event) 68. /當按鍵事件響應(yīng),我們往容器中仍個我們的圓形實例69. vc.addElement(new MyArc(ran.nextInt(this.getWidth(), ran.nextInt(100), ran.nextInt(50);70. return true;71. 72. public void run() 73. / TODO Auto-generated method stub74. while (flag) 75. logic();76. draw();77. try 78. Th
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 繼電器電市場分析及投資價值研究報告
- 卸貨行業(yè)營銷策略方案
- 口腔外科服務(wù)行業(yè)經(jīng)營分析報告
- 塑料杯蓋產(chǎn)業(yè)鏈招商引資的調(diào)研報告
- 為電話購物提供電信渠道行業(yè)相關(guān)項目經(jīng)營管理報告
- 移動電話顯示屏市場發(fā)展前景分析及供需格局研究預(yù)測報告
- 皮膚保濕霜化妝品商業(yè)機會挖掘與戰(zhàn)略布局策略研究報告
- 失物招領(lǐng)行業(yè)營銷策略方案
- PP網(wǎng)貸平臺運營行業(yè)市場調(diào)研分析報告
- 藥用面粉商業(yè)機會挖掘與戰(zhàn)略布局策略研究報告
- 特殊學(xué)生心理健康基本檔案表
- MySQL數(shù)據(jù)庫實用教程-教學(xué)大綱(課程思政)
- 自然資源學(xué)概論期末考試試卷
- 河南省高校畢業(yè)生基層就業(yè)國家助學(xué)貸款代償申請表
- 高速鐵路客運設(shè)施設(shè)備課件
- 旁站監(jiān)理記錄表(通用)
- rmk1608電阻型號命名規(guī)則
- 一種40CrNiMoA鋼棒的熱處理方法及應(yīng)用與流程
- 脈診-教學(xué)講解課件
- 供應(yīng)商信息管理臺賬
- 閉合導(dǎo)線全站儀導(dǎo)線測量記錄表
評論
0/150
提交評論