1.小組博客地址
(https://www.cnblogs.com/fanfaniscute/p/12173375.html)
2.本組課題/本人任務
- 使用物理引擎JBox2D完成游戲關卡的各個物理狀態模擬
- 根據物理引擎設計Bird,Pig,Brick等游戲中出現的可運動剛體類
- 建立JBox2d的工具類以實現
本人對這次課設的看法與吐槽
課設內容的腦洞是我在看完17級學長的游戲課設之后想出的
當時還沒學java網絡編程的內容,誤以為java課設只能做游戲(然后一路頭鐵到底)
在前期准備的時候參考的基礎代碼和鄭老師博客中的參考資料南洋理工Java Game Programming
前者的代碼僅使用了碰撞檢測,無法對物體的實際運動狀態進行模擬
后者使用物理公式模擬了運動軌跡,利用圓的各向性質相同實現了圓形的碰撞后反向運動,而憤怒的小鳥游戲中各向性質相同的物體並不存在
於是當時在前期調查報告中加了這句話
天真的認為物理引擎是簡單物理公式/數學公式進行編寫碰撞,旋轉等操作的代碼
下載了一個JBox2D的jar包,找不到文檔,就先扔着了(並不知道將要面對什么)
直到發現JBox2D的示例代碼也基本沒有時,到github下載了源碼,才發現自己工作量遠超想象
3.物理引擎JBox2D簡介/分析
JBox2D是開源的物理引擎Box2D的Java版本
該引擎能夠根據開發人員設定的參數,如重力、密度、摩擦系數和彈性系數等,對2D剛體物理運動的全方位模擬
安卓版的憤怒的小鳥也是依賴JBox2D引擎
3.1 JBox2D引擎的主要類
Vec2類 二維矢量
World類 世界
Body類 剛體
BodyDef類 剛體描述
Fixture 夾具
FixtureDef 夾具描述
CircleShape 圓形
PolygonShape 多邊形
包含關系
4.JBox2D在本項目的使用
對物理引擎的調用架構參考(CSDN博客)[https://blog.csdn.net/cre2017/article/details/81268995]
該博客使用的JBox2D版本已過時,大部分對物理引擎的調用方法已失效,已通過閱讀新版源碼的方式修正這些方法
只有球類的自由落體演示,並且作者對Jbox2d方面的內容不再更新
剛體繪制無法進行旋轉,自行研究了如何進行剛體隨實際運動
但是作為唯一的一份找到的幫助我理解JBox2D引擎的代碼,對作者還是十分感謝
Conf類:配置參數
存儲構建世界/畫布時使用的常量
抽象類MyFrame 繼承自JFrame
屬性:
AABB aabb //規定世界范圍
World world //模擬的物理世界
ArrayList
MyBody類
DrawThread類 繼承自Thread
繪制線程,同步啟動鼠標監聽器
Gview 類 繼承自JPanel
設置背景,啟動繪制線程
Box2dUtil類
根據JBox2d引擎進行Body的組裝
MymouseListener類
根據鼠標點擊創建並發射bird類
MyBrickBody類
矩形剛體及繪制方法
MyCircleBody類
圓形剛體及繪制方法
Bird類 繼承自MyCircleBody
設置圖片與hp
Pig類 繼承自MyCircleBody
Wall類 繼承自MyBrickBody類
Brick類 繼承自MyBrickBody類
5.存在的問題
對物理引擎的理解仍然不夠深入,部分操作短時間內不能實現
存在無法無法解決的bug,github上已經開源的代碼與依賴jar包版本不匹配,對問題發生處朔源失敗
課設時間(一周)實在太短,只完成了勉強能動的游戲內容