2013-07-30 74 views
0

目前正在開發我的第一個完整的Flash遊戲,我現在正在實現多個級別,這意味着我必須做一個級別選擇屏幕。實際上完成這一點我沒有問題,但我知道如何做到這一點的唯一方法是每次有人通過一個新的關卡時(例如,在通過關卡2之後,現在有兩個可用按鈕,對於1級和2級而不是1級)。創建一個很好的代碼級別選擇屏幕

當然,這是非常低效的。我希望能夠一次完成所有關卡。我事先已經知道我會有9個關卡,所以可以使用3x3的按鈕網格系統(可能使用2個循環,用於x和y位置?)。

級別選擇和其他頁面之間的導航沒有問題,我應該能夠做到這一點。我真正的問題是創建實際的關卡選擇屏幕,以顯示不同數量的可點擊按鈕,具體取決於遊戲進展情況。我的意思是我猜測我只是爲用戶創建了一些布爾值,並且一旦通過了關卡,我將這些布爾值更改爲true,然後將布爾值鏈接到創建按鈕而不是靜態文本字段。那麼我只需要在水平選擇屏幕上單獨定位每個按鈕?如果有人可以說出一些關於如何完成這種類型的關卡選擇屏幕的燈光(並且通過燈光,我的意思是代碼= p),那麼將不勝感激,特別是關於將按鈕添加到舞臺與文本區域的部分。

另外,創建9個不同的按鈕是浪費嗎?只需創建1個按鈕然後只需更改其上的文本字段以顯示級別編號即可。我可以使用動態文本字段來完成此操作,只需更改該文本字段中的文本?

回答

1

基本上可以,你可以做任何你認爲合適的事情,只是爲所有這些做好準備。這主要是架構問題而非實際編程問題。關於進度,您可以追蹤最高可用等級,只顯示可用等級或顯示等級進度(例如,一個等級完成1星,另一個等級2星,並且製作帶有星星的按鈕)等等。另外,你可以看看說憤怒的小鳥級別選擇器,它有15個按鈕,爲什麼你不能製作9?

關於如何爲舞臺添加自定義按鈕 - 首先,如果將整個關卡選擇器包裝到Sprite中,爲其編寫具有位於特定座標的關卡按鈕的AS3代碼,則關閉按鈕(又名「no I想要在選擇級別「one」之前查看其他選項),其他數據(如具有級別名稱的文本字段等)等,無論您認爲合適。一個例子(只有水平按鈕,主要是僞代碼):

public class LevelSelector extends Sprite { 
    private static const thumbnailClasses:Array=[Level01Bitmap,Level02Bitmap,...]; 
    // embed these 
    private var gridXOffset:Number=60; 
    private var gridYOffset:Number=60; 
    private var gridXDimension:int=3; // how many buttons in row 
    private var gridXBase:Number=30; 
    private var gridYBase:Number=10; 
    // other initialized data 
    private var buttons:Vector.<LevelButton>; // buttons stored here 
    public function LevelSelector() { 
     buttons=new Vector.<LevelButton>(); 
     // other initialization 
     for (var i:int=0;i<thumbnailClasses.length;i++) { 
      var b:LevelButton=new LevelButton(); 
      b.x=(i%gridXDimension)*gridXOffset+gridXBase; 
      b.y=Math.floor(i/gridXDimension)*gridYOffset+gridYBase; 
      b.picture=(new thumbnailClasses[i]()).bitmapData; 
      // assuming thumbnails are embedded bitmap class names 
      addChild(b); 
      b.enabled=levelIsAvailable(i); // query level availability 
      b.stars=getLevelPerformance(i); // query how many stars to draw 
      b.addEventListener(MouseEvent.CLICK,buttonPressed); // listen for mouse 
      buttons.push(b); 
     } 
    } 
    private function buttonPressed(e:MouseEvent):void { 
     var level:int=buttons.indexOf(e.target); 
     var b:LevelButton=e.target; // if need to do something with the button 
     // query correctness and navigate to level screen 
    } 
} 
+0

真棒回覆Vesper,幾個問題。對於thumbnailClasses,我是否必須爲每一個創建一個類?他們的實際水平預覽是正確的?對於按鈕存儲部分,你建議創建一個按鈕的數組/按鈕,並創建每個級別的按鈕?最後....不太瞭解查詢級別的可用性部分... – spaderdabomb

+0

你的for循環很棒我喜歡它hehehe – spaderdabomb

+0

對於thumbnailClasses,是的他們打算是預先生成的級別預覽。你開始一個關卡,截圖,裁剪,調整大小,嵌入你的SWF並命名爲「Level01Bitmap」。有些遊戲的水平縮略圖完全如此。查詢級別的可用性 - 您可以爲此調用一個靜態方法,或者您可以分配一個回調函數,如果提供了一個int值,將返回一個布爾值,而'LevelButton'實例將接受它作爲其enabled屬性,例如,不會對鼠標點擊產生反應 - 這取決於其實施。 – Vesper

1

這聽起來像你需要將問題分解成更小的步驟。我不確定您是否使用Flash時間軸或外部.as類。我建議使用類,因爲你可以更靈活地顯示你在屏幕上顯示的內容。如果你不習慣使用類,下面可能沒有多大意義...

在你的主要Document.as類中,你可以跟蹤玩家已經完成了哪些級別(也許在一個數組中對應於級別編號的布爾值)。當需要LevelSelect頁面時,創建一個新的LevelSelect頁面並傳遞_levelsCompleted數組作爲參數。 LevelSelect類實例可以使用傳遞的數組來確定需要多少個LevelButton。循環傳遞的布爾數組,如果索引值爲true,則添加一個LevelButton。每個LevelButton都可以傳遞其級別編號(循環計數器),可以在其TextField中使用它來標識它(記住數組索引是零索引,因此級別'1'實際上可能爲'0')。

如果這沒有任何意義,請告訴我。

+0

是的,我正在使用類,這是有道理的啊!我喜歡關於使用數組索引值來確定文本字段編號的建議 – spaderdabomb

相關問題