第十九章 快跑灰太狼
在我的期盼中,第二天的課程如約而至,不過(guò)在上課之前,老爹在我的電腦上安裝了一款叫做Visual studio的軟件。
「由于咱們今天是要編寫(xiě)游戲,自然不能再像之前那樣使用小黑屏咯,而是要使用圖形界面化窗體程序。
而用C語(yǔ)言直接來(lái)編寫(xiě)圖形化界面有些麻煩,這里咱們就用C語(yǔ)言的加強(qiáng)版C Plus以及微軟提供的MFC來(lái)實(shí)現(xiàn)推箱子這個(gè)游戲了?!?p> 「C Plus?那是不是我要重新學(xué)習(xí)相關(guān)的知識(shí)?。俊?p> 我苦著臉問(wèn)道。
「C Plus就是大家口中的C++,它的基礎(chǔ)語(yǔ)法和C語(yǔ)言幾乎一模一樣,增強(qiáng)的地方在于面向?qū)ο蟛糠??!?p> 老爹一邊安裝軟件,一邊解釋道。
「啥?我編個(gè)程序還得找個(gè)對(duì)象來(lái)坐我對(duì)面么?原來(lái)當(dāng)程序員的福利真么好啊,難怪不得那么人都想當(dāng)程序員。可是我還這么小,這樣做真的好么?」
聽(tīng)到「面向?qū)ο蟆顾膫€(gè)字的時(shí)候,我不禁一臉懵逼。
「這里的對(duì)象不是你想的那個(gè)對(duì)象,是……算了,我們先別討論對(duì)象的問(wèn)題,現(xiàn)在只是換一個(gè)環(huán)境讓你使用C語(yǔ)言。你看C++,C++,++在后,說(shuō)明是先使用C語(yǔ)言,然后再加的?!?p> 老爹捂著額頭苦笑道,想要解釋卻不知道該怎么說(shuō)。
「這樣的么?那當(dāng)初開(kāi)發(fā)C++的人應(yīng)該叫它++C才對(duì)嘛……」
在和老爹閑聊的時(shí)候,軟件也安裝好了。為了防止我被一些不相關(guān)的東西干擾,老爹先將工程搭建好,并且設(shè)置好了窗體的相關(guān)參數(shù)。
「現(xiàn)在我給你演示一遍怎么加載圖片,如果記不住就算了,反正我們的目的不在這兒?!?p> 有了老爹這句話,我理所應(yīng)當(dāng)?shù)臎](méi)有學(xué)會(huì)。
「好了,現(xiàn)在背景圖片和灰太狼都已經(jīng)加載進(jìn)來(lái)了,我們下一步就是獲取從鍵盤(pán)上的輸入,然后使用switch語(yǔ)句讓灰太狼動(dòng)起來(lái)。
在MFC中給我們提供了控件的鍵盤(pán)輸入事件,我們只需要到相應(yīng)的位置獲取鍵盤(pán)輸入了好了?!?p> 「鍵盤(pán)輸入我能夠理解,事件是個(gè)嘛玩意兒?」
我又被老爹說(shuō)的新名詞給弄迷糊了。
「嗯~,比如說(shuō)哈,我們現(xiàn)在在這個(gè)窗體上點(diǎn)擊鼠標(biāo),這個(gè)時(shí)候計(jì)算機(jī)是能夠捕捉到我們這個(gè)點(diǎn)擊動(dòng)作的,這個(gè)動(dòng)作被稱(chēng)之為事件源。當(dāng)計(jì)算機(jī)捕捉到這個(gè)動(dòng)作的時(shí)候,就會(huì)去執(zhí)行對(duì)應(yīng)的一段代碼。
而要執(zhí)行的那段代碼,叫做事件響應(yīng)內(nèi)容,需要我們給出,因?yàn)橛?jì)算機(jī)并不知道捕捉到動(dòng)作的時(shí)候需要做什么事情。
之前一直跟你說(shuō)過(guò),計(jì)算機(jī)很笨,我們不能把事件響應(yīng)內(nèi)容隨意放置,而是要放在一個(gè)特定的地方,否則計(jì)算機(jī)就找不到。而這個(gè)特定的位置,就叫做事件,事件里邊執(zhí)行的是事件響應(yīng)內(nèi)容。
所以事件的機(jī)制是:事件源觸發(fā)事件,事件執(zhí)行事件響應(yīng)內(nèi)容。
對(duì)了對(duì)了,我想到一個(gè)特別好的例子,我們?cè)賮?lái)說(shuō)說(shuō)諜戰(zhàn)風(fēng)云?!?p> 「好呀好呀!」
「在諜戰(zhàn)片里邊一般情報(bào)人員里邊都是單線聯(lián)系對(duì)吧?假設(shè)現(xiàn)在你是老爹的上級(jí),老爹是你手下的一個(gè)情報(bào)人員,但是由于我們是單線聯(lián)系,你可以直接聯(lián)系我,但是我不能直接聯(lián)系你。
這天呢,你聯(lián)系我,讓我要在半個(gè)月之內(nèi)獲取到敵人的密碼本。老爹我歷經(jīng)千難萬(wàn)險(xiǎn),九死一生,終于從敵人手里拿到了密碼本。
密碼本是拿到了,但是我要怎么給你呢?我又沒(méi)有辦法主動(dòng)聯(lián)系你?
這個(gè)時(shí)候我就想到你之前說(shuō)的,一旦拿到敵人的密碼本,就立刻藏在某個(gè)寺廟的佛龕下面。
老爹將密碼本放在佛龕下邊后不放心,于是就旁邊寫(xiě)上了『此處沒(méi)有密碼本』幾個(gè)大字。果不其然,敵人很快就找到了老爹藏密碼本的佛龕,但是在看到上面的字后信以為然就走了。
半個(gè)月的時(shí)間到,你就到佛龕下面拿到了密碼本,任務(wù)完成!」
「哈哈!老爹你這不是騙小孩兒么?敵人怎么可能相信你寫(xiě)的字嘛,這不是此地?zé)o銀三百兩么?」
「這只是老爹編的故事而已,不要較真嘛。
在這個(gè)故事里邊,半個(gè)月的時(shí)間就是事件源,當(dāng)半個(gè)月的時(shí)間一到,你就要去佛龕拿密碼本,所以佛龕就是事件,事件內(nèi)容就是密碼本咯。
同理,當(dāng)我們按下鍵盤(pán)上某個(gè)按鍵就是事件源,這個(gè)時(shí)候就要觸發(fā)鍵盤(pán)輸入事件,而我們只需要在事件里面添加我們需要進(jìn)行的邏輯內(nèi)容。」
「哦~,原來(lái)是這樣的哦?!?p> 我若有所思道。
「如果你暫時(shí)理解不了也沒(méi)有關(guān)系,我們現(xiàn)在的學(xué)習(xí)重點(diǎn)并不是UI的機(jī)制。那我們現(xiàn)在分析一下我們?cè)阪I盤(pán)輸入事件里面需要添加哪些內(nèi)容:
首先,我們需要在事件中用一個(gè)char類(lèi)型的變量來(lái)獲取鍵盤(pán)輸入按鍵的鍵碼,就取名叫做keyCode吧。至于如何獲取,MFC已經(jīng)給我們留好方法了,這個(gè)暫且不提。
接下來(lái)我們就應(yīng)該用switch來(lái)進(jìn)行邏輯處理:
switch(keyCode)
{
case 38:/*上*/
灰太狼向上移動(dòng)
break;
case 40:/*下*/
灰太狼向下移動(dòng)
break;
case 37:/*左*/
灰太狼向左移動(dòng)
break;
case 39:/*右*/
灰太狼向右移動(dòng)
break;
default:/*其他按鍵*/
什么都不做
break;
}
上下左右的鍵碼分別38、40、37、39,接下來(lái)我們要做的就是實(shí)現(xiàn)灰太狼的移動(dòng)邏輯了?!?p> 「嗯~」
我應(yīng)了一聲,在腦中想了一下老爹剛剛說(shuō)的內(nèi)容,確認(rèn)沒(méi)有什么問(wèn)題后點(diǎn)了點(diǎn)頭。
「還記得第一天我跟你說(shuō)過(guò),電腦的顯示屏其實(shí)是一個(gè)個(gè)排列的點(diǎn)陣吧?應(yīng)該說(shuō)是像素點(diǎn)?!?p> 「記得!」
畢竟當(dāng)時(shí)老爹讓我親自動(dòng)手實(shí)現(xiàn)了大寫(xiě)字母「Y」的顯示過(guò)程,所以我對(duì)這個(gè)知識(shí)點(diǎn)的印象還是很深刻的。
「記得就好,對(duì)于每一個(gè)像素點(diǎn)來(lái)說(shuō),它們都有自己的位置,就像是五指棋盤(pán)行數(shù)用數(shù)字表示,列數(shù)用字母表示,當(dāng)我們描述一個(gè)格子的位置時(shí),就會(huì)A1,B2等來(lái)表示第一行第一列和第二行第二列的格子。
同樣,像素點(diǎn)也有自己位置的描述方式,它是用x和y來(lái)記錄,其中x代表列號(hào),y代表行號(hào),它們都是從0開(kāi)始的,x從左到右依次增大,y從上到下依次增大。
像你房間里這臺(tái)電腦的顯示器分辨率是1920x1080,這代表著臺(tái)顯示器像素點(diǎn)一共有1080行,每一行有1920個(gè)像素點(diǎn)。最左上角的那個(gè)像素點(diǎn)位置是x=0,y=0,最右上角那個(gè)像素點(diǎn)的位置是1920,0。你能告訴老爹最左下角和最右下角的兩個(gè)點(diǎn)的像素位置么?」
老爹拿著屏幕跟我細(xì)細(xì)講道。
「這有什么難的,左下角像素點(diǎn)的位置是x=0,y=1080,右下角的像素點(diǎn)是x=1920,y=1080?!?p> 「不錯(cuò),正是如此。其實(shí)我們?cè)谝苿?dòng)灰太狼的時(shí)候,本質(zhì)上就是在改變灰太狼圖片在屏幕中的位置。比如說(shuō)我們要把灰太狼向上移動(dòng)10個(gè)像素,那么只需要讓灰太狼的x保持不變,讓y減去10;如果要向下移動(dòng),就讓y加上10。
同理,要向左移動(dòng),就是對(duì)x做減法,向右則是對(duì)x做加法?!?p> 有了老爹的理論支持和技術(shù)支持,很快我就將移動(dòng)灰太狼的邏輯寫(xiě)好了。費(fèi)了這么大的勁,我肯定要好好玩一下,于是在我的控制下,灰太狼在屏幕中到處亂跑。
任煦之秋
手機(jī)上邊好像對(duì)大括號(hào)和尖括號(hào)的顯示不是很好,造成閱讀體驗(yàn)不佳,但是在電腦上不會(huì)有這個(gè)問(wèn)題。我之前跟編輯反應(yīng)了,可是編輯沒(méi)有理我,所以請(qǐng)大家多多諒解