Camera zh TW - Akiaaaa20/Bit8_CLI GitHub Wiki

Camera 攝影機系統

English | 繁體中文 | 日本語 | 한국어

BIT8_CLI 提供 Camera 系統,用來控制遊戲世界中哪些區域會顯示在畫面上。

在 BIT8_CLI 0.1.0 中,Camera 與 Map 資料關聯,並影響世界座標的繪製。

遊戲使用固定的 64 × 64 像素 Viewport。

1. Camera 概述

Camera 定義遊戲世界中可視範圍的中心。

Framebuffer 解析度固定為:

64 × 64 pixels

Map 可以遠大於 Viewport。

Camera 負責決定這個大型世界中的哪個區域會出現在畫面上。

2. Camera 與 Map

Camera 資料儲存在 Map 系統中。

.b8map 可以包含:

  • Tile 資料
  • Node
  • Camera

Camera 讓 Runtime 可以在不改變 Framebuffer 解析度的情況下,顯示 Map 的不同區域。

詳細資訊請閱讀 Map。

3. Camera 位置

Camera 擁有世界座標位置。

這個位置代表 Viewport 的中心。

例如:

Camera position: (100, 80)
Viewport size:   64 × 64

概念上,可視範圍會從 Camera 中心向四個方向延伸約 32 像素。

因此,約略的可視範圍是:

X: 68 to 131
Y: 48 to 111

實際像素邊界取決於 Runtime 的座標與取整規則。

4. 世界座標

World Coordinates 用來描述遊戲世界中的位置。

例如:

  • Map Tile
  • Node
  • Node Sprite
  • 使用世界座標的繪製操作

當 Camera 啟用時,支援世界座標的繪製操作會依照 Camera 位置進行轉換。

因此,Viewport 可以顯示遊戲世界的不同區域。

5. 螢幕座標

Screen Coordinates 用來描述 Framebuffer 內的固定位置。

螢幕座標範圍:

X: 0 to 63
Y: 0 to 63

部分繪製操作使用 Screen Coordinates。

例如:

cls(0)
pix(32, 32, 7)

這些操作維持使用螢幕座標,不會受到 Camera 位移影響。

這對 UI 和畫面覆蓋元素很有幫助。

6. 世界座標轉換為螢幕座標

簡化的 Camera 轉換公式:

screen_x = world_x - camera_x + 32
screen_y = world_y - camera_y + 32

例如:

World position:  (100, 80)
Camera position: (100, 80)

Screen position: (32, 32)

位於 Camera 中心的物件,會顯示在畫面中心附近。

這個公式用來說明概念。

實際像素位置仍可能受到 Runtime 整數座標規則影響。

7. Active Camera 選擇

Map 可以包含多個 Camera。

BIT8_CLI 0.1.0 使用以下規則選擇 Active Camera:

選擇已啟用且 ID 最小的 Camera。

這讓多個 Camera 同時存在時,仍然可以得到可預測的結果。

例如:

Camera ID 1 → Disabled
Camera ID 2 → Enabled
Camera ID 3 → Enabled

Active Camera 是:

Camera ID 2

8. Camera 與 Tile Rendering

Map Rendering 使用世界座標。

當 Camera 啟用時,Map 會依照可視世界區域進行繪製。

例如:

func draw()
    cls(0)
    map()
end

Camera 會決定 Map 的哪個部分出現在 64×64 Framebuffer 中。

9. Camera 與 Sprite

Node Sprite 使用世界座標。

當 Camera 啟用時,支援的 Sprite Rendering 會轉換成螢幕座標。

例如:

func draw()
    self:spr()
end

Node 仍然保留自己的世界座標。

Camera 只會影響 Sprite 最終顯示在畫面上的位置。

詳細資訊請閱讀 Sprite 與 Animation。

10. Camera 與 UI

遊戲可能需要固定在畫面上的圖像。

例如:

  • 血量顯示
  • 計數器
  • 選單
  • 畫面覆蓋元素

Screen-space Drawing 很適合用來製作這些內容。

例如:

func draw()
    cls(0)
    map()

    pix(32, 32, 7)
end

這裡的 pix() 會在固定的螢幕座標繪製像素。

Camera 不會改變這個像素的位置。

11. Camera 編輯

BIT8_CLI 的 VS Code Map Workspace 提供 Camera 視覺化功能。

開發者可以在編輯 Map 時檢視 Camera 位置。

Camera 資料屬於 Map 專案資料的一部分。

Runtime 負責選擇並套用 Active Camera。

詳細資訊請閱讀 Map Workspace。

12. Camera 與 Viewport 大小

BIT8_CLI 0.1.0 使用固定的 Framebuffer 解析度:

64 × 64 pixels

Camera 改變的是可視世界區域。

它不會改變 Framebuffer 的實際解析度。

因此,可以透過小型 Viewport 探索大型 Map。

13. 目前限制

BIT8_CLI 0.1.0 的 Camera 系統主要包含:

  • 儲存在 Map 中的 Camera 資料
  • 世界座標繪製位移
  • 固定 64×64 Viewport
  • 可預測的 Active Camera 選擇
  • 螢幕座標繪製操作

進階 Camera 特效、電影式轉場,以及通用 Camera Script Framework,尚不屬於已確立的 0.1.0 功能。

下一步

Core Systems 文件已完成,接下來是開發工具。

CLI Reference

相關文件:

Map 定義世界,Camera 決定你看見什麼。