第二十章 舍不得if套不著狼
雖然游戲功能不過才完成了這么一小步,但我卻已經(jīng)陶醉于這種創(chuàng)造的滿足感,一時間玩兒得不亦樂乎。我現(xiàn)在開始明白為什么程序員容易沉迷于程序世界了,因為這種親自創(chuàng)造一切,一切都在自己掌控中的感覺真的太好了!
想到這里,我居然開始對編程產(chǎn)生了前所未有的好感,巴不得老爹能夠把他的知識直接灌輸?shù)轿业哪X子里邊,這樣我就可以寫任何我想要寫的程序了!
老爹笑了笑,并沒有打擾我,就這么看著我控制灰太狼在屏幕中亂跑。
灰太狼在青青草原背景上歡快地跑著,然而好景不長,意外發(fā)生了,灰太狼居然跑不見了!
「什么鬼?羊還沒有抓到,狼跑丟了!」
我的腦中出現(xiàn)了千百個問號,我仔細(xì)的回想了一下剛才的過程,然后進行逆向操作,跑丟了的灰太狼終于又回到了青青草原上。
原來開始的時候我一直控制灰太狼的移動軌跡在窗體范圍內(nèi),結(jié)果沒忍住多按了幾次上方向鍵,灰太狼居然從窗體的上邊緣消失!雖然按了幾次下方向鍵后它又重新出現(xiàn)在了窗體之中,但我隱隱覺得這是個不合理的地方。
于是我又嘗試其它三個方向,果然,灰太狼一旦靠近窗體的邊界后,如果我繼續(xù)往那個方向移動,灰太狼就會消失。如果向著反方向移動,消失的灰太狼又會重新出現(xiàn)。
「老爹老爹,好像出bug了。你看,灰太狼一旦越過窗體的邊界就消失了!」
我扯了扯老爹的衣袖,對著屏幕給他演示了一遍。
「早就等著你問這個問題呢!既然如此,我就來給你講一講吧。
在現(xiàn)實生活中,表演的人員要演出得有舞臺吧?沒有舞臺,觀眾就看不見表演的人。同樣的,我們的圖片、按鈕、文本框等等控件要顯示在屏幕上同樣需要舞臺,而這個舞臺就是窗體。
表演人員一旦離開了舞臺就不能夠被觀眾看到了,這些控件也一樣,一旦離開了窗體的范圍,我們就看不見它們了。
所以為了不讓灰太狼消失,我們必須進行判斷:當(dāng)我們按下方向鍵后,如果灰太郎移動的后的位置超出了窗體的范圍,我們就讓灰太狼保持在原地不動。
要完成這一步,就必須請出if來完成啦!」
「soga,可是如果這樣的話,那就得知道窗體的四個頂點的坐標(biāo)啦?不然怎么判斷呢?」
「說得沒錯,理論上的確是這樣,但是不用那么麻煩,我們只需要知道窗體工作區(qū)的寬度和高度就可以了?!?p> 老爹神秘地笑了笑。
「我剛剛說了,表演的人如果演出必須要在舞臺上,而表演者在舞臺上表演的時候有可能會有特定的位置,好像叫做走位!如果你還記得的話,在『名偵探柯南』第69集舞臺劇演員殺人事件應(yīng)該有相關(guān)的描述。
我這里要說的,走位標(biāo)記的是表演者在舞臺上的位置,也就是說,表演者的位置是相對舞臺的?!?p> 「什么叫相對于舞臺?」
我聽得有點迷茫。
「嗯~,相對這個概念海了去了,涉及到參考系的選擇,這個要你初中物理才會學(xué),現(xiàn)在要怎么跟你說呢?哈,有了!
咱們現(xiàn)在住多少樓?」
「16樓!門牌號上不是寫著1602嘛!」
我白了老爹一眼。
「你說的16樓是相對于1樓地面來說的,如果咱們相對于地下2樓的地面,咱們又是幾樓呢?」
「18樓!」
「對頭!所以我們參考的對象不一樣,得到的結(jié)果也不一樣!」
老爹笑著點了點頭。
「說遠(yuǎn)了,我想要說的是,咱們窗體里面的控件,它的位置也是相對于窗體的。也就是說,如果我們把圖片控件放在窗體工作區(qū)其最左上角,此時它的位置信息是:x=0,y=0,可是這個時候圖片控件并不是在屏幕的最左上角,明白了么?」
「哦~,原來是這個意識?。 ?p> 我若有所思地點了點頭。
「等等,老爹你一直在強調(diào)窗口的工作區(qū),這又是個什么意思?」
「你看,一個窗體它有標(biāo)題欄吧?就是最大化、最小化和關(guān)閉按鈕這一欄?!?p> 「嗯嗯,然后呢?」
「所謂的窗體的工作區(qū),就是指的除去標(biāo)題欄后的那部分,因為我們不能把控件放在標(biāo)題欄上。」
「明白了!」
「好了,接下來說說防止灰太狼消失的邏輯:
switch(keyCode)
{
case 38:/*上*/
if((灰太狼.y –移動的寬度)大于等于 0)
{
灰太狼.y -=移動的寬度
}
break;
case 40:/*下*/
if((灰太狼.y +移動的寬度)小于等于(窗體的高度-灰太狼的高度))
{
灰太狼.y +=移動的寬度
}
break;
case 37:/*左*/
if((灰太狼.x –移動的寬度)大于等于 0)
{
灰太狼.x -=移動的寬度
}
break;
case 39:/*右*/
if((灰太狼.x +移動的寬度)小于等于(窗體的寬度-灰太狼的寬度))
{
灰太狼.x +=移動的寬度
}
break;
default:/*其他按鍵*/
什么都不做
break;
}」
「為什么向下和向右的時候判斷時要減去灰太狼的高度和高度?。俊?p> 我撓了撓頭,有些想不明白。
「這是因為我們描述一個控件的位置,其實是描述的這個空間最左上角那個點的位置信息?,F(xiàn)在我們使用這個灰太狼這個控件是個正方形,并且它的變長為50像素。
當(dāng)灰太狼移動到最左的時候,x=0;移動到最上的時候,y=0。但是移動到最右的時候,此時和窗體重合是右邊,此時x=窗體的寬度– 50像素。
同理,當(dāng)灰太狼移動到最下邊的時候,和窗體重合的是下邊,這個時候的y=窗體的高度– 50像素」
為了讓我能夠明白這其中的關(guān)系,老爹還特別打開是畫圖程序,給我詳細(xì)畫了出來。這么一來,我不想理解都難。
既然邏輯已經(jīng)講明白了,我只需要把老爹的講述轉(zhuǎn)譯成代碼就好了。雖然又犯了不少的錯誤,但在老爹耐心地指導(dǎo)下還是將bug一個一個都解決了,這么一來,灰太狼總算不會消失了。
通過實現(xiàn)這個功能我才深切的體會到,其實在實現(xiàn)某個功能之前,分析才是最重要的。只要把過程弄明白了,要實現(xiàn)具體的功能時就變得得心應(yīng)手。
還有就是老爹說的這些理論我都明白,可是在寫程序的過程中卻漏洞百出,「看來紙上得來終覺淺」果然還是說得不錯的。