CH 2 歡迎來到代碼世界
1.殊途同歸,開辟代碼之路
在上一章的demo中,我們已經創建了自己的世界,並在其中添加了一個角色。然而,這個工作並不是我們通過編寫程序實現了,而是借助了Greenfoot作為一個簡易游戲框架的一些現成的功能。
雖然是一個不錯的開頭,但我們卻不能停步不前。
在這一章,我們首先要做的就是——破舊立新,用編寫代碼的方式實現上一章的實現的內容。創建一個黑色的世界,並使其自動在世界的中心添加一個白色行者,從此和手動擺放說拜拜。
(1).代碼編寫的BlackWorld
首先讓我們對着類列表中的BlackWorld右鍵,再次使用“Set image”的方法設置圖片為“None”,清空我們之前的設定。
然后,我們將通過代碼,來實現這個簡單而深邃的純黑世界。
雙擊BlackWorld類,Greenfoot會為我們打開一個代碼編輯界面。
這就是我們今后主要干活的地方了。我們先來看一下Greenfoot自動生成的這個BlackWorld類的代碼。
在這里我們先來簡單的寫幾行代碼,來將這個場景填充為黑色,先來看代碼,具體含義后面慢慢解釋。
代碼清單:
1 /** 2 * Write a description of class BlackWorld here. 3 * 4 * This is a world which is filled with black. 5 * 這是一個純黑的世界類 6 * 7 * @author upupzealot 8 * @version 0.1 9 */ 10 public class BlackWorld extends World 11 { 12 13 /** 14 * Constructor for objects of class BlackWorld. 15 * BlackWorld類的構造器 16 */ 17 public BlackWorld() 18 { 19 // Create a new world with 400x200 cells with a cell size of 1x1 pixels. 20 super(400, 200, 1); 21 setBackground("Background.png"); 22 } 23 }
寫完之后點擊代碼編輯器左上角的compile(編譯)按鈕,或者主界面上的compile按鈕,提交我們剛剛修改的代碼。
一個純黑的舞台就展示在我們的眼前了。
可以看到編譯過后,類列表中BlackWorld上原有的灰色斜線們也不見了。一個類上有灰色斜線表示它是未編譯的。編譯過后,灰色斜線們會消失。
PS:默認代碼中世界的尺寸是600 * 400的,我這里為了縮小窗口方便截圖,就改為400 * 200了,詳見代碼。
(2).BlackWorld類代碼解釋
第3~11行是對這個類的大體描述。9、10行是作者信息和版本信息。這個部分完全可以空着不寫,不影響功能的。反正我自己是從來不寫的,不過嘛習慣還是養好的好。
12到25行是正式的代碼部分。可以看到整個BlackWorld類目前只有一個被稱為構造器的方法(method)。(這里的構造器(Constructor)是我的直譯,通常稱之為構造方法)
15到18行是對這個方法的解釋(同上,可不寫)。
而19到24行是這個方法的主體。
我們注意到其中21行位於一對斜杠之后,整行呈灰色。那是因為在Java語言中,雙斜杠(//)開頭表示之后的整行為注釋。注釋是寫給人看的,它可以是你自己寫的標記,同時也可以讓可能出現的看你代碼的人看起來更加方便。成為注釋的行在編譯過程中會被編譯器自動忽略,也就是說機器看不見注釋行,它只是寫給人看的。
22,、23行是真正有意義的代碼行。
其中22行規定了BlackWorld是一個寬400格,高200格,每格大小為1*1像素的一個世界。
23行則表示將一張名為“Background.png”的圖片設為這個世界的背景圖。
PS:項目中用到的每一張圖片都必須放在項目目錄的image文件夾下,然后就可以在改項目的任何位置在代碼中使用了。
(3).以同樣的方法來處理白色行者
看完上面的介紹,你能不能用相似的方法來處理白色行者呢?雙擊打開WhiteWalker的代碼編輯窗口。我們可以看到
里面只有一個叫做act的方法。並沒有提供現成的構造方法,所以這里我們需要自己寫。請讀者自己動手,參考BlackWorld的中的構造函數的格式,來自己編寫WhiteWalker的構造方法,這里暫時不給出參考代碼。
動手任務:
參考BlackWorld的參考代碼,為WhiteWalker編寫一個構造方法。在這個構造方法中,將我們預置在項目images文件夾中名為WhiteWalker.png的圖片設置為WhiteWalker的顯示圖片。
任務提示:
Actor類(及其子類)設置顯示圖片的方法和World略有不同。它的名稱是SetImage,不過在括號中傳遞的參數形式和World類中的setBackground相同。(都是String(字符串)類型)
(4).在我們的純黑世界中加入白色行者
我們在BlackWorld和WhiteWalker類的構造函數中已經完成了初步的初始化工作——設定顯示圖片。
這是一個振奮人心的良好開始,讓我們再接再勵,學習一下怎么使用代碼,在我們的BlackWorld中央添加一個WhiteWalker。我們不妨把這部分代碼放在BlackWorld設置完圖片之后。
動手任務:
在BlackWorld的構造函數中,用代碼實現在其中央(也就是(200, 100)位置)添加一個WhiteWalker。根據下面的提示,嘗試組合出一行代碼。
任務提示:
1.這里會用到一個Greenfoot中World及其子類添加一個Actor或其子類到(x,y)位置的方法。
addObject(Actor actor, int x, int y);//(這里的Actor和int表示參數類型,Actor表示Greenfoot中的Actor及其子類,int表示整數)
2.而在添加WhiteWalker時,必須生成一個WhiteWalker對象傳遞進addObject的參數列表中。
我們可以通過new WhiteWalker()來調用我們之前寫好的WhiteWalker構造函數,來生成一個WhiteWalker,把它放在代碼中合適的位置用它代表一個新生的WhiteWalker吧。
好了,接下來來看代碼。(希望在看參考代碼之前你已經真的自己嘗試過了,只有多動手才能學好編程)
代碼清單:
1 public BlackWorld() 2 { 3 // Create a new world with 400x200 cells with a cell size of 1x1 pixels. 4 super(400, 200, 1); 5 setBackground("Background.png"); 6 7 addObject(new WhiteWalker(), 200, 100); 8 }
這里添加WhiteWalker的代碼是最后一行。你寫對了嗎?其實任務提示中已經寫得很詳細了哦。
2.代碼之力
(1).讓WhiteWalker成為真正的Walker——給WhiteWalker添加移動代碼
細心的同學一定察覺到了,在我們生成WhiteWalker時,自動生成的代碼中有且只有一個名叫act的方法。
act這個方法是Greenfoot中Actor及其子類的核心方法。具體的先不說,直接給出代碼吧。
代碼清單:
1 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) 2 3 /** 4 * Write a description of class BlackWorld here. 5 * 6 * this is an actor which is a white brick and it could walk 7 * 8 * @author upupzealot 9 * @version 0.1 10 */ 11 public class WhiteWalker extends Actor 12 { 13 public WhiteWalker() 14 { 15 setImage("WhiteWalker.png"); 16 } 17 18 19 public void act() 20 { 21 int x = getX(); 22 int y = getY(); 23 x++; 24 setLocation(x, y); 25 } 26 }
按照上述代碼完成WhiteWalker類,編譯后回到主界面,按下Run按鈕。
可以看到我們的WhiteWalker就向右動起來啦!
動手任務:
參考上面的右移代碼,想一想右移的代碼是怎么實現的,究竟在那一行我們給WhiteWalker添加了代碼之力呢?怎么實現左移?上下移動呢?45°斜角的四個方向呢?
任務提示:
這次不給提示,相信自己,學寫代碼其實很簡單!
至此我們初步學習了怎么在Greenfoot中以編寫代碼的形式來達成我們的目標。對於一些格式或者Greenfoot中的一些函數不熟悉我們不必在意。在下一章中,我們將為大家慢慢解釋今天最后給出的部分代碼。同時為大家介紹一些Java作為一門OO編程語言的基本知識。(Object Oriented,縮寫OO,面向對象的)如果你現在對於自己寫的代碼或者我給出的部分代碼只是一知半解,不用擔心,就看我“下回分析”吧。