即使走的再遠(yuǎn),也勿忘啟程時(shí)的初心
C/C++ 游戲開發(fā)
Hello,米娜桑們,這里是君兮_,最近開始正式的步入學(xué)習(xí)游戲開發(fā)的正軌,想要通過寫博客的方式來分享自己學(xué)到的知識和經(jīng)驗(yàn),這就是開設(shè)本專欄的目的。希望這些獨(dú)立的C#小項(xiàng)目能對做游戲的你有所幫助,畢竟學(xué)會游戲開發(fā)的最好的上手方式就是自己做一款游戲?。?/font>
前言
- 本專欄主要是分享一些純C#的項(xiàng)目開發(fā)流程,后面如有結(jié)合Unity開發(fā)的游戲會有專門的專欄,同時(shí)由于任何一個(gè)獨(dú)立的項(xiàng)目都是非常復(fù)雜的,哪怕是簡單的小項(xiàng)目做完整都至少需要4~500行代碼,因此本專欄的獨(dú)立項(xiàng)目多半會分不同的板塊來分批次講解,這樣一是能拆分板塊減小項(xiàng)目開發(fā)難度,二也能夠便于大家理解方便大家跟著博客自己上手設(shè)計(jì)。
- 還在更新中的項(xiàng)目,會在更新之后把相關(guān)鏈接放在本博客的開頭,我也會在開設(shè)一個(gè)新項(xiàng)目時(shí)盡快更完方便大家查閱的??!
- 同時(shí)在每個(gè)項(xiàng)目的開頭,都會把本項(xiàng)目的流程圖放在開頭,方便大家檢索,當(dāng)然,我更加希望,大家在學(xué)習(xí)一段時(shí)間后,能不看我的講解只看流程圖就能把這個(gè)項(xiàng)目給實(shí)現(xiàn)了,能做到這樣那么恭喜你真正入門了。
一.勇士救公主流程圖
二.項(xiàng)目實(shí)現(xiàn)
1.游戲流程
- 該游戲的大體流程是玩家通過打敗惡龍來到公主身邊拯救公主。如果挑戰(zhàn)成功,救出公主,則游戲勝利,如果不幸被惡龍擊敗,則游戲結(jié)束。
-
開始界面
- 游戲界面
-
營救公主
-
游戲結(jié)束界面
- 麻雀雖小,五臟俱全,游戲的制作正是要從這種簡單的項(xiàng)目一步一步來的,廢話不多說,開始我們的學(xué)習(xí)吧?。?/li>
2.項(xiàng)目解析
- 該項(xiàng)目主要分為幾塊,場景設(shè)置,開始界面的設(shè)置和切換,游戲界面的地圖的設(shè)計(jì)及角色的初始化,玩家的移動(dòng)邏輯以及游戲的戰(zhàn)斗邏輯,救出公主的邏輯,勝利或者失敗后進(jìn)入的結(jié)束界面的設(shè)置。
- 今天,我們主要來講初始的一些設(shè)置以及開始界面的布置。
3.初始的設(shè)置
- 首先,我們需要先來完成一些基礎(chǔ)的設(shè)置。
- 由于我們是一個(gè)控制臺窗口的小游戲,因此我們需要先設(shè)置一下控制臺窗口以及緩沖區(qū)的大小
int w = 60;
int h = 40;
Console.SetWindowSize(w, h);//控制臺窗口大小
Console.SetBufferSize(w, h);//緩沖區(qū)大小
- 其實(shí)這兩個(gè)函數(shù)第一個(gè)傳入的參數(shù)為設(shè)置的寬度,第二個(gè)傳入的參數(shù)為設(shè)置的高度
- 此時(shí),在你的電腦上還有光標(biāo)閃爍,我們需要把光標(biāo)給隱去
//隱藏光標(biāo)
Console.CursorVisible = false;//false為隱去,true為顯示
- 好了,做了以上的基本設(shè)置,我們來進(jìn)行開始界面的設(shè)置
4.開始界面
- 在開始之前,我們不妨想想,我們這個(gè)游戲有三個(gè)界面,我們要怎么實(shí)現(xiàn)不同界面的切換呢?
- 在這里,我們可以考慮到用switch來進(jìn)行分組,用不同的條件來區(qū)別不同的界面,然后在不同的case下實(shí)現(xiàn)不同界面的不同功能。這樣在切換不同界面時(shí),我們只需改變條件讓程序進(jìn)入不同case即可。
int nowSceneID = 1;
//不同的場景進(jìn)行不同的邏輯處理
switch (nowSceneID)
{
//開始界面
case 1:
break;
//游戲界面
case 2:
break;
//結(jié)束界面
case 3:
break;
default:
break;
}
- 這樣,我們就能通過在代碼中改變nowScene的值來切換不同的場景了
- 同時(shí),我們要注意,不能讓游戲主動(dòng)退出,而是通過玩家的輸入才能退出,因此我們不妨將以上的邏輯放入一個(gè)死循環(huán)中,這樣我們就能通過控制循環(huán)來控制游戲的退出了。
- 下面我們就這case 1里實(shí)現(xiàn)我們開始界面的功能
- 我們的開始界面,首先得有我們的游戲名稱吧
case 1:
Console.Clear();//清屏
Console.SetCursorPosition(w/2-5,10);//設(shè)置輸入坐標(biāo)
Console.WriteLine("勇士斗惡龍");
-
先介紹一下SetCursorPosition函數(shù)。我們的控制臺坐標(biāo)的坐標(biāo)軸(0,0)在左上角,因此增加傳入?yún)?shù)的大小輸入位置是往右往下的,關(guān)于坐標(biāo)的設(shè)置,相信聰明的你自己動(dòng)手試一下就能明白其中的原理
-
注意:如果你這里一直閃屏是由于你一直在循環(huán)清屏造成的,屬于正?,F(xiàn)象,不要慌,等下會解決的,我們繼續(xù)
-
好了,接下來是開始界面中最復(fù)雜的一段,我們怎么實(shí)現(xiàn)按W鍵和S鍵點(diǎn)亮”開始游戲“或“結(jié)束游戲”,來提醒玩家目前的選項(xiàng)呢?
-
這里我們來分析一下,其實(shí)邏輯是非常簡單的,首先,當(dāng)剛進(jìn)入時(shí),我們讓程序進(jìn)入讓開始游戲亮,退出游戲不亮的場景,而玩家按下“S”,就切換到“退出游戲”亮上,再按下“W”就切回“開始游戲”亮的情況。
-
哎,是不是和剛才的場景切換邏輯有億點(diǎn)點(diǎn)相像呢?沒錯(cuò),這是也可以通過while結(jié)合switch的方法實(shí)現(xiàn)??!
//當(dāng)前選項(xiàng)的編號
int nowSelIndex = 0;
//因?yàn)橐斎?我們可以構(gòu)造一個(gè)開始界面的死循環(huán)
//專門用來處理 開始場景相關(guān)的邏輯
while (true)
{
//顯示內(nèi)容檢測輸入
//設(shè)置光標(biāo)位置,再顯示內(nèi)容
Console.SetCursorPosition(w / 2 - 4, 12);
//根據(jù)當(dāng)前選擇的編號來決定是否變色
Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;//三目操作符結(jié)合設(shè)置字體顏色的函數(shù)
Console.Write("開始游戲");
Console.SetCursorPosition(w / 2 - 4, 14);
Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("退出游戲");
//檢查玩家輸入的鍵并且不會在控制臺上顯示輸入內(nèi)容
char input = Console.ReadKey(true).KeyChar;
switch (input)
{
case 'W':
case 'w':
nowSelIndex = 0;
break;
case 'S':
case 's':
nowSelIndex = 1;
break;
}
}
- 很簡單的邏輯,通過 nowSelIndex的值進(jìn)行標(biāo)記,初始為0,如果按下“S”鍵就讓nowSelIndex = 1,此時(shí)開始游戲?yàn)榘?,退出游戲?yàn)榧t,想再切換為開始游戲?yàn)榧t退出游戲?yàn)榘拙桶聪隆盬“鍵即可。
- 這里是你需要注意的地方:
//檢查玩家輸入的鍵并且不會在控制臺上顯示輸入內(nèi)容
char input = Console.ReadKey(true).KeyChar;
- 當(dāng)ReadKey括號中的值為true時(shí),輸入的值就不會顯示在控制臺上了,同時(shí)我們由于每次進(jìn)入下一次循環(huán)中都會清屏也不會影響游戲的運(yùn)行。這樣就達(dá)到了我們的目的,我們來進(jìn)行下一步。
- 同時(shí),我們實(shí)現(xiàn)“開始游戲”和“退出游戲”的標(biāo)記提醒后,該進(jìn)行選擇了,這里我們就通過來按“J”來進(jìn)行下一步,在“開始游戲”高亮?xí)r,按J切換到游戲場景,在退出游戲時(shí)高亮,按J就退出程序。
case 'j':
case 'J':
if(nowSelIndex == 0)
{
//1.改變場景ID,進(jìn)入游戲場景
nowSceneID = 2;
//2.要退出內(nèi)層循環(huán)while
isQuitWhile = true;
}
else
{
//關(guān)閉控制臺
Environment.Exit(0);
}
break;
if (isQuitWhile == true)
break;
- 這里我們定義了一個(gè)bool類型的isQuitWhile來實(shí)現(xiàn)切換場景的目的,由于我們這里的break都是switch都是里的,只能退出switch,因此需要通過這個(gè)bool類型的變量達(dá)到退出內(nèi)層循環(huán)進(jìn)入外層的switch里重新選擇的目的,而由于此時(shí)我們改變了 nowSceneID的值,自然就可以切換進(jìn)入游戲場景了。
5.該模塊源碼
- 由于上面的講述是分步拆分的,下面為大家提供該部分的源碼來幫助大家理解該部分的內(nèi)容
namespace 勇士斗惡龍
{
class Program
{
static void Main(string[] args)
{
int w = 60;
int h = 40;
Console.SetWindowSize(w, h);
Console.SetBufferSize(w, h);
//隱藏光標(biāo)
Console.CursorVisible = false;
int nowSceneID = 1;
while (true)
{
//不同的場景進(jìn)行不同的邏輯處理
switch (nowSceneID)
{
case 1:
Console.Clear();
Console.SetCursorPosition(w / 2 - 5, 10);
Console.WriteLine("勇士斗惡龍");
//當(dāng)前選項(xiàng)的編號
int nowSelIndex = 0;
//因?yàn)橐斎?我們可以構(gòu)造一個(gè)開始界面的死循環(huán)
//專門用來處理 開始場景相關(guān)的邏輯
while (true)
{
//用一個(gè)標(biāo)識用來退出此循環(huán)
bool isQuitWhile = false;
//顯示內(nèi)容檢測輸入
//設(shè)置光標(biāo)位置,再顯示內(nèi)容
Console.SetCursorPosition(w / 2 - 4, 12);
//根據(jù)當(dāng)前選擇的編號來決定是否變色
Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("開始游戲");
Console.SetCursorPosition(w / 2 - 4, 14);
Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("退出游戲");
//檢查玩家輸入的鍵并且不會在控制臺上顯示輸入內(nèi)容
char input = Console.ReadKey(true).KeyChar;
switch (input)
{
case 'W':
case 'w':
nowSelIndex = 0;
break;
case 'S':
case 's':
nowSelIndex = 1;
break;
case 'j':
case 'J':
if (nowSelIndex == 0)
{
//1.改變場景ID
nowSceneID = 2;
//2.要退出內(nèi)層循環(huán)while
isQuitWhile = true;
}
else
{
//關(guān)閉控制臺
Environment.Exit(0);
}
break;
}
if (isQuitWhile == true)
break;
}
break;
case 2:
break;
case 3:
break;
default:
break;
}
}
}
}
}
總結(jié)
- 今天的內(nèi)容到這里就結(jié)束了,總的來說這部分的內(nèi)容還是比較簡單的,不妨跟著博主自己動(dòng)手嘗試一下,畢竟很多問題只有自己動(dòng)手試過了才能發(fā)現(xiàn),如果你在實(shí)現(xiàn)過程中遇到任何問題,歡迎在評論區(qū)指出或者私信我??!
- 后面的內(nèi)容很快更新,感興趣不妨關(guān)注一下錯(cuò)過后面的內(nèi)容哦??!(小小預(yù)告一下,接下來就開始我們游戲界面的內(nèi)容啦,這一塊才是真正的重頭戲)
新人博主創(chuàng)作不易,如果感覺文章內(nèi)容對你有所幫助的話不妨三連一下再走唄。你們的支持就是我更新的動(dòng)力?。?!
**(可莉請求你們?nèi)B支持一下博主?。?!點(diǎn)擊下方評論點(diǎn)贊收藏幫幫可莉吧)** 文章來源:http://www.zghlxwxcb.cn/news/detail-705168.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-705168.html
到了這里,關(guān)于【C#項(xiàng)目實(shí)戰(zhàn)】控制臺游戲勇士斗惡龍(1)——游戲初始設(shè)置以及開始界面的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!