Features
- 基於JavaFX設計了遊戲引擎XEngine
- 使用自行開發的遊戲引擎XEngine實現完整遊戲功能
- 遊戲資源管理:字型、圖片、音訊管理
- 遊戲地圖管理,多地圖切換
- MVVM分層設計,程式碼解耦合,模組高內聚
- Model模型系統設計,模組化設計
- 使用訂閱者模式實現的訊息系統和事件處理
- 使用Gradle構建
下載執行
首先,點選開啟:CrazyAlpha下載頁面
下載CrazyAlpha的最新版本,例如圖中的是1.0.1
,檔名是:crazyalpha.jar
PS:由於遊戲是使用Java編寫的,所以沒有安裝Java的小夥伴請先下載Java,Windows版本的Java執行環境下載:點選下載
在安裝完java環境之後,可以雙擊jar包執行,或者右鍵選擇使用Java Runtime
執行
當然也可以在命令列中執行
java -jar crazyalpha.jar
複製程式碼
開源
Github專案地址:github.com/Deali-Axy/C…
PS:由於版權原因,Github程式碼中不包含遊戲用到的圖片、字型、聲音等資原始檔,所以要執行遊戲的同學可以自行替換資原始檔,或者聯絡我獲取資原始檔。
架構
Game.Engine
:自行實現的遊戲引擎包Annotation
:引擎註解包,包含引擎定義的註解GameEventHandler
:事件處理器註解GameManager
:遊戲中各類管理器的註解GameModel
:模型註解GameObject
:遊戲物件註解GameView
:檢視註解,用於實現MVVM分層設計
Base
:基礎類包,包含了引擎定義的各種抽象基類BaseModel
:基礎模型ImageModel
:基礎圖形模型ShapeModel
:基礎形狀模型TextModel
:基礎文字模型
Enum
:各類列舉的定義(略)Utils
:其他工具(略)GameObject
:遊戲物件基類,所有物件都從這個類派生GameView
:除了遊戲主介面外的其他介面都由檢視基類派生
Game.EventHandler
:包含所有事件處理器Game.Manager
:包含了各類管理器,地圖、資源、資料、模型、事件等管理器Game.Object
:包含所有遊戲物件的定義Model
:包含所有遊戲模型的定義GameMap
:遊戲地圖物件Generator
:遊戲事件發生器
Game.View
:檢視包,包含所有檢視的定義Game
:全域性遊戲物件,使用單例模式建立Main
:遊戲主類Render
:核心渲染器,負責遊戲的渲染工作
圖形介面實現
為了開發這個遊戲,我先開發了一個基於JavaFX的遊戲引擎,引擎實現了從遊戲資源管理、模型定義,到畫面渲染等一系列功能,按照市面上現有的商業遊戲引擎的設計思路進行設計,“麻雀雖小,五臟俱全”,雖然無法匹敵其他成熟的遊戲引擎,但是就功能來說,是一應俱全的,能夠滿足大部分2D小遊戲的開發需要。
介面截圖
遊戲啟動畫面:
左上方是遊戲的logo,左下角顯示最高分記錄,下面是作者資訊和版本。 右下角是兩個按鈕,一個啟動遊戲按鈕,另一個退出按鈕。
遊戲主介面:
左上角是玩家頭像,當前得分,以及生命值;正上方是當前關卡; 畫面中央是大風車,大風車跟隨音樂節奏發射字母,玩家需要在字母飛出螢幕之前按下對應的字母才能得分。
遊戲暫停畫面
遊戲結束畫面
左下方顯示本局遊戲得分,以及是否打破最高分記錄。右下角顯示返回主介面按鈕。
開發心得
這是我第一次使用Java做遊戲開發,之前對Java這門語言的理解僅限於JavaEE做Web開發這方面,最近學習了JavaFX,用了一下,才發現原來JavaFX這麼好用,確實是專門為GUI設計的框架,只是用的人比較少,我在開發過程中遇到了很多問題,基本都找不到國內的資料,還好有萬能的StackOverFlow,另外,Oracle官網的文件也是挺詳細的,感謝~
對於我這樣寫習慣了Python這類動態語言的人來說,寫大量Java程式碼的感受就是,很繁瑣,但是很省心,不需要怎麼動腦,不用糾結這個引數是什麼型別,需不需要做強制型別檢查,一切都由IDE和JVM安排的明明白白,不需要我再去操心型別的問題,另外因為Java語法比較死板,沒有那麼多靈活的寫法,這既是缺點又是優點,缺點就是對於我這種喜歡炫技的人來說,寫Java程式碼沒有多少快感,但是優點是同樣的功能,實現的程式碼基本都差不多,不同的人來實現也不會有多大的差別,這就保證了程式碼的可維護性,可能現在用Python寫一個大專案,程式碼全都是揮灑飄逸,不拘一格,寫的時候很爽,但是等到後面重構的時候,完蛋了,看不懂之前的程式碼了,儘管有註釋,但不可能每一行程式碼都有註釋吧,靈活的寫法增加了理解難度,因此Java在大型專案的絕對統治地位不是空穴來風。
這次遊戲開發也加深了我對Java這門語言的理解,比如說反射,比如說事件,一開始在做事件處理部分的時候,讓我感到有點困惑的就是,Java既沒有委託、也沒有真正的“事件”這個概念,一切都是用介面和類實現,實現介面功能一般都是通過傳入實現某個事件介面的匿名類(當然在Java8裡可以使用lambda表示式),不過這也不是什麼大問題,這些問題都有其他方法可以解決,只不過寫起來比較繁瑣而已。可能我之前寫習慣了C#,所以寫Java程式碼的時候總是不由自主拿來對比,但是其實這兩種語言的可對比性不高,因為出生的年代都不一樣,C#在語言設計上確實是比Java高明得多,近年來Java的新版本或有或無的在模仿C#多年前的特性,比如說Java8的lambda表示式,Java11的var定義變數等。
此外,此次開發小遊戲讓我對Java的體會就是,語法很簡單,不像C#和C++那樣多而複雜,所以對於初學者而言特別友好,因為一學就會,配合上最好的IDE:IDEA,輕輕鬆鬆寫出各種專案,有一個說法是,因為Java語言本身的功能太少,所以出現了各種設計模式來補全Java語言的不足。
About
Learn more on my WeChat Official Account:DealiAxy
Every post was in my blog:blog.deali.cn
歡迎交流
交流問題請在微信公眾號後臺留言,每一條資訊我都會回覆哈~
- 微信公眾號:畫星星高手
- 打程式碼直播間:live.bilibili.com/11883038
- 知乎:www.zhihu.com/people/deal…
- 專欄:zhuanlan.zhihu.com/deali
- 簡書:www.jianshu.com/u/965b95853…