SFML 使用 - Event 視窗事件

要怎麼跟視窗互動呢?使用者在視窗上互動時,SFML 會產生事件(Event),進而接收窗口的事件,並針對發生的事件(例如:滑鼠移動、點擊,鍵盤點擊等)做相對應的處理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sf::Event event;
while (window.pollEvent(event))
{
switch (event.type)
{
case sf::Event::Closed:
window.close();
break;

case sf::Event::KeyPressed:
// ...
break;

default:
break;
}
}

SFML 總共有以下這幾種事件:

繼續閱讀全文 »

C++ - chrono 計時

C++11 提供了 <chrono> 作為時間的 library,除了能夠獲取時間,且可以在多個單位轉換。

這個 Library 是只有時間 e.g. 小時、分鐘、秒..等,如果要日期則要使用其他 Library e.g. HowardHinnant/date 或是 ctime()

  • duration
    • 時間的長度,可自由決定儲存的單位
  • time_point
    • 時間點,相減會得到時間長度(duration)
  • Clocks
    • 根據物理時間回傳時間點(time_point)
    • 提供不同精度的 clock

繼續閱讀全文 »

QuadTree - 使用四叉樹優化碰撞檢測

在 2D 遊戲中,常常需要做碰撞檢測(Collision Detection)來檢測兩物體是否產生碰撞,而這類的演算法都很耗時間,如果要檢測整個 Scene 的所有物體是否有碰撞,常見的做法是 $O(n^2)$ 掃過去,這樣很大限制了同屏的物體總數,數量一多就會卡頓。

優化:對於一個物體,只要檢查它周圍的物體就好。那要怎麼時做這個優化呢?為了找出周圍的物體又去掃 $O(n^2)$ 就不是又回到上面的問題了。

那有沒有辦法先用某種資料結構儲存好物體,然後用比較好的複雜度查詢對於一個物體,它周圍的物體的集合? 四叉樹(Quad Tree)就是個用於此問題的資料結構

繼續閱讀全文 »

SFML 簡介及環境設置

Simple and Fase Media Library (SFML) 是一個由 C++ 寫成的跨平台(cross-platfrom)的用於遊戲、多媒體應用開發的 Library,有多個語言的綁定 (Binding) ,分成幾大模塊:系統、視窗、圖形、音訊跟網路。


https://github.com/SFML/SFML

  • SFML 分成幾大模塊
    • System 一些基礎建設,例如:向量(vector)、字串、thread、timer
    • Window 管理視窗以及輸入(鍵盤、滑鼠、搖桿等)及 OpenGL
    • Graphics 硬體加速的 2D 圖形:sprite, text, shapes
    • Audio 音訊、錄音、3D音效
    • Network TDP 與 UDP socket 與 HTTP 跟 FTP

繼續閱讀全文 »

OpenGL 筆記 - Coordinate System

OpenGL 座標的值在 經過 Vertex Shader 之後變成 $[-1.0, 1.0]$ 的座標,稱作 標準化設備座標 Normalized Device Coordinates (NDC),只有在此座標內的頂點最終才會顯示在螢幕上。

座標在被轉換成螢幕座標(Screen-Space)時還會經過多次轉換

  • 座標系統
    • 局部空間 Local Space 或是 物體空間(Object Space)
    • 世界空間 World Space
    • 觀察空間 View Space 或 Eye Space
    • 裁剪空間 Clip Space
    • 螢幕空間 Screen Space

繼續閱讀全文 »

OpenGL 筆記 - Texture

可以用為每個頂點增加顏色來為圖形添增細節,來建構有趣的圖像。但必須要有足夠多的頂點、顏色,這會帶來很多開銷,每個模型的頂點就會變得很多。

紋理(Texture)是一個 2D 的圖片,可以用來增添物體的細節,可以想像 Texture 就像是個有圖案的紙,貼合在 3D 的物體上,這樣就可以讓物體不用增加頂點就增加細節。
題外話,Texture 除了圖像之外還能用來儲存大量資訊發送到 Shader 上。

繼續閱讀全文 »