不使用物理引擎,自己動手做真實物理的模擬投籃游戲

? ?最近打算做一個2D投籃游戲,由于對于BOX2D等物理引擎并不熟悉,加之一開始低估了游戲所需要的碰撞檢測復雜度,認為僅僅涉及4面墻,籃球,籃板,籃筐,籃網的碰撞檢測并不復雜。因此決定自己實現所需要的碰撞檢測。結果實際開始做時磕磕碰碰遇到了許多問題。

? ? 1、如何實現像素級碰撞檢測。

? ?as3原生的hitTestObject只能檢測矩形,對于圓形等其他形狀就不適用了;打算用hitTestPoint來檢測籃球與籃板四個邊角,籃筐前后框點,在實踐嘗試中發現是有問題的,在涉及物體旋轉的情況下檢測就不精確了。因此只能自己實現像素級碰撞檢測。在網上查找了許多資料,終于找到比較好的解決思路:利用疊加模式檢測兩物體不透明像素部分。

   分享一位國外大牛寫的不規則物體像素級碰撞檢測算法及詳解

 2、計算碰撞物體的反彈速度及方向。

? ?我們可以常見的使用BOX2D等物理引擎實現的游戲,如桌球游戲,球與球相撞、球與桌的相撞,根據碰撞角度不同,反彈速度和方向也是不同的。把事情交給物理引擎解決,當然是高枕無憂,如果想自己計算出反彈速度及方向。那就不僅是寫寫代碼的問題,而是要通過數學、物理來解決。基本該問題分為兩部分解決:

  a)恢復現場:由于物體的移動是按幀改變的,所以物體位置變化不是連續的,而是離散的。當碰撞發生時,兩物體已經相交重疊了,而實際計算反彈速度和方向,需要在物體剛剛相碰撞一刻的情況下進行。因此需要將兩物體合理地恢復到剛剛碰撞的位置。實際物理引擎的處理非常復雜,而本游戲則是采用簡單方法處理。將球按反速度一點點回退,直到球與碰撞點的距離剛好為球的半徑。

  b)利用向量原理計算反彈速度及方向。實話說,自己憑空想的話怎么也想不到是通過向量的思路得出答案。剛開始做時琢磨了很久,查了一些資料,終于在一個帖子找到答案,這不就是高中學的空間向量嘛?赤果果的數學題啊~~

  向量幾何在游戲編程中的使用

?

  

我們現在的任務是:已知物體的速度向量S和邊界向量b,求它的反射向量F。我們先來看一下在碰撞過程中都有哪些向量關系:

設b是障礙向量,S是入射速度向量,F是反射速度向量,也就是我們要計算的向量。A是入射角度,A'是反射角度,A=A'。N是b的法向量,即N垂直于b。n是與N共線的向量,n'是N方向的單位向量。T是垂直于N的向量。根據向量加法,現在有關系:

(1) S + n = T
(2) n + T = F

合并,得
F = 2*T - S?

又已知T = S + n,

最終得 F = 2(S + n) - S = S - 2n

?

實際寫代碼是,Sx,Sy,nx,ny都是可以計算出來的,通過公式最終求出Fx,Fy。

?

3、畫出瞄準線。

  許多主流投籃類游戲都能在籃球投出前畫出瞄準線。說下實現思路。根據鼠標按下時的位置和當前位置可計算出初始速度和方向。既然知道了速度,就可根據時間計算距離。因此可計算投出后每隔一段時間后(如每隔0.1s),小球的舞臺坐標,并依次draw出一個個點,看起來就是一條瞄準線。有個必須要注意的細節。畫點的時候,要考慮重力對于垂直速度的改變。并且改變值要與實際小球渲染時的速度改變相同。如渲染時每隔0.1s計算一次重力因素對垂直速度的改變。在瞄準畫線時也需要每隔0.1s改變一次垂直速度。只有這樣,瞄準線才是正確的。

?

實現過程折騰了很久,解決了以上問題后終于使投籃過程顯得比較真實。盡管如此,這樣一個自己現實的簡單碰撞檢測,使用很局限,游戲玩法稍微深挖,像要在場景加入新的物體,就無法勝任了。最終學習了下BOX2D發現也不復雜,還是改成用Box2d物理引擎來做,通過筆者一番蛋疼的折騰后也證實,如果想要認認真真做一個物理游戲,用物理引擎才是正確的做法,把專業任務講給專業的系統去處理。

這里分享自己做這個小游戲的經驗,存當拋磚引玉,希望有人碰到某些特定需求,可以用上這些技巧。

游戲源碼下載地址:

不使用物理引擎,自己動手做真實物理的模擬投籃游戲

?

轉載于:https://www.cnblogs.com/leoin2012/p/3920712.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376733.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376733.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GoldenGate DDL雙向復制

繼續上一篇的實驗。 節點說明&#xff1a; dd1(源庫)--->>kf2(目標庫) dd1(目標庫)<<---kf2(源庫) 在配置反向復制過程中&#xff0c;可暫時把源庫和目標庫調換位置&#xff0c;配置基本上雷同。 但在官網上有說明要注意的一個地方&#xff1a; Do ei…

轉載|pymysql.err.InternalError: Packet sequence number wrong - got 45 expected 0

原文鏈接&#xff1a;https://www.cnblogs.com/heiao10duan/p/9373237.html 原因&#xff1a; 使用了多線程&#xff0c;多線程共享了同一個數據庫連接&#xff0c;但每個execute前沒有加上互斥鎖 方法&#xff1a; 方法一&#xff1a;每個execute前加上互斥鎖 lock.acquire…

JSF入門

1. 簡介 JSF技術是Sun公司在2004年發布的用于開發Web應用的框架。當前版本是2.2&#xff0c;由JSR344規范定義。它是Java EE 7推薦的Web標準框架。Mojarra(https://javaserverfaces.java.net/)是Oracle官方采用的JSF的參考實現&#xff0c;其他的參考實現還有Apache基金的MyFac…

nyist 488 素數環

有一個整數n&#xff0c;把從1到n的數字無重復的排列成環&#xff0c;且使每相鄰兩個數&#xff08;包括首尾&#xff09;的和都為素數&#xff0c;稱為素數環。 為了簡便起見&#xff0c;我們規定每個素數環都從1開始。例如&#xff0c;下圖就是6的一個素數環。 這題在進行判斷…

Android System分區大小異常

平臺&#xff1a;Freescale &#xff0f; Android 4.2.2 問題描述&#xff1a; 用 df 命令&#xff0c;看到/system分區大小275M。 用 busybox fdisk -l /dev/block/mmcblk0p5&#xff0c;看到 536M。 Freescale的刷機工具是Mfgtool&#xff0c;分區的動作在mksdcard-android.s…

python數據庫連接池使用

在轉載|pymysql.err.InternalError: Packet sequence number wrong - got 45 expected 0這一篇中&#xff0c;我使用了方法一。接下來試試方法三&#xff0c;方法三和方法二其實意義差不多&#xff0c;但是對于數據庫的連接并不是交由程序員管理而是交由連接池管理了&#xff0…

.Net入門-部署問題

學習一門新的語言難免會遇到各種各樣的問題&#xff0c;總結一下。 測試環境&#xff1a;windows2008serverIIS7 開發環境: vs2010 問題1&#xff1a;"Unrecognized attribute targetFramework. Note that attribute names are case-sensitive. " 分析&#xff1a; 開…

pymysql.err.OperationalError: (1203, “User root already has more than ‘max_user_connections‘ active

max_connections 是指MySQL服務器的最大連接數。即所有用戶最大連接數的和。 max_user_connections 是指MySQL中單個用戶的最大連接數。 這里說明當前用戶的連接數大于了單個用戶的最大連接數&#xff0c;需要擴大連接數&#xff1a; mysql> show variables like %connect%…

北京行——JSP入門與Servlet精通

Servlet技術 用來動態生成 網頁數據資源Servlet生成HTML 頁面數據時&#xff0c;所有內容都是通過 response.getWriter response.getOutputStream 向瀏覽器輸出的 <html> <head> </head> <body> Hello </body></html> 用Servlet 輸出流打印…

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

可以參考一波&#xff1a;https://stackoverflow.com/questions/16573332/jsondecodeerror-expecting-value-line-1-column-1-char-0 1、json格式不對引起的錯誤 加上if json_rep.content:判空操作 json_rep requests.post(url monitor_url, headers monitor_header,json …

WINDOWS系統Eclipse+NDK+Android + OpenCv

WINDOWS系統EclipseNDKAndroid OpenCv 參考文檔博客 1 NDK環境搭建 http://jingyan.baidu.com/article/5d6edee22d908799eadeec9f.html 2 官方文檔 Android.mk與Application.mk如何編寫&#xff0c;OpenCV庫如何調用 http://docs.opencv.org/trunk/doc/tutorials/introduction…

ural 1910. Titan Ruins: Hidden Entrance(Titan Ruins系列題目)

這是Titan Ruins系列第一道題&#xff0c;以后慢慢更新。 赤裸裸滴閱讀理解題&#xff0c;大意就是找到三個連在一起的數&#xff0c;使其之和最大&#xff0c;輸出的第一個數是這三個數的和&#xff0c;第二個數是中間那個數所在的位置。水題一道&#xff0c;很簡單。 1 #incl…

python OSError: [Errno 24] Too many open files | HTTPConnectionPool(host=‘‘, port=80): Max retries e

對于問題&#xff1a;python OSError: [Errno 24] Too many open files 原因:超出了進程同一時間最多可開啟的文件數. 解決方案P: 使用ulimit -n查看進程同一時間最多可開啟的文件數 mac默認是256&#xff0c;linux是1024 修改 sudo vim /etc/security/limits.conf 這個文件的最…

Android 之視頻監控

Android 視頻監控已經有示例了&#xff0c;如http://www.open-open.com/lib/view/open1346400423609.html完全可以實現簡單的監控功能。但是&#xff0c;如果想要在手機上監控另外一個手機就需要做一些改動了。 其中&#xff0c;手機A實現的功能和上文中的一樣&#xff0c;主要…

Max retries exceeded with url 解決方案

目錄問題解決方案keep alive 與close使用場景問題解決方案 在上一篇問題解決中&#xff1a;python OSError: [Errno 24] Too many open files | HTTPConnectionPool(host‘‘, port80): Max retries e 有提到修改本地進程最大文件數來避免Max retries exceeded with url 報錯&…

正確理解JavaScript

過去幾年我注意到技術圈一個很奇怪的現象&#xff0c;有太多程序員將那些他們只是有過非常淺顯的了解&#xff0c; 但其實根本就不懂的技術寫到他們的簡歷中&#xff0c;這個現象幾乎每種語言都有&#xff0c;但這其中最嚴重的就要數javascript了。 你不知道你不懂 出現這種狀況…

醫療機構遠程視頻監控集中管理,貝銳蒲公英提供一站式解決方案

上海某企業專業致力于醫療軟件、家居智能化研發、設計、銷售、集成及實施&#xff0c;企業主營業務之一為醫療軟件&#xff0c;涉及PACS/RIS/WEB/HIS、示教系統等方面的醫院信息化建設。 在實際應用、部署過程中&#xff0c;需要實現各地區分院與總院間的數據庫互相訪問、視頻數…

py腳本:linux系統下定時清理文件

linux清空文件內容的三種方法&#xff1a; 1.使用vi/vim命令打開文件后&#xff0c;輸入"%d"清空&#xff0c;后保存即可。但當文件內容較大時&#xff0c;處理較慢&#xff0c;命令如下&#xff1a; vim file_name :%d :wq2.使用cat命令情況&#xff0c;命令如下&a…

Process類:啟動和停止本地系統進程

Process.Start 方法 (String, String) 通過指定應用程序的名稱和一組命令行參數來啟動一個進程資源。&#xff08;并將該資源與新的 Process 組件相關聯&#xff09; 如果沒有啟動資源&#xff0c;則返回null Process.Start("d:\\0.jpg"); Process.StartInfo 屬性 獲…

NYOJ2括號配對問題

括號配對是最基本的棧的問題&#xff0c;它是棧入門的經典題目&#xff0c;思路是&#xff0c;如果是左括號直接進棧&#xff0c;如果是右括號&#xff0c;這時就要比較棧頂的元素與他是否匹配&#xff0c;如果匹配則出棧&#xff0c;否則進棧&#xff0c;下面是代碼的實現&…