當前位置: 華文星空 > 知識

C++到底是如何從程式碼到遊戲的?

2020-04-04知識

這個簡單啊。

你既然問C++了,那我問你,現在,我有一個Student類。C++怎麽建立一個學生類的物件?

// 嗯我會!有兩種方式: Student s ; Student * s2 = new Student ( "張三" );

那好,現在這學生的行為有:吃飯,睡覺,上網課。現在你執行個上網課的行為,怎麽做?

// 簡單啊 s2 -> upNetwork class ();

透過物件呼叫成員函式不就成了麽。

嗯,上面的程式碼在學校裏都寫過吧?有這個基礎就夠了。

那遊戲是啥?無非是一堆圖形堆疊唄,把上面的Student類換成表單類,換成控制項類,換成遊戲中不同的元素類,然後再組合起來不就完了麽。

吶現在,我告訴你,有一個表單類,叫QWidget,它有一個行為叫show,可以顯示表單。你給我生成一個表單並顯示出來。那就照葫蘆畫瓢唄:

QWidget * w = new QWidget (); w -> show ();

來我們看看效果:

呀,有點意思哈?但是這距離遊戲還差遠呢啊。 你這表單也太醜了不是。

沒事,表單醜不要緊,我們給她美化一下!

TDWidget * w = new TDWidget ( ":/img/welcome.png" ); w -> show ();

QWidget換成了TDWidget,建構函式裏傳了一張圖片,沒超綱吧。再看看效果:

誒?事情好像開始變的有趣了起來?

但還是不夠,我這是遊戲,要互動的!你這一張死圖能幹啥。

互動嘛!加個按鈕不完了?我給你一個按鈕類,這個類有一個move()行為,可以把自己移動到畫面的任何地方。你知道你想要的按鈕怎麽來了嗎?

QPushButton * btn = new QPushButton ( "按鈕" , w ); //第二個參數代表它屬於哪個表單,如果不寫,它就會生成在螢幕上而不是表單裏 btn -> move ( 330 , 450 );

瞅瞅:

em.......你這按鈕,有是有,畫風有點突兀了吧。

沒事,再美化一下嘛:

TDPushButton * btn = new TDPushButton ( ":/img/begin_normal.png" , // 常規圖片 ":/img/begin_hover.png" , // 滑鼠懸停的圖片 ":/img/begin_press.png" , // 滑鼠按下的圖片 w ); // 父控制項 btn -> move ( 330 , 450 );

效果:

呀 可以啊。 快快快,然後呢,點開始遊戲,進入遊戲界面!這個咋做?

嗯.....其實界面切換你自己已經會了。

你這個界面不就是一個表單,想切換界面的話.....你把這個表單關了,再換張圖片開一個新的不就完了。

新的表單用一張傳新的圖片做背景,我再順手給加上四個按鈕,程式碼不貼了,就是上面的程式碼復制貼上改改座標,改改圖片:

接下來就是遊戲的主體部份了,也巨簡單,有圖就行:

TDMenuButton * btn1 = new TDMenuButton ( ":/img/1_normal.png" , ":/img/1_hover.png" , ":/img/1_selected.png" , this ); btn1 -> move ( 100 , 100 ); TDMenuButton * btn2 = new TDMenuButton ( ":/img/1_normal.png" , ":/img/1_hover.png" , ":/img/1_selected.png" , this ); btn2 -> move ( 165 , 100 ); TDMenuButton * btn3 = new TDMenuButton ( ":/img/1_normal.png" , ":/img/1_hover.png" , ":/img/1_selected.png" , this ); btn3 -> move ( 100 , 165 );

三個按鈕,和上面的TDPushButton沒區別,就是換成了TDMenuButton對不對,沒超綱吧。

只要你的圖片夠美,就能生成這樣:

一個按鈕會寫,三個按鈕自然也會寫,既然學了點C++都想做遊戲了,迴圈總會寫吧:

for ( int i = 0 ; i < 11 ; i ++ ) { for ( int j = 0 ; j < 6 ; j ++ ) { TDMenuButton * btn = new TDMenuButton ( ":/img/1_normal.png" , ":/img/1_hover.png" , ":/img/1_selected.png" , this ); btn -> move ( 100 + i * 65 , 100 + j * 65 ); } }

效果:

多空幾行,密恐福利:

這.....怎麽還有點一言難盡呢......

迴圈會寫,隨機數會寫嗎? 隨機個頭像行嗎?

嗯......這下終於像點樣了。

最後再加億點點核心邏輯:點選兩個相同的圖片,判斷它能不能連通,如果能連通,就把這兩個按鈕直接delete掉,效果就是醬紫:

就是這樣咯,從你學過的C++基礎語法,結合現有的框架控制項,就可以擼這樣一個簡單的連連看。

當然了,為了點燃你題目裏想要的學習熱情,我故意避開一些以你現有知識可能聽不懂的部份,還有一些邏輯比較繞的部份。比如:

避開了註冊按鈕的回呼,

避開了隨機生成圖片的時候要保證成對出現的演算法,

避開了把這些按鈕和數據做關聯,

避開了如何透過數據計算兩點能否連通,

等等

但這都不重要,不妨礙你簡單體驗一下 C++是如何從程式碼到遊戲 的這個過程。

從圖片素材上你們也看出來了,這程式碼是兩三年前的,那個時候還在做培訓機構的輔導老師,學生們愛打遊戲,不好好上課,就做的這個上課帶她們寫。

因為本身我不打榮耀,所以裏面的頭像確實一個也不認識,都是那時候為了勾引學生好好上課,現在遊戲裏的頭像應該有不少都更新好幾茬兒了。

這個玩意兒是用Qt C++寫的。因為本身對幀率沒什麽要求,所以基於Qt就可以搞。如果要玩一些真正的遊戲(畫面需要幀率級別的重新整理的),一定要上遊戲引擎寫的。cocos2d unity3d 什麽的。

當然,我上面說「遊戲無非是一堆圖形堆疊唄」只是為了講解故意壓低一下難度,真正的遊戲開發是非常復雜龐大的。

這個小計畫確實像上面寫的一樣,用了大量的TD開頭的控制項。這個源自於我的一個開源框架叫做TD-Framework

因為我叫三級狗(ThreeDog)所以控制項普遍用TD開頭。Qt本身沒有提供這種直接用圖片構造控制項的方法,所以就自己造了一些。

寫下它的時候還是大四剛畢業,那時候我還把這玩意兒叫框架,現在... 我覺得還是叫玩具更合適些:跨平台編譯不過,函式指標強轉有問題,程式碼也寫的亂七八糟....

其實你題目上的這個困惑:(到現在為止,老師也只會教你如何寫程式碼)大家都是一樣的,而且很遺憾的告訴你,不只是到現在為止,一直到你畢業,你在學校上課學的東西可能也僅限於黑框框裏面打印點東西。至少用C++只能這樣。

我大學的時候和你一樣,我比你還急,語法沒看利索就去摸cocos2d了,對著視訊吭哧癟肚地搭環境,把視訊暫停下來抄程式碼,有一個地方有出入就跑不起來,對著報錯一難過就是一整天。

那時候寫程式碼僅限於:這麽寫可以實作這個功能,然後我照著這一句改吧改吧實作我的功能。

一開始都是這麽過來的。

回過頭來看這個過程還是收獲挺大的,硬著頭皮折騰了這些東西,回過頭再學基礎的時候發現理解多少會有點不一樣。

這幾天我在研究函式指標和std::function的時候又翻到了cocos2d的源碼。突然發現不光網上的小遊戲的程式碼,cocos2d框架本身的源碼對我而言也已經不再是天書,很多地方我已經能看懂了。

突然就明白當年為什麽那樣寫可以實作函式呼叫。也突然就知道 menuselector CC_CALLBACK 都是什麽東西 。說句沒出息的,這個發現幾乎成了我這幾天的快樂源泉。畢竟實打實的看到了自己在編程道路上的成長。

不管怎樣愛折騰絕對是好事兒,當然,大學教的那點黑框框裏的東西真的是非常非常重要的。

加油吧

20220215:

我本人沒有授權過任何機構和平台在B站修改,釋出這篇回答,大家看到了順手幫我點個舉報吧。

最近不斷收到好心人的提醒,我的文章又被抄了。我是真的累了 ,類似的視訊我找知乎版權團隊幫我處理過好幾個,都下架了。但幾乎每一次我都要送出一大堆資訊,簽署授權檔,走一堆流程才能把對方視訊下了。我今天在B站上搜了一下「c++是如何從程式碼到遊戲的」 媽呀十幾個一模一樣的視訊,把我的內容抄走拉群賣課,我是真的管不動了,抄襲成本和維權成本完全不是一個量級。大家看到了順手幫我點個舉報吧,能下架最好,如果舉報無效就無效吧,我也懶得折騰了。

我目前還是在認真工作上班,夯實基礎,沒有出書或者開課的計劃,老板們也不要因為此類需求再私信我啦。我先下還是想好好學技術,爭取以後寫出更多更好的文章給大家。