Skip to content

bruceblink/Dual

Repository files navigation

Dual — 双人弓箭对战游戏

一款用 Java + Processing 4 编写的本地 / 联机双人(或人机)弓箭对战小游戏。两名角色在 640×640 的竞技场内互相射箭,用短弓快速骚扰、用长弓蓄力致命一击,先击杀对手者获胜。支持通过 Relay 服务器进行互联网联机对战。

游戏界面

游戏界面

游戏玩法

操控(玩家一,键盘)

按键 功能
↑ ↓ ← → 移动角色 / 蓄力长弓时调整瞄准方向
Z 发射短弓箭(自动瞄准,即时射出)
X 蓄力长弓;松开后射出长弓箭(需蓄力约 0.5 秒)
N 打开联机大厅(开房 / 加入房间)
P 暂停 / 继续
鼠标点击 显示 / 隐藏操作说明窗口

两种武器

  • 短弓:即时射出,自动指向对手,速度较慢,命中后击飞对手(不致命)。
  • 长弓:蓄力后射出高速分段箭矢,命中可直接击杀对手。两箭相撞均会碎裂。

游戏流程

  1. 启动后进入演示模式(双方均为 AI 对战)。
  2. Z 键开始正式对局(玩家控制白色角色,AI 控制黑色角色)。
  3. 任意一方被击杀后显示胜负结果,片刻后自动返回演示模式。
  4. N 键打开联机大厅,选择 Host(开房等待)或 Join(输入对方 IP 加入)。

联机对战

快速开始(局域网 / 互联网)

方式一:直连(同一局域网)

  1. 一方按 N → H 开房,记下显示的本机 IP。
  2. 另一方按 N → J,输入对方 IP(端口默认 7777)后按 Enter。
  3. 连接建立后自动进入联机对战。

方式二:通过 Relay 服务器(跨网络)

  1. 在公网机器上启动 Relay 服务:
    java -jar server/build/libs/dual-server-1.0-all.jar [port]
    # 默认端口 7777
  2. 双方均按 N → J,输入 Relay 服务器的公网 IP 与端口,依次连接即可配对。

构建 Relay 服务器

./gradlew :server:fatJar
# 输出:server/build/libs/dual-server-1.0-all.jar

Relay 服务器无图形界面,不依赖 Processing,可部署到任意 JDK 21+ 环境。

环境要求

依赖 版本
JDK 21(推荐 Oracle JDK 21)
Gradle 无需手动安装,使用内置 Wrapper

关于 JDK 路径gradle.properties 中的 org.gradle.java.installations.paths 指向本机 JDK 21 安装路径。 换台机器时,请将该路径改为实际路径,或删除该行并将 JAVA_HOME 环境变量指向 JDK 21。

运行方式

# 直接运行游戏(开发调试)
./gradlew run

# 构建 Relay 服务器 fat JAR
./gradlew :server:fatJar

# 启动 Relay 服务器
java -jar server/build/libs/dual-server-1.0-all.jar [port]

# 打包为 Windows 安装包(.exe,需要 WiX 3.x)
./gradlew packageApp

安装包输出到 build/dist/ 目录。

构建说明

# 编译并运行测试
./gradlew build

# 仅运行测试
./gradlew test

# 清理构建产物
./gradlew clean

项目结构

src/main/java/com/likanug/dual/
├── App.java                    # Processing 入口,键盘事件 / 联机大厅 UI
├── GameConstants.java          # 所有游戏数值常量
├── actor/                      # 角色与箭矢实体
│   ├── ActorGroup.java         # 一方阵营(玩家 + 箭矢列表)
│   ├── actor/
│   │   └── player/             # 玩家角色(PlayerActor, NullPlayerActor)
│   └── arrow/                  # 箭矢(短弓箭、长弓箭各组件)
├── game/
│   ├── GameSystem.java         # 游戏主循环、屏幕震动、粒子生成
│   └── GameBackground.java     # 背景线条渲染
├── inputDevice/                # 输入设备抽象(KeyInput, InputDevice)
├── network/                    # 联机网络层
│   ├── NetworkMessage.java     # 协议编解码
│   ├── GameNetwork.java        # P2P 网络基类(发送 / 接收输入)
│   ├── NetworkServer.java      # Host 模式(监听连接)
│   └── NetworkClient.java      # Join 模式(连接到 Host)
├── particle/                   # 粒子系统(对象池复用)
├── playerEngine/               # 玩家行为引擎(人类 / AI / 网络)
│   ├── NetworkPlayerEngine.java# 联机远端玩家驱动
│   └── *PlayerPlan.java        # AI 决策计划(移动、点射、蓄力击杀)
├── pool/                       # 泛型对象池(ObjectPool, Poolable)
└── state/                      # 状态机
    ├── GameSystemState.java    # 游戏系统状态基类
    ├── StartGameState.java     # 开始/倒计时状态
    ├── PlayGameState.java      # 对战状态(碰撞检测、胜负判定)
    ├── GameResultState.java    # 结果展示状态
    └── *PlayerActorState.java  # 玩家状态(移动、拉弓、受伤)

server/src/main/java/com/likanug/dual/server/
├── ServerApp.java              # Relay 服务器入口
├── RelayServer.java            # TCP accept 循环,多房间管理
├── RelayRoom.java              # 单个房间:握手 + 双向消息转发
└── NetworkProtocol.java        # 服务端协议常量

技术栈

  • Processing 4.5.0:渲染与窗口管理
  • Guava 32:工具库
  • JUnit 5:单元测试
  • jpackage + WiX 3:Windows 安装包打包

About

一个用Java的processing库写的小游戏

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors