在閱讀這篇文章之前,您最好確定你是否在vs上配置好了AGK庫,沒有的話建議參考我的文章"在vs2017上配置AppGameKit庫",如果你已經配置好了,那麼可以忽略這段話。
查看模板文件
template.h
在解決方案的Template項目中雙擊template.h
我們來看一下這幾個宏定義
#define DEVICE_WIDTH 1024
#define DEVICE_HEIGHT 768
#define DEVICE_POS_X 32
#define DEVICE_POS_Y 32
#define FULLSCREEN false
// used to make a more unique folder for the write path
#define COMPANY_NAME "My Company"
根據它們的名字我們就知道代表什麼
- DEVICE_WIDTH:設備寬度
- DEVICE_HEIGHT:設備高度
- DEVICE_POS_X:設備X座標,個人感覺沒用
- DEVICE_POS_Y:設置Y座標,個人感覺沒用
- FULLSCREEN:是否全屏,false表示不全屏
- COMPANY_NAME:公司名字
首先我們不更改它們的值,直接運行(Ctrl+F5),結果如下:
我們嘗試修改它們的值,我想創建一個640X480的窗口,怎麼辦?
代碼改爲這樣
#define DEVICE_WIDTH 640
#define DEVICE_HEIGHT 480
我們再來運行,結果如下:
可以看到窗口大小明顯變小了
查看app類
class app
{
public:
// constructor
app() { memset(this, 0, sizeof(app)); }
// main app functions - mike to experiment with a derived class for this..
void Begin(void);
int Loop(void);
void End(void);
};
最主要的就是下方這三個函數。
- Begin
這個函數無返回值,無參數,用於程序的初始化。 - Loop
這個函數返回值是int型,無參數,此函數一直循環,直到你主動返回1。主要在該函數中寫代碼。 - End
這個函數無返回值,無參數,程序結束時,自動調用。一般用於存儲數據等。
template.cpp
在解決方案的Template項目中雙擊template.cpp
Begin
void app::Begin(void)
{
agk::SetVirtualResolution (1024, 768);
agk::SetClearColor( 151,170,204 ); // light blue
agk::SetSyncRate(60,0);
agk::SetScissor(0,0,0,0);
}
- agk::SetVirtualResolution (1024, 768);
設置屏幕的虛擬分辨率爲1024X768,我們把參數改爲DEVICE_WIDTH和DEVICE_HEIGHT
agk::SetVirtualResolution (DEVICE_WIDTH, DEVICE_HEIGHT);
這樣窗口的實際分辨率和屏幕大小一致,方便操作。
爲了對比效果,我們加上這條語句:
void app::Begin(void)
{
agk::SetVirtualResolution (DEVICE_WIDTH, DEVICE_HEIGHT);
agk::SetClearColor( 151,170,204 ); // light blue
agk::SetSyncRate(60,0);
agk::SetScissor(0,0,0,0);
agk::SetPrintSize(100);
}
- agk::SetPrintSize(100);
用於設置輸出的字體大小,這裏設置爲100像素。
如果改爲:
agk::SetVirtualResolution (DEVICE_WIDTH*10, DEVICE_HEIGHT*10);
可以看到字體明顯變小了,變爲原來的10分之一。顯然這樣的字體大小並不是我們想要的100像素。
所以我們製作程序時最好將SetVirtualResolution 的參數設置爲屏幕寬高。
agk::SetVirtualResolution (DEVICE_WIDTH, DEVICE_HEIGHT);
我們再把代碼改爲正常的樣子:
void app::Begin(void)
{
agk::SetVirtualResolution (DEVICE_WIDTH, DEVICE_HEIGHT);
agk::SetClearColor( 151,170,204 ); // light blue
agk::SetSyncRate(60,0);
agk::SetScissor(0,0,0,0);
}
- agk::SetClearColor( 151,170,204 );
設置背景顏色,使用RGB顏色通道。
常用的RGB顏色(值位於0至255)
R | G | B | 顏色 |
---|---|---|---|
0 | 0 | 0 | 黑 |
255 | 255 | 255 | 白 |
255 | 0 | 0 | 紅 |
0 | 255 | 0 | 綠 |
0 | 0 | 255 | 藍 |
0 | 255 | 255 | 青 |
255 | 0 | 255 | 洋紅 |
255 | 255 | 0 | 黃 |
我們試試洋紅
agk::SetClearColor( 255,0,255 );
運行結果
- agk::SetSyncRate(60,0);
設置最大的刷新頻率(FPS),我們想讓它每秒刷新30次怎麼辦?
agk::SetSyncRate(30,0);
可以看到屏幕數值接近30,這表示屏幕刷新頻率的平均值。
- agk::SetScissor(0,0,0,0);
設置屏幕繪製區域,我們試着修改參數,前兩個參數代表矩形的左上角座標,後兩個參數代表矩形的右下角座標。
agk::SetScissor(10,10, DEVICE_WIDTH, DEVICE_HEIGHT);
可以看到,輸出的文字被截斷了,左邊和上邊有一部分消失了。
所以我們一般將4個參數都使用0,表示繪製區域就是屏幕大小。
Loop
- agk::Print( agk::ScreenFPS() );
兩個函數嵌套使用,agk::Print是打印函數,agk::ScreenFPS()用於返回FPS。
我們再加一條我們想說的話:Thank you for reading!
int app::Loop (void)
{
agk::Print( agk::ScreenFPS() );
agk::Print("Thank you for reading!");
agk::Sync();
return 0; // return 1 to close app
}
- agk::Sync();
使用該函數同步屏幕緩衝區至窗口,一般放在最後。
如果把這句刪了,效果如下:
雖然程序執行了你的代碼,但你什麼都看不到。
所以,正常情況下,該函數必不可少。
End
我們想在程序結束時謝謝用戶使用,怎麼辦?
void app::End (void)
{
agk::Message("感謝使用");
}
agk::Message用於彈出一個消息框。
當我們關閉程序時,會自動調用End中的函數。
最後還是感謝大家閱讀,覺得有用的話,點個贊吧!