Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🥊 D-Fighter Arena (D语言横版格斗游戏)

D-Fighter Arena 是一款基于 D 语言 (DLang)raylib-d 图形库、PostgreSQL 数据库以及 SDLang 配置文件开发的 2D 横版格斗游戏。

游戏采用了**数据驱动战斗(Data-Driven Combat)**架构,角色的招式帧数据(前摇、判定、后摇帧与伤害值)完全由 PostgreSQL 数据库实时驱动,并支持对局结算自动落盘与胜率实时刷新。


🛠️ 技术栈 (Tech Stack)

  • 编程语言: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 下编译所需)

🗄️ 1. 数据库初始化 (init.sql)

在运行游戏前,请确保安装并启动了 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;

⚙️ 2. 游戏配置文件 (config/game_config.sdl)

游戏启动时会自动解析该文件:

// 窗口与显示配置
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"
}

🚀 3. 编译与运行步骤

环境要求

  1. DMD 编译器LDC2 编译器
  2. DUB 包管理器 (随 DMD 自动安装)
  3. PostgreSQL 运行环境

编译运行步骤

  1. 自动安装 Raylib C 静态库(项目根目录下运行):

    dub run raylib-d:install
  2. 启动游戏

    dub run

🎮 4. 操作指南 (Controls)

玩家 动作 按键
Player 1 (蓝) 向左移动 / 向右移动 A / D
Player 1 (蓝) 重拳攻击 (Heavy Punch) J
Player 2 (红) 向左移动 / 向右移动 / (方向键)
Player 2 (红) 重拳攻击 (Heavy Punch) Numpad 1 (小键盘 1)
通用 对局结束 (K.O.) 后重新开始 R

💡 5. 核心架构亮点 (Core Features)

① 数据驱动战斗 (Data-Driven Combat)

角色的出招物理属性完全由 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 点巨额伤害!

② 判定盒碰撞系统 (Hitbox / Hurtbox)

  • 受击盒 (Hurtbox):绿色框线,跟随角色坐标同步。
  • 打击盒 (Hitbox):红色框线,仅在招式的 活跃帧 内出现并参与 AABB 矩形碰撞判定。

③ 实时战绩落盘与 UI 刷新

  • 局中任何一方生命值降为 0(K.O.)时,触发 dpq2 事务自动更新数据库中的 wins / losses
  • 结算后自动重新 SELECT 数据库,实时刷新界面顶部的胜率面板。

About

No description or website provided.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages