掃雷遊戲製作全過程05 之最終話

最終話討論的是前面幾個部分的整合問題,以及遊戲如何初始化和重新初始化。

整合問題:

採用內部類

起初沒有使用內部類,Mine(實體類)類生成了地雷表和標記表,MyLabel(界面類)類監聽到了各種點擊事件後,將改變信息通過set*方法傳給MyPanel(控制類),MyPanel類又通過各種set*方法修改地雷表和標記表。數據間的傳遞異常的麻煩,再加上重新初始化出現了一些問題。最後放棄了,改爲使用內部類。

在內部類裏維持了兩張表和一個心跳線程。

兩張表是指地雷表和標記表。地雷表由Mine生成,且只能由Mine修改,但是其他的類可以讀取數據。標記表也是由Mine生成的,但是MyLabel類可以修改之。

判勝和判負分別在MyLabel對象和MyPanel對象來負責。簡而言之——如果一個有地雷的Label被點開就算輸,而只有所有的地雷都被標記了纔算勝利。

我們在玩家每點擊一次Label進行一次判勝與判負。(很可笑的是,我之前竟然自己寫了一個監聽的線程來監聽點擊事件做一些判勝與判負的標記,真的是浪費ATP)

心跳線程指的是前面說的時間“僞動畫”的線程。在遊戲重啓的時候犯了很嚴重的錯誤。想要在重啓遊戲的時候關閉線程並重新啓動。最終也沒有找到方法(用已經過時的stop不算)。後來發現,重啓時間只需要將表示時間的變量初始化就OK了,不應該終止並重啓該線程,而應該使用一些標記來控制它(或許這也不是必要的)。

當想通了這裏後,重新初始化的問題也就解決了。

先說初始化:

其實就是簡單地創建了幾個對象,然後爲幾個公共變量賦初始值。

        initPanel(); //初始化主面板
        initMine(); //初始化生成地雷數組及標記數組
        initMusic(); //載入音樂
        initMouse(); //修改鼠標的圖標
        initTime(); //初始化時間僞動畫
        initButton(); //初始化開始和退出按鈕
        showRestMine(); //顯示剩餘的可用標記數量

當玩家點擊開始按鈕的時候,遊戲重新初始化。

重新初始化不需要重新創建新的對象,而僅僅是將初始化過程中的初始化了的變量值重新賦成初始值。(現在說來感覺非常容易,但是之前編程的時候,很自然地在想如何消滅掉對象,然後重新創建對象敲打

希望上面的話能對您理解程序或者寫程序有所幫助。有不明白的請看前面的博客。

對了,還有一點比較重要的事情,就是添加背景。或許是我真的很白癡吧。我之前把背景設置在最底層的Panel上,然後其上的各種控件都setOpaque(false);可是始終都沒有用。其實呢,應該將背景設置在最表層的下一層,最表層設置爲setOpaque(false);就可以了。

遊戲的jar文件已經上傳,歡迎試玩大笑

最終版的源代碼呢?希望您能用來學習奮鬥,而不是抄襲發火

並且真心的希望能對你有所幫助!吐舌頭(我上傳的源代碼沒有資源,資源在Game.jar包中,您只用解壓縮就可以獲得資源了)。再見


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章