iT邦幫忙

2021 iThome 鐵人賽

DAY 16
1
自我挑戰組

翻車機率極高的2D平台遊戲(2D Platformer)製作系列 第 16

[Day16] 再戰SAT

今天花了一整天Debug,一直看為甚麼「Not Work」,單純紀錄一下流程。

今日目標

  • 修好昨天的SAT範例

簡單紀錄Debug的流程(?)

依照昨天的文章把SAT碰撞偵測分成幾個步驟,開始算(演算法)之前會需要一些資料。

先說結論,其實目標蠻簡單的,圖形也就兩個矩形而已,怎麼花了這麼長的時間Debug

  1. 沒搞懂向量的運算
  2. 沒有善用Debug工具,例如簡單的畫線標示向量
  3. 當預設範例不成功時,沒有拆解更小或更簡單的範例去實作

第一點,沒話說,數學基礎差,只能多多接觸跟多算。第二點,除了之前的Log,還標示了座標位置與法向量的「點」,對阿...我怎麼沒想到是標示「線」呢。

最後第三點才是我找出問題的關鍵,昨天有提到「AABB是一種SAT」,他的法向量就是XY兩軸,原本是設定兩個旋轉45度矩形互撞,發現有Bug,印出Log看看頂點、邊、法向量等資料,看不太出來,於是把兩個矩形轉回正的,再印輸出一次Log,發現到法向量不是X或Y軸,結果發現是之前寫的求單位向量的功能,是錯的(因為之前寫完就沒有一一測試呢....ˊ_>ˋ)。

再來是救是SAT的核心演算法了,要求出每個頂點對各個法向量的正投影,如果XY兩軸為可能的分離軸,四個頂點又是沒有旋轉的矩形的四個點,以X軸為例,其正投影就會是該點X軸的分量,用點積算出來也就只會是X純量,結果出來,也是錯的....,到頭來也是之前寫的點積算法錯了.....(ˊ_>ˋ)

最後...終於修好了範例(ˊ_>ˋ),對!只有範例,沒測過其他的情況。

計畫敢不上變化

原本預計碰撞之後,可能開始進行物件的移動,以及物理的部分,但最近這幾篇發現原本設計的架構,寫的綁手綁腳的。明明是C,卻以OOP的思維,用了最OOP最令人詬病的部分,刻意把一些數據用類似private的部分封裝。

加上原本設計DrawRectangleDrawTexture就是想要單純的封裝實作,只要填一些數據就好...

或許是要調整整體設計了。不然之後可能會有更多坑...

這是完成的結果,相當凌亂,沒有整理


上一篇
[Day15] 碰撞偵測 - 分離軸原理 SAT
下一篇
[Day17] 基本移動
系列文
翻車機率極高的2D平台遊戲(2D Platformer)製作33

尚未有邦友留言

立即登入留言