遊戲程式設計入門(18) 使用閃屏增添遊戲的活力

2021-08-03 11:43:06 字數 3786 閱讀 8622

到現在為止,我們開發的遊戲都存在乙個問題就是它們在初次執行的時候沒有充分的標識自己,雖然視窗的標題欄包含了遊戲的名稱,但是在初次執行遊戲時清楚地標識自己是很重要的。而且我們的遊戲,總是一點進去就開始了,這也給人以不好的體驗。

遊戲很像是電影,應該在片頭顯示名字並且給人以緩衝的時間。在電影中,這種介紹和緩衝被稱為片頭,而遊戲中的名稱被稱為閃屏,它們可以包含有用的資訊,例如版權通知和遊戲玩法的介紹等。本章將介紹如何通過新增閃屏來裝飾 space out 遊戲。

本章內容包括:

接上文 遊戲程式設計入門(17):開發 space out(逃離太空)遊戲

無論在遊戲閃屏中顯示的內容是多還是少,重要的是,至少要顯示遊戲的名稱以及其他相關的資訊,如遊戲的版權。如果需要乙個特定的動作才能開始遊戲,那麼在閃屏中提一下也不錯。沒有人喜歡遊戲立即開始而不提醒玩家遊戲將在何時開始,因此閃屏至少應該讓玩家有機會準備好才開始玩遊戲。

閃屏也是乙個提供包括遊戲的簡短說明以及遊戲玩法提示和技巧的位置。對於閃屏,要考慮的最後一點是高分列表。這個列表包含人們在遊戲中獲得的最高得分。在稍後的文章中,我們將介紹如何建立乙個高分列表,將 space out 遊戲的高分儲存到乙個檔案中。

實現閃屏最容易的方法就是建立螢幕的點陣圖影象,然後在遊戲開始之前將其顯示在遊戲螢幕上。閃屏的影象可以大到填滿整個遊戲螢幕,也可以稍微小一點,顯示在現有的遊戲背景之上。

下圖顯示了如何設計閃屏影象,以便覆蓋在 space out 遊戲中的背景之上。

從上面這幅圖可以看得出來,顯示閃屏沒有什麼難度。向遊戲新增閃屏稍微有一點難度的地方是為閃屏建立乙個單獨的遊戲模式。例如,之前建立的所有遊戲都處於兩種模式之中,「遊戲結束」和「遊戲未結束」。這兩種模式直接由 g_bgameover 全域性變數控制,而這個變數有兩個布林值,ture 或 false。因此,我們將遊戲擴充套件為以下3種模式:

雖然在顯示閃屏時,遊戲是結束的。但是對於「遊戲結束」模式,因為沒有顯示閃屏,所以它不同於「閃屏」模式。

帶有乙個閃屏的 space out 遊戲命名為 space out 2。遊戲玩法沒有變,只是新增了乙個閃屏來裝飾遊戲。

注意:若出現編譯錯誤,請在專案設定->連線->物件/庫模組中 加入 msimg32.lib winmm.lib

space out 2 目錄結構:

space out 2 效果圖:

向 space out 2 遊戲新增閃屏的第一步是向遊戲新增幾個全域性變數,以便儲存閃屏的點陣圖以及閃屏模式。它們是在 spaceout.h 中宣告的。

bitmap*           g_psplashbitmap;                      //閃屏點陣圖

bool g_bsplash; //是否處於閃屏

g_bsplash 處於 true 則遊戲處於閃屏模式。在遊戲開始時將g_bsplash 設定為true,然後使用者在按 enter鍵開始遊戲時,將其設定為false。

初始化全域性變數非常重要,這項任務是在 gamestart( ) 函式中完成的,gamestart( ) 函式的第乙個變化是建立閃屏點陣圖。

g_psplashbitmap =new bitmap(hdc, idb_splash, g_hinstance);
另外還要初始化 g_bsplash ,如下所示:

// 初始化全域性變數

g_bsplash = true;

g_bgameover = true;

使閃屏正常的大部分工作是當遊戲處於閃屏模式時禁用遊戲的某些部分。gameactivate( ) 和 gamedeactivate( ) 函式在繼續活著暫停midi 背景**之前檢查 g_bsplash 變數的值。

//啟用遊戲

void gameactivate(hwnd hwindow)

// 遊戲未被啟用時

void gamedeactivate(hwnd hwindow)

與閃屏有關的最重要**位於 gamepaint( ) 函式中,這裡實際繪製閃屏的位置。

// 繪製遊戲

void gamepaint(hdc hdc)

else

; wsprintf(sztext, "%d", g_iscore);

setbkmode(hdc, transparent);

settextcolor(hdc, rgb(255, 255, 255));

drawtext(hdc, sztext, -1, &rect, dt_singleline | dt_right | dt_vcenter);

// 繪製剩餘生命(小汽車)數量

for (int i = 0; i < g_inumlives; i++)

g_psmcarbitmap->draw(hdc, 520 + (g_psmcarbitmap->getwidth() * i),

10, true);

// 繪製遊戲結束

if (g_bgameover)

g_pgameoverbitmap->draw(hdc, 190, 149, true);

}}

handlekeys( ) 函式在遊戲退出閃屏 以開始乙個新遊戲時更改 g_bsplash 的值。

// 監聽鍵盤

void handlekeys()

else

if (getasynckeystate(vk_right) <

0)

// 按下空格鍵發射飛彈

if ((++g_ifireinputdelay >

6) && getasynckeystate(vk_space) <

0) ;

rect rcpos = g_pcarsprite->getposition();

sprite* psprite =

new sprite(g_pmissilebitmap, rcbounds, ba_die);

psprite->setposition(rcpos.left +

15, 400);

psprite->setvelocity(0, -

7); g_pgame->addsprite(psprite);

playsound((lpcstr)idw_missile, g_hinstance, snd_async |

snd_resource | snd_nostop);

// 重置輸入延遲

g_ifireinputdelay =

0; }

} // 按下enter鍵開始乙個新遊戲

if (getasynckeystate(vk_return) <

0) if (g_bsplash)

else

if (g_bgameover)

}

遊戲程式設計入門(19) 使用演示模式展示遊戲

演示模式是在沒有玩遊戲時顯示的乙個動畫片斷,它演示了遊戲的玩法。除了作為閃屏的作用外,演示模式讓玩家快速瀏覽遊戲的實際玩法。本章內容包括 接上文 遊戲程式設計入門 18 使用閃屏增添遊戲的活力 演示模式優於閃屏,它不僅僅是顯示乙個遊戲名稱或者一幅靜態的遊戲圖形。演示模式試圖顯示遊戲的實際玩法,或者至...

C 程式設計 入門級題解 小魚的數字遊戲

題目描述 小魚最近被要求參加乙個數字遊戲,要求它把看到的一串數字 長度不一定,以0結束,最多不超過100個,數字不超過2 32 1 記住了然後反著念出來 表示結束的數字0就不要念出來了 這對小魚的那點記憶力來說實在是太難了,你也不想想小魚的整個腦袋才多大,其中一部分還是好吃的肉!所以請你幫小魚程式設...

向量幾何在遊戲程式設計中的使用1

1 簡單的2 d追蹤 andre lamothe說 向量幾何是遊戲程式設計師最好的朋友 一點不假,向量幾何在遊戲程式設計中的地位不容忽視,因為在遊戲程式設計師的眼中,顯示螢幕就是乙個座標 系,運動物體的軌跡就是物體在這個座標系曲線運動結果,而描述這些曲線運動的,就是向量。使用向量可以很好的模擬物理現...