# 1. 测试环境
- JDK 1.8.0_191
- Maven 3.3.9
- JUnit 5.3.2
# 2. 主要特性
## 2.1 动画效果
- 不同于直接修改坐标使人物“瞬移”,使用 AnimationTimer 实现了人物的平滑移动(GIF)
![](https://www.writebug.com/myres/static/uploads/2021/10/31/bff29e86817fd3add0ebc8cee46492f6.writebug)
- 当人物的上、下、左、右任一方向有敌军的时候,人物会进入战斗状态(GIF)
![](https://www.writebug.com/myres/static/uploads/2021/10/31/2f8ecebd12a2625cc975f83a81a0a1f8.writebug)
## 2.2 用户交互
- 用户可以使用鼠标、键盘控制正方人物的移动。多个葫芦娃同时攻击一个敌人能以更小的代价消灭对方
- 游戏开始前会有操作提示(PNG)
![](https://www.writebug.com/myres/static/uploads/2021/10/31/a05cbe853ff151516e793df633faa5df.writebug)
- 画面上方以弹窗的形式通报当前游戏状态(GIF)
![](https://www.writebug.com/myres/static/uploads/2021/10/31/c32c43a5a709e8d89ccb316c5f3003f1.writebug)
## 2.3 其他
- 赋予蛇精一个额外的技能(模仿自[安琪拉](https://pvp.qq.com/web201605/herodetail/142.shtml)),每 20 秒有 50% 的几率触发。该技能威力较大,因此正方应尽快消灭蛇精。
## 2.4 完整流程(GIF,约 5MB)
该回放所用文件即为 `CalabashMan/record.xml`。
![](https://www.writebug.com/myres/static/uploads/2021/10/31/ac7823e4f41271a0fd56874a6e8ae539.writebug)
# 3. 系统框架
## 3.1 模块简介
| 包名 | 功能 |
| ------------- | -------------------------------------------------- |
| **app** | JavaFx 主类模块,定义 app 主循环 |
| **creature** | 生物体控制器模块,定义战场上所有生物体的属性与功能 |
| **field** | 战场控制器模块,定义战场的属性与功能 |
| **notificat** | 通知模块,定义顶部通知与屏幕中央的用户提示 |
| **ui** | UI 模块,定义多种 sprite 和图片资源加载器 |
| **control** | 操作模块,定义用户操作与系统操作,用于回放 |
| **io** | I/O 模块,用于游戏存档与回放 |
## 3.2 模块联系
- app 模块控制整个系统的主循环,其中的 class Main 最先被创建,其他模块都从这里开始直接或间接地被实例化。
- creature、field 和 notification 几个模块分别表示用户能看到的生物体、战场和通知,但这它们并不关注 ui 的细节,而是直接使用 ui 模块中封装好的如 CreatureSprite 等各种 UI 元素。creature 等模块只关注实体的行为和部分属性,并作为联系 io 与 ui 的桥梁。此处的实现尽量遵循 MVC 模式。
- control 和 io 模块主要提供数据持久化保存的服务。其中,control 定义了几种能影响游戏局势的 Action,io 模块负责这些 Action 的读写操作。
## 3.3 creature 模块
该模块的结构如下:
![](https://www.writebug.com/myres/static/uploads/2021/10/31/f08e1cd9593b097d3f3c4c9d585e8fd5.writebug)
- 所有的生物体都继承于 Creature 抽象类。Creature 类中定义了生物体所共有的属性和行为,如名字、外观(即 CreatureSprite)、移动操作等。
- 由于该游戏的方案是人机对战,因此将 Creature 细分为 PCCreature 和 PlayerCreature,其中前者“自动移动,用户不可操作”,后者“不自动移动,用户可操作”。
- 对于 PCCreature 和 PlayerCreature,又细分为葫芦娃、蛇精等具体的人物类。为了遵循现实规律,这些类都以单例模式(或类似)实现,后文会展开说明。
## 3.3 io 模块
- 由于存储文件选择了 XML 格式(后文有详细介绍),io 部分选择以 DOM 的方式读写。读操作的核心代码如下,写操作与此类似:
```java
List<Action> actions = new ArrayList<>();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(file);
NodeList actionNodeList = document.getDocumentElement().getElementsByTagName("action");
//由此开始,判断每个Action的类型并存储
```
## 3.4 ui 模块
- ui 模块主要设计了不同对象在屏幕上的外观,并封装好接口提供给控制器类调用。如,CreatruSprite 中定义了人物的形象和血条等素材,由于血条是跟随人物的,因此该类提供的 moveTo()中会将两者同时移动到相同位置,方便使用。
- 为了将图片资源统一管理,ImageLoader 中提供了一个静态方法 getImage(String name),在系统中使用到的所有素材都通过该方法读取,方便修改与维护。
# 4. 设计思路
## 4.1 设计模式
- **单例模式**:爷爷、蛇精、蝎子精三个类实际上都只对应于单一实体,由于其他功能限制此处没有使用枚举类型定义,但通过单例模式防止生成多个对象。基于相同的理由,葫芦娃、喽啰也采用了类似的模式,但在调用 `getInstance()` 时需要用一个参数指明具体对象的索引。在具体实现上,通过 synchronized 保证方法线程安全:
```java
public static GrandFather getInstance() {
if (gf == null) {
synchronized (GrandFather.class) {
if (gf == null) {
gf = new GrandFather(ImageLoader.getImage("GrandFather"), "爷爷");
}
}
}
return gf;
}
```
- **模版方法**:在通知模块中,由于子类既有公共的绘图,又各自有不同的操作,因此基类定义了抽象方法 abstract void afterDrawingText(),并在绘图方法的末尾调用。子类通过实现该方法来实现不同的功能。
## 4.2 动画实现
- 在系统中多处实现了动画效果(如移动、战斗、通知等),这些效果均通过 AnimationTimer 实现。以战斗为例,在 Creature 类中定义了内部类 FightingAnimationTimer,其通过旋转 sprite 实现人物的摆动,核心代码如下:
```java
@Override
public void handle(long now) {
Platform.runLater(() -> {
sprite.getProfileImage().setRotate(Math.sin(now / 100000000) * 20);
});
}
```
# 5. 游戏回放
游戏回放模块选用 XML 作为存储文件格式。在一局游戏中,局势主要由玩家操作与随机释放的技能决定,因此回放文件存储了所有用户操作与随机数结果。具体而言,在 control 模块中定义了 `abstract class Action`,由此具体实现了键盘操作 `KeyboardAction`、鼠标操作 `MouseAction` 和技能释放操作(实际上由随机数操控)`SkillAction`,最终将游戏过程抽象为 `List<Action>` 并存储在 XML 文件中。
文件样例:
```xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<game>
<action>
<type>MOUSE</type>
<time>582575441</time>
<x>100</x>
<y>329</y>
</action>
<action>
<type>KEYBOARD</type>
<time>731265155</time>
<keycode>D</keycode>
</action>
<action>
<type>SKILL</type>
<time>20120217225</time>
</action>
</game>
```
# 6. 测试
- 使用 JUnit,分别测试了单例模式的线程安全和文件读操作。其中前者在多个线程同时调用 GrandFather.getInstance(),的核心代码如下:
```java
@Test
public void grandFatherGetInstance(){
GrandFather base = GrandFather.getInstance();
for(int i=0;i<5;i++){
new Thread(()->{
GrandFather temp = GrandFather.getInstance();
assertTrue(temp == base);
}).start();
}
}
```
- 使用 Travis CI:[cjinchi/CalabashMan](https://travis-ci.com/cjinchi/CalabashMan)
# 7. 参考资料 & 素材来源
1、[Introduction to JavaFX for Game Development](https://gamedevelopment.tutsplus.com/tutorials/introduction-to-javafx-for-game-development--cms-23835)
2、[How to read and write xml files?](https://stackoverflow.com/a/7373596)
3、素材
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
app 模块控制整个系统的主循环,其中的 class Main 最先被创建,其他模块都从这里开始直接或间接地被实例化。 creature、field 和 notification 几个模块分别表示用户能看到的生物体、战场和通知,但这它们并不关注 ui 的细节,而是直接使用 ui 模块中封装好的如 CreatureSprite 等各种 UI 元素。creature 等模块只关注实体的行为和部分属性,并作为联系 io 与 ui 的桥梁。此处的实现尽量遵循 MVC 模式。 control 和 io 模块主要提供数据持久化保存的服务。其中,control 定义了几种能影响游戏局势的 Action,io 模块负责这些 Action 的读写操作。
资源推荐
资源详情
资源评论
收起资源包目录
100013065-基于JavaFx开发的葫芦娃游戏.zip (60个子文件)
huluwa-game-java
基于JAVA的葫芦娃游戏.pdf 888KB
.travis.yml 149B
pom.xml 1KB
image
main.png 431KB
move.gif 1005KB
full.gif 4.54MB
notification.gif 341KB
fight.gif 1.38MB
creature.png 21KB
src
test
java
io
RecordReaderTest.java 643B
creature
GrandFatherTest.java 667B
main
resources
fire.jpg 14KB
grass_dark.png 23KB
3.png 16KB
minion.png 17KB
1.png 15KB
select.png 589B
6.png 19KB
5.png 15KB
scorpion.png 15KB
4.png 17KB
intro.png 53KB
grandfather.png 14KB
hp.css 106B
snake.png 7KB
7.png 10KB
2.png 16KB
grass_light.png 24KB
java
notification
UpperNotificationController.java 2KB
MainNotificationController.java 2KB
NotificationController.java 630B
field
BattleField.java 5KB
app
Main.java 9KB
io
RecordWriter.java 3KB
RecordReader.java 3KB
ui
FireSkillSprite.java 2KB
BattleFieldSprite.java 1KB
ImageLoader.java 2KB
CreatureSprite.java 2KB
SelectOutlineSprite.java 885B
control
SkillAction.java 199B
Action.java 234B
KeyboardAction.java 369B
MouseAction.java 389B
creature
ScorpionMan.java 561B
SnakeWoman.java 3KB
Minion.java 714B
PCCreature.java 2KB
GrandFather.java 718B
Creature.java 7KB
PlayerCreature.java 2KB
CalabashMan.java 2KB
LICENSE 1KB
.idea
uiDesigner.xml 9KB
vcs.xml 180B
misc.xml 513B
inspectionProfiles
Project_Default.xml 257B
compiler.xml 532B
encodings.xml 135B
README.md 8KB
共 60 条
- 1
资源评论
神仙别闹
- 粉丝: 2667
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功