你的命中率是多少呢?
效果預覽
配置環境:
Cocos Creator 3D v1.0.1
玩法說明:
觸摸屏幕,向上滑動投籃!注意籃板是會移動的哦!看看你的命中率是多少!
實現原理
為了能達到好的投籃效果,在網上找了一個投籃機參數,大致按照實際參數設置籃框大小,球的大小,以及籃框的位置。
碰撞器:
籃板直接使用 盒碰撞器組件(BoxColliderComponent),籃球使用的是 球碰撞器組件(SphereColliderComponent)。
因為沒有 圓環碰撞器組件,所以對於籃球框用了多個 球碰撞器組件 實現碰撞檢測。
小球軌跡:
由於完全採用了物理引擎計算,要讓小球軌跡如我們所預期一樣,得遵循物理原理。這裡需要的知識是 位移與加速度、速度、時間的關係。
我們可以分為三個方向來考慮,需要計算初始速度 V_z 和 V_y 。在 Z 軸方向可以看作勻速運動,Y 軸方向為勻加速運動。其中 Z 軸 和 Y 軸 的位移我們已經設定好了,我們只需要設定拋球時間 t 就可以計算出初速度。注意 Y 軸的末速度要滿足與初速度相反,才能達到圖中拋物線的效果哦。參考計算方式如下:
const CONST_H = 1.25;
const CONST_S = 2.3;
const CONST_G = -10;
const CONST_T = 0.8;
const CONST_V_Z = CONST_S / CONST_T;
const CONST_V_Y = CONST_H / CONST_T - CONST_G * CONST_T / 2;
初始速度 V_x 可以根據觸摸開始的位置 x 和觸摸結束的位置 x 的差值乘以一個係數來獲取。
進球判斷:
我是在籃球框下方添加一個碰撞器檢測。再通過分組和掩碼控制碰撞器的開關。發射前,打開碰撞檢查,投進時,關閉碰撞檢測,讓球往下掉。
只要以下條件為真就會進行碰撞檢測。
(GroupA & MaskB) && (GroupB & MaskA)
經測試發現,默認的 Mask 為 -1 (即每一位都是1),默認的 Group 為 1 。 所以只要將 MaskB 設置為 2 (即只有第二位為1,其餘為0 ) ,通過控制 GroupA 第二位可以控制碰撞器開關。參考代碼如下:
const PHY_GROUP = { Group1: 1 << 1}
// 設置籃框碰撞器mask
this.colliderComponent_goal.setMask(PHY_GROUP.Group1)
// 打開碰撞,設置球的group
this.colliderComponent_basketball.addGroup(PHY_GROUP.Group1)
// 關閉碰撞,設置球的group
this.colliderComponent_basketball.removeGroup(PHY_GROUP.Group1)
小結
小球軌跡通過基本的物理知識分析得出初始速度!得分判斷採用的是碰撞器檢測,並控制其檢測開關讓球繼續運動。如果你有更好的方法或想法,歡迎留言分享交流!
以上為白玉無冰使用 Cocos Creator 3D 開發"拇指投籃"項目的主要技術分享,歡迎關注[白玉無冰]公號,內有完整代碼和試玩鏈接。
更多精彩
閱讀更多 白玉無冰 的文章