Racing Game 3D
- 实用工具
- 版本: 1.0
- 激活: 20
# Racing Game 3D - 基于K线的3D赛车竞速游戏 🎮🏎️
`Racing_Game_3D` 是一款创新的 3D 赛车竞速游戏脚本。它运行在 MetaTrader 5 (MT5) 终端中。该游戏的核心亮点在于**利用当前交易品种的真实 K 线数据(开收盘价格)构建蜿蜒曲折的 3D 赛道**,并且集成了 DirectX 3D 渲染、道具交互、与 5 辆 AI 赛车实时竞速等丰富的游戏元素。
---
## 🌟 核心创意与游戏特色
1. **K线驱动的 3D 蜿蜒赛道 (K-Line 3D Track)**
* 游戏读取当前图表上的 K 线数据(排除了尚未走完的最新一根 K 线)。
* 每一根 K 线的实体涨跌幅百分比会被转化为赛道的弯道偏移量。**行情波幅越剧烈,赛道弯道也就越急、越险峻**。
* 内置向心力拉回机制,既产生极具动感的蛇形左右大弯道,又防止赛道无限偏移。
2. **原生 DirectX 渲染引擎 (DirectX 3D Rendering)**
* 游戏基于 MT5 的底层 `DXContext` 接口,配合顶点着色器(`Shaders/vertex.hlsl`)和像素着色器(`Shaders/pixel.hlsl`)进行高性能的 3D 着色渲染。
* 通过传递包含玩家坐标、AI 车坐标、局部路面偏移数组、可用道具及飞弹等状态的结构体(`PSInputBuffer`),在 GPU 中完成道路视角拉伸与特效计算。
3. **道具与战斗系统 (Power-Ups & Combat)**
* 赛道上每隔 30 米随机散落着三种不同属性的道具箱:
* 🟦 **蓝色箱 (Speed Boost)**:氮气加速状态,速度大幅提升,持续 3.0 秒。
* 🟥 **红色箱 (Trap)**:打滑陷阱,赛车打滑严重减速至 2 km/h 且方向失控,持续 1.5 秒。
* 🟨 **黄色箱 (Flame Shot)**:获得火焰弹,按 **[SHIFT]** 键可发射。
* 火焰弹会在轨道上自适应循迹飞行。一旦击中前方的车辆,会使其陷入 1.5 秒的失控减速状态。
4. **智能 AI 赛车竞速 (AI Competitors)**
* 玩家将与 5 辆由电脑控制的 AI 赛车同台竞技。
* AI 赛车拥有不同的基准速度,能自动在不同车道间规避和变道,去拾取有益的蓝色加速箱,甚至在与前车距离合适时,智能发射火焰弹袭击前车。
5. **真实的动态效果与物理限制 (Physics & Yaw Dynamics)**
* **车身 3D 偏角 (Yaw Angle)**:根据方向盘转向的灵敏度,实时计算车辆的倾斜与偏转角度,车头转向极富动感。
* **碰撞退回与摩擦**:车辆不能开出公路边界,撞到边界会受到摩擦阻力减速;如果与 AI 车辆发生碰撞,会产生推开效果并严重失控减速。
* **半透明 HUD 保护底板**:防止游戏中的明亮天空或草地干扰文字辨识。
---
## 🕹️ 游戏操作指南
* **↑**:油门加速。
* **↓**:刹车减速 / 倒车。
* **←** 和 **→**:向左 / 向右转向变道。
* **SHIFT**:发射火焰弹(需要已吃黄色道具箱,屏幕下方会显示“持有道具:火焰弹”)。
* **Enter (回车)**:重置比赛,重新开始。
* **ESC**:安全退出游戏,重新恢复 MT5 原图表窗口。
---
## 🛠️ 代码核心架构解析
1. **`rates[]` 数据转化与赛道构建**
* 从索引 1 开始通过 `CopyRates` 复制指定根数的 K 线数据。
* 通过 `rates[i].close - rates[i].open` 计算涨跌幅,并正比放大作为赛道左右弯曲变量写入全局 `RoadOffsets[]` 数组。
2. **`PSInputBuffer` 着色器传参**
* 将每帧的变量(如 resolution、时间、玩家车速/绝对位置、5辆AI车三维姿态、局部32组赛道偏移量、3组最近箱子数据、2组火焰弹位置)打包送入像素着色器。
3. **`UpdateGame(double dt)` 物理引擎**
* 更新氮气加速及打滑的倒计时,处理油门自然摩擦阻力。
* 计算玩家和 5 辆 AI 赛车最新的世界 X/Z 绝对位置。
* 实时调用 `GetRoadXCPU(z)` 获取赛道在指定纵深处的绝对 X 中心,以此判断边界阻挡(公路半宽为 `ROAD_HALF_WIDTH` 6.0米)。
* 处理玩家/AI 的火球射击判断,以及人车、车车碰撞体积判定。
* 判断终点线胜负(`FinishLineDistance`)。
4. **图形更新 (`DXDrawIndexed` + 位图重置)**
* 每帧清空深度缓存,更新像素着色器的时间轴输入,调用 `DXDrawIndexed` 完成底层 DirectX 渲染。
* 用 `DXContextGetColors` 把显存的渲染图导出到一维缓冲 `image[]`,并在 CPU 侧用 `TextOut` 叠写 HUD 赛程与状态,最后在图表生成位图标签。
---
## ⚙️ 参数配置
游戏在启动时提供了如下参数配置:
* **InputKLineCount** (`赛道K线数量`): 默认 `1000`。可自由增加或减少,代表了 3D 赛道的总长度。
* **CurveIntensity** (`弯道偏移强度`): 默认 `2.5`。数值越大,K 线涨跌引起的左右弯道越陡峭。
* **SegmentLength** (`段距`): 默认 `10.0`米。代表每根 K 线所延展的 3D Z 轴深度。
---
## 🚀 运行方法
1. 打开 MetaTrader 5。
2. 打开你想挑战的交易品种和周期(例如 GBPUSD, M15)。
3. 在左侧“导航”窗口中,找到 **脚本 (Scripts) -> My_Scripts -> 3D动画 -> Racing_Game_3D** 目录下的 `Racing_Game_3D`。
4. 双击或将其拖拽到当前的交易图表上。
5. 在参数窗口中配置你需要的关卡长度与弯道难度,点击“确定”。
6. 图表窗口将被赛车游戏画面覆盖。开始享受极速竞技吧!需要退出时按 **ESC** 键即可。
---

