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

2021-08-03 12:00:00 字數 4552 閱讀 9531

演示模式是在沒有玩遊戲時顯示的乙個動畫片斷,它演示了遊戲的玩法。除了作為閃屏的作用外,演示模式讓玩家快速瀏覽遊戲的實際玩法。

本章內容包括:

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

演示模式優於閃屏,它不僅僅是顯示乙個遊戲名稱或者一幅靜態的遊戲圖形。演示模式試圖顯示遊戲的實際玩法,或者至少顯示遊戲中的一些運動的主要角色。

與閃屏不同的是,演示模式不是只在遊戲開始時出現,在遊戲開始之後就看不到了。相反,演示模式是在各個遊戲之間顯示的。當遊戲結束時,遊戲會有乙個短暫的停頓,玩家在這段時間會意識到遊戲實際上結束了,然後遊戲會返回演示模式。然後如果想要開始新遊戲,也是在演示模式中開始的。

與閃屏類似,演示模式是一種與「遊戲結束」和「遊戲未結束」模式不同的模式,初次執行遊戲程式以及遊戲之間都將進入這個模式。

為遊戲建立演示模式的一種容易的方法是僅僅顯示遊戲中的角色是如何到處移動的,而不試圖模擬遊戲中的真實玩家。

將新增演示模式的space out 遊戲,命名為 space out 3 。

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

space out 3 目錄結構:

space out 3 效果圖:

int               g_igameoverdelay;                     //遊戲結束時進入演示模式的延遲

bool g_bdemo; //是否進入演示模式

還需要在gamestart( ) 函式中初始化 g_bdemo 的值。

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);

}}

gamecycle( ) 函式確定從遊戲結束螢幕轉到演示模式之前的計時延遲。

// 繪製遊戲

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);

}}// 遊戲迴圈

void gamecycle()

// 更新背景

g_pbackground->update();

// 更新子畫面

g_pgame->updatesprites();

// 獲得用於重新繪製遊戲的裝置環境

hwnd hwindow = g_pgame->getwindow();

hdc hdc = getdc(hwindow);

// 在螢幕外裝置環境上繪製遊戲

gamepaint(g_hoffscreendc);

// 將螢幕外位圖位塊傳送到遊戲螢幕

bitblt(hdc, 0, 0, g_pgame->getwidth(), g_pgame->getheight(),

g_hoffscreendc, 0, 0, srccopy);

// 清理

releasedc(hwindow, hdc);

} else

if (--g_igameoverdelay == 0)

}

handlekeys( ) 函式支援演示模式,如果遊戲正退出演示模式以開始乙個新遊戲,那麼它將更改 g_bdemo 的值。

// 監聽鍵盤

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_bdemo)

else

if (g_bgameover)

}

spritecollision( )函式中的新**涉及到遊戲結束螢幕的計時延遲。將 g_igameoverdelay 變數設定為150,意味著在遊戲返回演示模式之前遊戲螢幕將顯示150個週期。遊戲的幀頻設定為每秒30幀,也就是每秒鐘30個週期。可以得知遊戲螢幕的延遲為5秒。**如下:

// 檢視遊戲是否結束

if (--g_inumlives == 0)

// 刪除子畫面

void spritedying(sprite* pspritedying)

; rect rcpos = pspritedying->getposition();

sprite* psprite =

new sprite(g_psmexplosionbitmap, rcbounds);

psprite->setnumframes(8, true);

psprite->setposition(rcpos.left, rcpos.top);

g_pgame->addsprite(psprite);

}}

當遊戲處於演示模式時,newgame( )函式向遊戲新增幾個外星人。

// 開始新遊戲

void newgame()

else

; g_pcarsprite =

new sprite(g_pcarbitmap, rcbounds, ba_wrap);

g_pcarsprite->setposition(300, 405);

g_pgame->addsprite(g_pcarsprite);

g_pgame->playmidisong(text("music.mid"));

}}

Python程式設計入門(Linux中演示)

一 執行環境 1.確認是否安裝python root master1 python python 2.7.5 default,aug 4 2017,00 39 18 gcc 4.8.5 20150623 red hat 4.8.5 16 on linux2 2.若沒有安裝,使用yum安裝 root ...

遊戲程式設計入門手冊

遊戲製作新人 用什麼語言和編譯器來做遊戲?directx是什麼?學程式設計需要哪些書?我怎樣製作遊戲?哪些書是介紹遊戲開發的?vc好還是c 好?給c 初學者的50個忠告 文獻 程式設計新手真言 具備程式基礎 如何用directx製作2d遊戲?如何使用directinput?如何在遊戲中顯示文字?如何...

遊戲程式設計入門手冊

遊戲製作新人 用什麼語言和編譯器來做遊戲?directx是什麼?學程式設計需要哪些書?我怎樣製作遊戲?哪些書是介紹遊戲開發的?vc好還是c 好?給c 初學者的50個忠告 文獻 程式設計新手真言 具備程式基礎 如何用directx製作2d遊戲?如何使用directinput?如何在遊戲中顯示文字?如何...