880 likes | 1.04k Views
Chapter 18 遊戲畫面繪圖. 基本螢幕繪圖. GDI(Graphics Device Interface) 中文可譯為「圖形裝置介面」,是 Windows API 中相當重要的一個成員,它掌管了所有顯像裝置的視訊顯示及輸出功能 。. 螢幕區、視窗區與內部視窗區. 對一個遊戲程式來說,當視窗建立之後,顯示的螢幕上便劃分為三個區域 螢幕區 (Screen) 視窗區 (Window) 內部視窗區 (Client). Device Context.
E N D
基本螢幕繪圖 • GDI(Graphics Device Interface)中文可譯為「圖形裝置介面」,是Windows API中相當重要的一個成員,它掌管了所有顯像裝置的視訊顯示及輸出功能 。
螢幕區、視窗區與內部視窗區 • 對一個遊戲程式來說,當視窗建立之後,顯示的螢幕上便劃分為三個區域 • 螢幕區(Screen) • 視窗區(Window) • 內部視窗區(Client)
Device Context • 一般常稱為DC,就繪圖的觀點來說,DC就是程式可以進行繪圖的地方。舉例來說,如果我們要在整個螢幕區上繪圖,那麼Device(裝置)就是螢幕,而Device Context就是螢幕區上的繪圖層。
回顧前面訊息處理函式中關於處理視窗重繪訊息的程式片段:回顧前面訊息處理函式中關於處理視窗重繪訊息的程式片段: 1case WM_PAINT: //視窗重繪訊息 2hdc = BeginPaint(hWnd, &ps); 3EndPaint(hWnd, &ps); 4 break;
X軸(向右為正) 座標系統 (0,0) Y軸(向下為正)
繪圖視窗的座標 原點座標依繪圖區不同而不同
畫筆與畫刷 • 畫筆與畫刷都是GDI中所定義的圖形物件,畫筆是線條的樣式,畫刷是封閉圖形內部的填充樣式。 • GDI物件一經建立便會佔用部分記憶體,一旦不使用的時候請務必將它們刪除。
使用預設值以及自訂畫筆畫刷所繪製的填充矩形:使用預設值以及自訂畫筆畫刷所繪製的填充矩形:
要自訂畫筆或畫刷,使用下列三個API函式 HPEN CreatePen (int 樣式, int 寛度, COLORREF 顏色); //建立畫筆 HBRUSH CreateHatchBrush (int 樣式, COLORREF 顏色); //建立陰影畫刷 HBRUSH CreateSolidBrush (COLORREF 顏色); //建立單色畫刷
範例程式:全域變數宣告 H 代表 handle 指定7種系統提供的畫筆陣列 指定6種系統提供的陰影畫刷陣列
範例程式:InitInstance() 建立視窗物件 設定位置及大小 設定顯示狀態 繪製在顯示設備
範例程式:InitInstance() 建立各種 畫筆與畫刷 呼叫GetDC()取得視窗DC 釋放視窗DC
Exercise 03 • 寫一個Windows API程式,利用Rectangle將繪圖視窗變為黃色,並利用畫線方式,用藍色線在繪圖視窗中畫一個X。 • 專案名稱為『學號_03』 • (例:8223582_03) • 編譯及執行無誤後,使用ftp將『學號_03.cpp』上傳至192.192.155.217的EX03目錄下,帳號:student5,密碼:student5
GDI繪圖函式 • 在上一節中,畫筆和畫刷是學習螢幕繪圖及GDI的第一堂課,並接觸了幾個簡單的GDI繪圖函式 • 文字輸出 • 有時候需要在畫面上顯示一些數據、資訊,這時候就會在繪圖視窗上做文字輸出
函式名稱 說明 Polygon 繪製封閉多邊形 PolyLine 繪製多邊線條 PolylineTo 以目前畫筆所在位置繪製多邊線條 PolyPolygon 繪製多個封閉多邊形 PolyPolyline 繪製多個多邊線條 GDI函式中關於多邊形的繪圖函式有以下幾個
封閉圖形函式 • 橢圓形的GDI函式: BOOL Ellipse( HDC hdc, int 外圍矩形左上點X座標, int 外圍矩形左上點Y座標, int 外圍矩形右下點X座標, int 外圍矩形右下點Y座標); 圖中的虛線部份就是外圍矩形,當我們呼叫 Ellipse()函式時只要傳入外圍矩形的座標, 便會畫出實線部份的橢圓形。
繪製圓角矩形的函式 BOOL RoundRect( HDC hdc, int 外圍矩形左上點X座標, int 外圍矩形左上點Y座標, int 外圍矩形右下點X座標, int 外圍矩形右下點Y座標, int 圓角上橢圓長 int 圓角上橢圓高); 以上函式中除了定出外圍矩形的座標,還定 出圓角上橢圓的長與高來表示圓角的弧度, 如圖示,實線部份是實際畫出的圓角矩形。
扇形(Pie)和弓形(Chord) Pie( ) Chord( )
繪製點陣圖 • 點陣圖從檔案載入到繪製於視窗中必須經過以下幾個步驟: 1.從檔案載入到點陣圖(HBITMAP)物件。 2.建立一與視窗DC相容的記憶體DC。 3.記憶體DC選用步驟1所建立的點陣圖物件。 4.將記憶體DC的內容貼到視窗DC便完成顯像的動作。
要從檔案載入點陣圖我們常使用LoadImage()函式 HANDLE LoadImage( HINSTANCE 來源實體, //載入點陣圖 LPCTSTR 名稱, UINT 點陣圖類型, int 載入寛度, int 載入高度, UINT 載入方式);
範例程式:全域變數宣告 點陣圖物件
範例程式:InitInstance() 建立一個與hdc相容的記憶體DC mdc 載入 點陣圖 選用hbmp到mdc中
Exercise 04 • 寫一個Windows API程式,利用Mouse移動偵測及載入點陣圖的方法,如果Mouse移動到繪圖視窗左邊顯示圖bg.bmp,如果Mouse移動到繪圖視窗右邊顯示圖bg1.bmp。 • 專案名稱為『學號_04』 • (例:8223582_04) • 編譯及執行無誤後,使用ftp將『學號_04.cpp』上傳至192.192.155.217的EX04目錄下,帳號:student5,密碼:student5
遊戲畫面特效製作 • 透空效果
要去背的部份必須是黑色 恐龍部分是黑色 去背部分是白色
彩色圖點的二進位值為任意值 白色圖點的RGB顏色值為(255,255,255),二進位值為111111... 黑色圖點的RGB顏色值為(0,0,0),二進位值為000000...
範例程式:全域變數宣告 宣告點陣圖物件bg與dra 宣告一記憶體DC mdc,用來暫存點陣圖
範例程式:InitInstance() 取得視窗DC,並建立與其相容之記憶體DC 載入bg及 dra
範例程式:MyPaint() 先將背景圖貼到顯示視窗 選用恐龍圖到mdc中 遮罩圖與背景圖AND 前景圖與背景圖OR
Exercise 05 • 寫一個Windows API程式,利用Mouse移動偵測、載入點陣圖及透空貼圖的方法,如果Mouse移動到繪圖視窗的任何位置,小恐龍就會移動到什麼位置。 • 專案名稱為『學號_05』 • (例:8223582_05) • 編譯及執行無誤後,使用ftp將『學號_05.cpp』上傳至192.192.155.217的EX05目錄下,帳號:student5,密碼:student5
Homework 04 • 寫一個Windows API程式,利用Mouse移動偵測、載入點陣圖及透空貼圖的方法,如果Mouse移動,小恐龍就會向滑鼠的座標位置慢慢移動過去。
半透明效果 • 半透明在遊戲中通常是用來呈現若隱若現的特殊效果 • 像是薄霧、鬼魂、隱形人物…等等 • 下一張圖是將一張點陣圖經過半透明處理後顯示於背景上的樣子
半透明的製作原理 • 前景圖和背景圖像素顏色的混合 • 每一個像素中都包含三原色 • 紅(R)、綠(G)、藍(B) • 由三原色值決定該像素的色彩 • 前景圖和背景圖的對應像素的顏色依某一比例來進行調配,稱為『不透明度』 半透明圖色彩=前景圖色彩*不透明度+ 背景圖色彩*(1-不透明度)
半透明的實作步驟 • 步驟一:取得點陣圖結構 • 從檔案載入點陣圖後,必須先取得該點陣圖的結構,其函式為 • 假設有一個有一個點陣圖名稱為bitbmp,點陣圖結構名稱為bm int GetObject(HGDIOBJ 物件, int 結構大小 LPVOID 結構變數); GetObject(bitmap, sizeof(BITMAP), &bm);