iT邦幫忙

2025 iThome 鐵人賽

DAY 30
1
自我挑戰組

用 C++ 實作簡易第一人稱視角遊戲:從入門到理解 Ray Casting系列 第 30

Day 30 | Ray Casting :30 天鐵人挑戰的完結篇

  • 分享至 

  • xImage
  •  

大家好~這裡是鐵匠史密斯!(Bro fist!)
經過了這 30 天,我們從一開始什麼都沒有,只靠一個 wstring map,到現在能讓角色在迷宮中「走動、轉身、看到牆壁與地板」,一步一步搭建出屬於我們的 Console FPS 小世界。

今天的文章,不會有新程式碼,我想帶大家 回顧整個系列的脈絡,以及 下一步的方向。

回顧 30 天的旅程

  • Day 1 ~ 4:
  1. 建立工具與世界觀
  2. wchar_t* screen 畫布
  3. wstring map 地圖
  4. 玩家座標 (fPlayerX, fPlayerY)
  • Day 5 ~ 10:
  1. Ray Casting 的準備
  2. 玩家位置 & 視角定義 (fPlayerAAoV)
  3. screenmap 的對應
  4. 如何從螢幕每一行射出「光線」
  • Day 11 ~ 17:
  1. 光的行進 & 牆壁高度
  2. 光如何一步一步走、偵測牆壁
  3. 距離與牆高的反比關係
  4. 用針孔成像比擬公式,驗證 javidx9 的思路

Day 17 ~ 29:

  1. QE 旋轉視角
  2. WS 前進後退
  3. 牆壁、地板渲染(█ ▓ ▒ ░以及 #x.-)
  4. AD 橫移 以及 旋轉矩陣
  5. 碰撞檢測

一個「迷宮探索」Console 遊戲雛形完成!

其實,javidx9大神在後面還有實作一個目前我還沒釐清的部分,叫做
Corner Detection,顧名思義,就是檢測牆壁在轉角處時要用線條點綴,增加3D的立體感,像是這樣:
https://ithelp.ithome.com.tw/upload/images/20250830/201576531CdWWuMohn.png
多加了線條,使牆面更有立體感。
但是,要記得,我們是以wstring map,也就是擴充字元 # 來表示牆,所以,只有的概念。
既然只有點,但是要怎麼要像其他遊戲一下呈現的概念呢?
這就是我接下來要下功夫的事情了XD,還需要透過一些原理才可以參透 javidx9 大神的思路~

這 30 天真的不容易,每天都要輸出一篇文章,還要推導公式、畫圖、寫程式、驗證,再把腦中混亂的想法整理成條理。
過程中我犯過錯、也推翻過之前的假設,但那正是 學習的樂趣 —— 不斷修正,才能更靠近真實。

最棒的是,當初在大學讀光學時,完全沒想到有一天能把「針孔成像」的理論,拿來解釋 FPS 遊戲的牆壁高度公式,這種跨領域的連結,對我來說特別有趣。

今日總結

  • 30 天鐵人挑戰,全程推導 + 程式碼實作
  • 從「地圖」→「光線」→「牆壁」→「地板」→「角色移動」,一步步建構出一個 Console FPS
  • 學會了:寫文章就像做遊戲,不是一次到位,而是邊走邊修

結語

30 天走完,心中真的只有一句話:
我對常常寫文章紀錄/分享自己知識的人由衷地給予尊敬 (Respect)

感謝每一位看到這裡的朋友,不管你是跟著學,還是只是路過點進來,都希望這些內容能讓你覺得:
「原來 C++ Console 也能這麼有趣!」
接下來我會繼續打磨這個專案,繼續完成Ray Casting ─ Consol FPS這一系列的文章!
也會在未來寫更多關於 C++、電腦圖學、光學比喻 的文章。
朋友們,這不是結束,而是新的開始。

我們繼續走下去!!


上一篇
Day 29 | Ray Casting: 碰撞檢測
系列文
用 C++ 實作簡易第一人稱視角遊戲:從入門到理解 Ray Casting30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言