赛车游戏应用


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 应用简介

赛车游戏是一款刺激的竞速类休闲游戏,玩家需要控制赛车在赛道上行驶,躲避障碍车辆,收集金币,挑战最高分数。游戏采用简洁的操控方式,玩家只需点击屏幕左右两侧即可控制赛车左右移动,适合各年龄段玩家。

游戏提供多种赛车和赛道选择,每种赛车拥有不同的速度和操控属性,每种赛道具有独特的视觉风格。随着游戏进行,速度会逐渐增加,考验玩家的反应能力和操作技巧。

1.2 核心功能

功能模块功能描述实现方式
赛车选择5种不同类型赛车枚举 + 选择界面
赛道选择5种不同风格赛道枚举 + 主题切换
游戏控制点击/滑动控制赛车GestureDetector
障碍系统随机生成障碍车辆Timer + 随机算法
金币收集收集金币获得分数碰撞检测
速度递增随时间增加难度动态速度调整
记录系统游戏分数记录数据模型存储

1.3 赛车类型

赛车英文标识颜色速度操控
运动跑车sports蓝色★★★☆☆★★★★☆
肌肉车muscle橙色★★★★☆★★☆☆☆
超级跑车supercar红色★★★★★★★★★★
F1赛车f1绿色★★★★★★★★★★★★
拉力赛车rally黄色★★★★☆★★★★★

1.4 赛道类型

赛道英文标识背景色道路色风格
城市赛道city深蓝色灰蓝色都市夜景
沙漠赛道desert暗黄色土黄色荒漠公路
森林赛道forest深绿色墨绿色林间小道
山地赛道mountain棕色土棕色山区公路
夜间赛道night深黑色深灰色午夜狂飙

1.5 技术栈

技术领域技术选型版本要求
开发框架Flutter>= 3.0.0
编程语言Dart>= 2.17.0
设计规范Material Design 3-
状态管理setState-
目标平台鸿蒙OSAPI 21+

1.6 项目结构

lib/
└── main_racing_game.dart
    ├── RacingGameApp            # 应用入口
    ├── CarType                  # 赛车类型枚举
    ├── TrackType                # 赛道类型枚举
    ├── GameRecord               # 游戏记录模型
    ├── MainMenuPage             # 主菜单页面
    ├── CarSelectPage            # 赛车选择页面
    ├── GamePage                 # 游戏主页面
    ├── RoadPainter              # 道路绘制器
    └── RecordsPage              # 记录页面

二、系统架构

2.1 整体架构图

Game Logic

Data Layer

Presentation Layer

主菜单页

赛车选择页

游戏页面

记录页面

CarType
赛车枚举

TrackType
赛道枚举

GameRecord
记录模型

游戏循环
_gameTimer

碰撞检测
_checkCollision

障碍生成
_spawnObstacle

金币生成
_spawnCoin

2.2 类图设计

navigates

starts game

uses

uses

creates

contains

RacingGameApp

+Widget build()

MainMenuPage

+Widget build()

-void _showHelp()

CarSelectPage

-CarType _selectedCar

-TrackType _selectedTrack

+Widget build()

GamePage

-double _carX

-double _speed

-int _score

-int _distance

-bool _gameOver

-List _obstacles

-List _coins

-Timer _gameTimer

+Widget build()

-void _startGame()

-void _updateGame()

-void _endGame()

-void _spawnObstacle()

-void _spawnCoin()

-bool _checkCollision()

«enumeration»

CarType

sports

muscle

supercar

f1

rally

+String name

+Color color

+int speed

+int handling

«enumeration»

TrackType

city

desert

forest

mountain

night

+String name

+Color backgroundColor

+Color roadColor

GameRecord

+String id

+int score

+int distance

+CarType carType

+TrackType trackType

+DateTime date

2.3 游戏流程图

碰撞障碍

无碰撞

收集

未收集

达到条件

未达到

开始游戏

选择赛车

选择赛道

游戏开始

游戏循环

更新位置

生成障碍

生成金币

碰撞检测

游戏结束

收集金币

加分

继续

速度递增

加速

显示结果

重新开始?

返回主菜单

2.4 碰撞检测流程

游戏状态金币列表障碍物列表碰撞检测游戏循环游戏状态金币列表障碍物列表碰撞检测游戏循环alt[收集金币]alt[发生碰撞][无碰撞]遍历障碍物检测每个障碍计算边界框判断是否重叠触发游戏结束遍历金币检测每个金币增加分数

三、核心模块设计

3.1 数据模型设计

3.1.1 赛车类型枚举 (CarType)
enum CarType {
  sports,      // 运动跑车
  muscle,      // 肌肉车
  supercar,    // 超级跑车
  f1,          // F1赛车
  rally,       // 拉力赛车
}

extension CarTypeExtension on CarType {
  String get name;      // 中文名称
  Color get color;      // 赛车颜色
  int get speed;        // 速度属性(1-6)
  int get handling;     // 操控属性(1-6)
}
3.1.2 赛道类型枚举 (TrackType)
25%20%20%20%15%赛道风格分布城市赛道沙漠赛道森林赛道山地赛道夜间赛道
赛道背景色道路色视觉效果
城市#1A1A2E#333344都市霓虹
沙漠#2D2D0A#4A4A2A黄沙漫天
森林#0A2D0A#2A4A2A绿树成荫
山地#2D1A0A#4A3A2A崇山峻岭
夜间#050510#1A1A2A星光璀璨
3.1.3 游戏记录模型 (GameRecord)
class GameRecord {
  final String id;                    // 唯一标识
  final int score;                    // 得分
  final int distance;                 // 行驶距离
  final CarType carType;              // 使用赛车
  final TrackType trackType;          // 使用赛道
  final DateTime date;                // 游戏日期
}

3.2 页面结构设计

3.2.1 主菜单页面

主菜单页

游戏标题

开始游戏按钮

游戏记录按钮

游戏说明按钮

赛车图标

中英文标题

跳转赛车选择

跳转记录页面

显示帮助弹窗

3.2.2 赛车选择页面

赛车选择页

赛车列表

属性显示

赛道选择

开始比赛按钮

横向滚动5种赛车

速度条

操控条

网格布局5种赛道

3.2.3 游戏主页面

点击暂停

继续游戏

碰撞障碍

显示结果

游戏初始化

游戏进行中

暂停

游戏结束

3.3 游戏逻辑设计

3.3.1 核心状态变量
class _GamePageState extends State<GamePage> with TickerProviderStateMixin {
  // 赛车位置
  double _carX = 0;
  
  // 游戏状态
  double _speed = 3;              // 当前速度
  int _score = 0;                 // 当前分数
  int _distance = 0;              // 行驶距离
  bool _gameOver = false;         // 游戏结束标志
  bool _paused = false;           // 暂停标志
  
  // 游戏对象
  final List<Map<String, dynamic>> _obstacles = [];  // 障碍物列表
  final List<Map<String, dynamic>> _coins = [];      // 金币列表
  
  // 定时器
  late Timer _gameTimer;          // 游戏主循环定时器
  late AnimationController _roadAnimationController; // 道路动画
}
3.3.2 游戏循环逻辑
void _updateGame() {
  setState(() {
    // 更新距离
    _distance++;
    
    // 每100距离加速
    if (_distance % 100 == 0) {
      _speed += 0.2;
      _score += 10;
    }
    
    // 更新障碍物位置
    for (var obstacle in _obstacles) {
      obstacle['y'] += _speed;
    }
    
    // 移除屏幕外的障碍物
    _obstacles.removeWhere((o) => o['y'] > 700);
    
    // 随机生成新障碍物
    if (_random.nextDouble() < 0.02) {
      _spawnObstacle();
    }
    
    // 碰撞检测
    for (var obstacle in _obstacles) {
      if (_checkCollision(obstacle)) {
        _endGame();
        return;
      }
    }
  });
}

四、UI设计规范

4.1 配色方案

应用采用深色主题设计,营造赛车游戏的紧张氛围:

颜色类型色值用途
主色#F44336 (Red)按钮、强调元素
背景色#0A0A0A页面背景
卡片背景#1E1E1E卡片、弹窗
文字主色#FFFFFF主要文字
文字次色#B0BEC5次要文字

赛车专属颜色:

// 运动跑车 - 蓝色
Colors.blue

// 肌肉车 - 橙色
Colors.orange

// 超级跑车 - 红色
Colors.red

// F1赛车 - 绿色
Colors.green

// 拉力赛车 - 黄色
Colors.yellow

4.2 字体规范

元素字号字重颜色
游戏标题48pxBold#FFFFFF
得分显示18pxBold#FFFFFF
距离显示18pxBold#FFFFFF
速度显示12pxRegular#FF5252
按钮文字20pxBold#FFFFFF

4.3 组件规范

4.3.1 赛车卡片
┌─────────────────────┐
│        🚗          │
│     运动跑车        │
│   速度: ★★★☆☆     │
│   操控: ★★★★☆     │
└─────────────────────┘
4.3.2 游戏界面布局
┌─────────────────────────────────────────────────┐
│  得分: 1000                    150 m           │
│  速度: 3.5x                                     │
│                                                 │
│     │         🚗          │                    │
│     │    💰              │                    │
│     │         🚙         │                    │
│     │    🚙              │                    │
│     │         💰    🚗   │                    │
│     │                    │                    │
│     │         🚙         │                    │
│     │    🚗              │                    │
│     │         🚗         │   ← 玩家赛车       │
│     │              🚗    │                    │
│     │                    │                    │
└─────────────────────────────────────────────────┘
4.3.3 游戏结束弹窗
┌─────────────────────────────────────────────────┐
│                                                 │
│              游戏结束                           │
│                                                 │
│              得分: 1500                        │
│              距离: 200 米                      │
│                                                 │
│         [再来一次]    [返回主菜单]             │
│                                                 │
└─────────────────────────────────────────────────┘

五、核心功能实现

5.1 游戏控制

void _moveCar(double delta) {
  setState(() {
    // 限制赛车在道路范围内移动
    _carX = (_carX + delta).clamp(
      -roadWidth / 2 + carWidth / 2,
      roadWidth / 2 - carWidth / 2
    );
  });
}

// GestureDetector 处理
GestureDetector(
  onHorizontalDragUpdate: (details) {
    _moveCar(details.delta.dx * 0.8);  // 滑动控制
  },
  onTapDown: (details) {
    final x = details.globalPosition.dx;
    if (x < screenWidth / 2) {
      _moveCar(-15);  // 点击左侧向左移动
    } else {
      _moveCar(15);   // 点击右侧向右移动
    }
  },
)

5.2 障碍物生成

void _spawnObstacle() {
  // 定义车道位置
  final lanes = [-0.6, -0.2, 0.2, 0.6];
  
  // 随机选择车道生成障碍物
  _obstacles.add({
    'x': lanes[_random.nextInt(lanes.length)],
    'y': -100.0,  // 从屏幕上方出现
    'type': _random.nextInt(3),  // 随机类型
  });
}

5.3 碰撞检测

bool _checkCollision(Map<String, dynamic> obstacle) {
  // 计算赛车边界
  final carLeft = _carX - carWidth / 2;
  final carRight = _carX + carWidth / 2;
  final carTop = 500.0;
  final carBottom = 500.0 + carHeight;

  // 计算障碍物边界
  final obsLeft = obstacle['x'] * roadWidth / 2 - obstacleWidth / 2;
  final obsRight = obstacle['x'] * roadWidth / 2 + obstacleWidth / 2;
  final obsTop = obstacle['y'];
  final obsBottom = obstacle['y'] + obstacleHeight;

  // 矩形碰撞检测
  return !(carRight < obsLeft ||
      carLeft > obsRight ||
      carBottom < obsTop ||
      carTop > obsBottom);
}

5.4 道路绘制

class RoadPainter extends CustomPainter {
  final double roadLeft;
  final double roadWidth;
  final Color roadColor;
  final double offset;

  
  void paint(Canvas canvas, Size size) {
    // 绘制道路背景
    final roadPaint = Paint()..color = roadColor;
    canvas.drawRect(
      Rect.fromLTWH(roadLeft, 0, roadWidth, size.height),
      roadPaint,
    );

    // 绘制道路边界
    final borderPaint = Paint()
      ..color = Colors.red
      ..strokeWidth = 5;
    canvas.drawLine(
      Offset(roadLeft, 0),
      Offset(roadLeft, size.height),
      borderPaint,
    );

    // 绘制车道分隔线(虚线效果)
    for (double y = -50 + (offset % 50); y < size.height; y += 50) {
      canvas.drawLine(
        Offset(roadLeft + roadWidth / 2, y),
        Offset(roadLeft + roadWidth / 2, y + 25),
        linePaint,
      );
    }
  }
}

六、游戏机制

6.1 得分系统

得分来源

距离得分

金币得分

速度加成

每100距离 +10分

每个金币 +50分

速度越快分数越高

6.2 难度递增

距离速度倍数难度描述
0-1003.0x初始速度
100-2003.2x轻微加速
200-3003.4x中等加速
300-4003.6x较快加速
400+持续增加极限挑战

6.3 车道系统

道路宽度 200px

车道1: -0.6

车道2: -0.2

车道3: 0.2

车道4: 0.6

玩家赛车

可在车道间自由移动

障碍物

随机出现在某一车道

金币

随机出现在某一车道


七、扩展功能规划

7.1 后续版本规划

2024-01-072024-01-142024-01-212024-01-282024-02-042024-02-112024-02-182024-02-252024-03-032024-03-102024-03-172024-03-24核心游戏 赛车选择 赛道选择 道具系统 排行榜 成就系统 多人对战 自定义赛车 云端存档 V1.0 基础版本V1.1 增强版本V1.2 进阶版本赛车游戏开发计划

7.2 功能扩展建议

7.2.1 道具系统

游戏道具增强体验:

  • 护盾:免疫一次碰撞
  • 加速:短时间内加速冲刺
  • 磁铁:自动吸引附近金币
  • 减速:暂时降低游戏速度
7.2.2 成就系统

解锁游戏成就:

  • 首次游戏
  • 行驶1000米
  • 收集100金币
  • 连续游戏7天
7.2.3 多人对战

实时竞技功能:

  • 匹配对手
  • 实时竞速
  • 排位积分

八、注意事项

8.1 开发注意事项

  1. Timer管理:游戏结束时及时取消Timer

  2. 碰撞检测:使用矩形碰撞,注意边界计算

  3. 性能优化:移除屏幕外的游戏对象

  4. 状态管理:游戏状态变更时更新UI

8.2 常见问题

问题原因解决方案
赛车越界位置未限制使用clamp限制范围
碰撞不准边界计算错误检查碰撞检测逻辑
游戏卡顿对象未清理移除屏幕外对象

8.3 游戏提示

🏎️ 游戏小贴士 🏎️

保持专注,提前预判障碍物位置。
收集金币可以获得额外分数。
速度会随时间增加,做好准备。
选择适合自己风格的赛车。


九、运行说明

9.1 环境要求

环境版本要求
Flutter SDK>= 3.0.0
Dart SDK>= 2.17.0
鸿蒙OSAPI 21+

9.2 运行命令

# 查看可用设备
flutter devices

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_racing_game.dart

# 运行到Windows
flutter run -d windows -t lib/main_racing_game.dart

# 代码分析
flutter analyze lib/main_racing_game.dart

十、总结

赛车游戏应用通过简洁的操控方式、丰富的赛车选择和多样的赛道风格,为玩家提供了一个刺激有趣的竞速体验。游戏采用深色主题设计,营造紧张刺激的赛车氛围;核心玩法简单易懂,适合各年龄段玩家;难度递增机制保证游戏的挑战性和可玩性。

核心功能涵盖5种赛车和5种赛道,每种赛车拥有独特的速度和操控属性,每种赛道具有独特的视觉风格。游戏中的障碍物随机生成,金币收集增加趣味性,速度递增机制提供持续的挑战。

通过本游戏,希望能够为玩家带来紧张刺激的赛车体验,在指尖感受速度与激情的魅力。

速度与激情,尽在指尖

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐