【AppGameKit】想要使用c++製作遊戲的初學者必看,瞭解模板文件

在閱讀這篇文章之前,您最好確定你是否在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中的函數。
在這裏插入圖片描述
最後還是感謝大家閱讀,覺得有用的話,點個贊吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章