iT邦幫忙

2025 iThome 鐵人賽

DAY 6
1

Greetings~ 這裡是鐵匠史密斯,
昨日講述到了 玩家資訊 ─ 座標: fXPlayerfYPlayer
今天就要來看看這些座標「映射到畫面」上後,會呈現什麼樣子——也就是 screen 的世界

screen 作用中的畫面緩衝區要顯示什麼?

沒錯,那我們的遊戲畫面是顯示什麼呢?
當然是顯示玩家所看到的場景 = 第一人稱玩家視野
直接上圖:
https://ithelp.ithome.com.tw/upload/images/20250806/20157653rm4aAXHdU4.png

假設玩家在世界地圖上 (8, 3) -> map[3 * 16 + 8] = map[56] 的位置,其視角所看到的畫面極為 screen 也就是圖中橘色方框的內容
當然,別忘記計算機圖學的座標定義:

  • 原點在左上角 (0, 0)
  • x 向右為正, y 向下為正

screen 也是由 1-D 擴充字元的陣列組成, 則存取畫面(玩家視野)特定位置(screen_x, screen_y)所看到的亮度為:

screen[screen_y * nScreenWidth + screen_x]

與存取 map 任意位置數值的概念相同

聯想 - mapscreen 對應的場景

由以上的概念,我們可以把玩家在 map 上的位置所看到的視野如 3-D 想像圖表示:
https://ithelp.ithome.com.tw/upload/images/20250806/20157653izgwLR0E8S.png
想像的圖如左圖(Imagination)所示,一個玩家站在 (8, 3) 其所看到的視野,我們可以發現:

  • 玩家有身高: 眼睛在 3-D 世界是 有高度的
  • 視場角(Angle of View)為 立體角(Solid Angle)

我只是一個沾不上邊的小新手,還沒可以將遊戲做到擁有上面所述的條件/特性
我們只使用 2-D 平面,在視野 screen 上呈現類 3-D 的場景,所以實際如右圖(Reality):

  • 玩家只有一個點: 眼睛在地板 沒高度
  • 視場角(Angle of View)為 平面角(Plane Angle)

離散(Discrete) vs 連續(Continuous)

當然,我們所看到的畫面都是離散的(Discrete),儘管我們 screen 上的像素(element = 擴充字元 wchar_t )可能很少,但也可以將看到的畫面想像成是連續的,如圖:
https://ithelp.ithome.com.tw/upload/images/20250806/20157653BrYeMqhmCi.png
這就牽扯到影像處理/離散數學/計算機圖學教到的Sampling Theorem -> 如何將每個連續的數據(Continuous Data)轉成離散數據(Discrete Data),並呈現在電腦上,如有空(或鐵人賽篇幅不夠 lol)的話,會再度提到這些數學原理。

今日總結 :

  • screen = 第一人稱玩家視野
  • screen[screen_y * nScreenWidth + screen_x] 找到視野中特定位置的亮度
  • 聯想 - mapscreen 對應的場景
  • 離散(Discrete) vs 連續(Continuous)

既然已經知道玩家看到的視野 screen了,
我們就需要一個依據: 玩家往哪裡看?
明日會提到遊戲中玩家的另一個數值: fPlayerAAOV的定義,
將地圖、玩家、視野都定義好後,才可以介紹我們的演算法~
加油,讓我們繼續走下去~


上一篇
Day 5 | Ray Casting 前置 : fPlayerX、fPlayerY ─ 空間座標與陣列的對應關係
下一篇
Day 7 | Ray Casting 前置 : fPlayerA, AoV ─ 玩家方向 及 視野範圍
系列文
用 C++ 實作簡易第一人稱視角遊戲:從入門到理解 Ray Casting30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言