D-Fighter Arena 是一款基于 D 语言 (DLang)、raylib-d 图形库、PostgreSQL 数据库以及 SDLang 配置文件开发的 2D 横版格斗游戏。
游戏采用了**数据驱动战斗(Data-Driven Combat)**架构,角色的招式帧数据(前摇、判定、后摇帧与伤害值)完全由 PostgreSQL 数据库实时驱动,并支持对局结算自动落盘与胜率实时刷新。
- 编程语言:D Language (DLang)
- 游戏引擎/渲染绑定:
raylib-d(支持 60 FPS 锁帧渲染、音效与输入处理) - 配置文件格式:SDLang (
sdlang-d,D 语言原生描述性配置文件) - 数据库及驱动:PostgreSQL +
dpq2(基于 C 原生libpq的高性能驱动) - 项目构建与包管理:
DUB
street_d_fighter/
├── config/
│ └── game_config.sdl # 游戏窗口、帧率及数据库连接配置文件
├── source/
│ ├── app.d # 游戏主程序入口、主渲染循环 (60 FPS) 与对局控制
│ ├── config.d # SDLang 配置文件解析模块
│ ├── db.d # PostgreSQL 数据库交互模块 (使用 dpq2)
│ ├── fighter.d # 角色状态机、帧数据应用与 Hitbox/Hurtbox 逻辑
│ └── colors.d # 全局 Raylib 颜色定义模块
├── init.sql # PostgreSQL 数据库建表与初始数据脚本
├── dub.sdl # DUB 项目构建与第三方依赖声明文件
└── raylib.lib # Raylib C 静态库 (Windows 下编译所需)
在运行游戏前,请确保安装并启动了 PostgreSQL,并执行以下 SQL 初始化数据库:
-- 创建数据库(如不存在)
CREATE DATABASE fighting_game;
\c fighting_game;
-- 1. 角色属性与招式帧数据表(驱动战斗数值)
CREATE TABLE fighter_moves (
id SERIAL PRIMARY KEY,
character_name VARCHAR(50) NOT NULL,
move_name VARCHAR(50) NOT NULL,
startup_frames INT NOT NULL, -- 攻击前摇帧数
active_frames INT NOT NULL, -- 判定活跃帧数
recovery_frames INT NOT NULL, -- 收招后摇帧数
damage INT NOT NULL -- 招式伤害
);
-- 2. 玩家战绩表(驱动 UI 胜率)
CREATE TABLE player_profiles (
player_name VARCHAR(50) PRIMARY KEY,
wins INT DEFAULT 0,
losses INT DEFAULT 0
);
-- 插入测试招式数据 (Ryu 的重拳数据)
INSERT INTO fighter_moves (character_name, move_name, startup_frames, active_frames, recovery_frames, damage)
VALUES ('Ryu', 'HeavyPunch', 5, 8, 12, 120);
-- 插入初始玩家战绩
INSERT INTO player_profiles (player_name, wins, losses)
VALUES ('Player 1', 0, 0), ('Player 2', 0, 0)
ON CONFLICT DO NOTHING;游戏启动时会自动解析该文件:
// 窗口与显示配置
window {
title "D-Fighter Arena"
width 1280
height 720
fps 60 // 锁定 60 帧
}
// PostgreSQL 数据库连接配置
database {
host "127.0.0.1"
port 5432
user "postgres"
password "root" // 请修改为你本地 PostgreSQL 的密码
dbname "fighting_game"
}
- DMD 编译器 或 LDC2 编译器
- DUB 包管理器 (随 DMD 自动安装)
- PostgreSQL 运行环境
-
自动安装 Raylib C 静态库(项目根目录下运行):
dub run raylib-d:install
-
启动游戏:
dub run
| 玩家 | 动作 | 按键 |
|---|---|---|
| Player 1 (蓝) | 向左移动 / 向右移动 | A / D |
| Player 1 (蓝) | 重拳攻击 (Heavy Punch) | J |
| Player 2 (红) | 向左移动 / 向右移动 | ← / → (方向键) |
| Player 2 (红) | 重拳攻击 (Heavy Punch) | Numpad 1 (小键盘 1) |
| 通用 | 对局结束 (K.O.) 后重新开始 | R |
角色的出招物理属性完全由 PostgreSQL 数据库控制:
- 前摇帧 (Startup Frames):出招动画播放但尚无伤害判定。
- 活跃帧 (Active Frames):激活红色攻击判定盒 (
Hitbox)。 - 后摇帧 (Recovery Frames):攻击判定消失,处于招式收尾硬直期。
- 伤害值 (Damage):直接由 DB
damage字段赋值。
💡 热调节实验:在游戏运行过程中修改数据库中的招式数值:
UPDATE fighter_moves SET damage = 300, startup_frames = 2 WHERE move_name = 'HeavyPunch';重新打开游戏后,出招将变得极快且单次造成 300 点巨额伤害!
- 受击盒 (Hurtbox):绿色框线,跟随角色坐标同步。
- 打击盒 (Hitbox):红色框线,仅在招式的 活跃帧 内出现并参与 AABB 矩形碰撞判定。
- 局中任何一方生命值降为 0(K.O.)时,触发
dpq2事务自动更新数据库中的wins/losses。 - 结算后自动重新 SELECT 数据库,实时刷新界面顶部的胜率面板。