官术网_书友最值得收藏!

第20章 舍不得if套不著狼

  • 程序媛養成計劃
  • 任煦之秋
  • 2117字
  • 2020-04-23 22:13:24

雖然游戲功能不過才完成了這么一小步,但我卻已經陶醉于這種創造的滿足感,一時間玩兒得不亦樂乎。我現在開始明白為什么程序員容易沉迷于程序世界了,因為這種親自創造一切,一切都在自己掌控中的感覺真的太好了!

想到這里,我居然開始對編程產生了前所未有的好感,巴不得老爹能夠把他的知識直接灌輸到我的腦子里邊,這樣我就可以寫任何我想要寫的程序了!

老爹笑了笑,并沒有打擾我,就這么看著我控制灰太狼在屏幕中亂跑。

灰太狼在青青草原背景上歡快地跑著,然而好景不長,意外發生了,灰太狼居然跑不見了!

「什么鬼?羊還沒有抓到,狼跑丟了!」

我的腦中出現了千百個問號,我仔細的回想了一下剛才的過程,然后進行逆向操作,跑丟了的灰太狼終于又回到了青青草原上。

原來開始的時候我一直控制灰太狼的移動軌跡在窗體范圍內,結果沒忍住多按了幾次上方向鍵,灰太狼居然從窗體的上邊緣消失!雖然按了幾次下方向鍵后它又重新出現在了窗體之中,但我隱隱覺得這是個不合理的地方。

于是我又嘗試其它三個方向,果然,灰太狼一旦靠近窗體的邊界后,如果我繼續往那個方向移動,灰太狼就會消失。如果向著反方向移動,消失的灰太狼又會重新出現。

「老爹老爹,好像出bug了。你看,灰太狼一旦越過窗體的邊界就消失了!」

我扯了扯老爹的衣袖,對著屏幕給他演示了一遍。

「早就等著你問這個問題呢!既然如此,我就來給你講一講吧。

在現實生活中,表演的人員要演出得有舞臺吧?沒有舞臺,觀眾就看不見表演的人。同樣的,我們的圖片、按鈕、文本框等等控件要顯示在屏幕上同樣需要舞臺,而這個舞臺就是窗體。

表演人員一旦離開了舞臺就不能夠被觀眾看到了,這些控件也一樣,一旦離開了窗體的范圍,我們就看不見它們了。

所以為了不讓灰太狼消失,我們必須進行判斷:當我們按下方向鍵后,如果灰太郎移動的后的位置超出了窗體的范圍,我們就讓灰太狼保持在原地不動。

要完成這一步,就必須請出if來完成啦!」

「soga,可是如果這樣的話,那就得知道窗體的四個頂點的坐標啦?不然怎么判斷呢?」

「說得沒錯,理論上的確是這樣,但是不用那么麻煩,我們只需要知道窗體工作區的寬度和高度就可以了。」

老爹神秘地笑了笑。

「我剛剛說了,表演的人如果演出必須要在舞臺上,而表演者在舞臺上表演的時候有可能會有特定的位置,好像叫做走位!如果你還記得的話,在『名偵探柯南』第69集舞臺劇演員殺人事件應該有相關的描述。

我這里要說的,走位標記的是表演者在舞臺上的位置,也就是說,表演者的位置是相對舞臺的。」

「什么叫相對于舞臺?」

我聽得有點迷茫。

「嗯~,相對這個概念海了去了,涉及到參考系的選擇,這個要你初中物理才會學,現在要怎么跟你說呢?哈,有了!

咱們現在住多少樓?」

「16樓!門牌號上不是寫著1602嘛!」

我白了老爹一眼。

「你說的16樓是相對于1樓地面來說的,如果咱們相對于地下2樓的地面,咱們又是幾樓呢?」

「18樓!」

「對頭!所以我們參考的對象不一樣,得到的結果也不一樣!」

老爹笑著點了點頭。

「說遠了,我想要說的是,咱們窗體里面的控件,它的位置也是相對于窗體的。也就是說,如果我們把圖片控件放在窗體工作區其最左上角,此時它的位置信息是:x=0,y=0,可是這個時候圖片控件并不是在屏幕的最左上角,明白了么?」

「哦~,原來是這個意識啊!」

我若有所思地點了點頭。

「等等,老爹你一直在強調窗口的工作區,這又是個什么意思?」

「你看,一個窗體它有標題欄吧?就是最大化、最小化和關閉按鈕這一欄。」

「嗯嗯,然后呢?」

「所謂的窗體的工作區,就是指的除去標題欄后的那部分,因為我們不能把控件放在標題欄上。」

「明白了!」

「好了,接下來說說防止灰太狼消失的邏輯:

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;

}」

「為什么向下和向右的時候判斷時要減去灰太狼的高度和高度啊?」

我撓了撓頭,有些想不明白。

「這是因為我們描述一個控件的位置,其實是描述的這個空間最左上角那個點的位置信息。現在我們使用這個灰太狼這個控件是個正方形,并且它的變長為50像素。

當灰太狼移動到最左的時候,x=0;移動到最上的時候,y=0。但是移動到最右的時候,此時和窗體重合是右邊,此時x=窗體的寬度– 50像素。

同理,當灰太狼移動到最下邊的時候,和窗體重合的是下邊,這個時候的y=窗體的高度– 50像素」

為了讓我能夠明白這其中的關系,老爹還特別打開是畫圖程序,給我詳細畫了出來。這么一來,我不想理解都難。

既然邏輯已經講明白了,我只需要把老爹的講述轉譯成代碼就好了。雖然又犯了不少的錯誤,但在老爹耐心地指導下還是將bug一個一個都解決了,這么一來,灰太狼總算不會消失了。

通過實現這個功能我才深切的體會到,其實在實現某個功能之前,分析才是最重要的。只要把過程弄明白了,要實現具體的功能時就變得得心應手。

還有就是老爹說的這些理論我都明白,可是在寫程序的過程中卻漏洞百出,「看來紙上得來終覺淺」果然還是說得不錯的。

主站蜘蛛池模板: 大冶市| 油尖旺区| 涟源市| 平武县| 海安县| 德兴市| 万源市| 前郭尔| 津南区| 阳城县| 全南县| 瑞昌市| 诏安县| 七台河市| 山东省| 巢湖市| 常熟市| 通河县| 和顺县| 大同县| 漳平市| 延吉市| 莒南县| 高唐县| 托克托县| 三明市| 大同市| 永胜县| 绥滨县| 铁岭市| 普洱| 乐亭县| 喜德县| 汤阴县| 淳化县| 即墨市| 张掖市| 威海市| 尚义县| 区。| 吉首市|