HOME / 第 7 部分 · 完整游戏项目实战 / 第 93 课
MODULE 7 · 完整游戏项目实战

第 93 课 · 太空射击完整项目(一):游戏框架

⏱ 预计时长 50 分钟📊 难度 进阶📚 模块 第 7 部分 · 完整游戏项目实战

🎯 本课学习目标

用 3 课做一个「完整可发布」的太空射击游戏,把之前学的技术全部串起来。

📖 详细教学步骤

项目规划设计

太空射击《星域猎手》规划:

  • 核心:驾驶飞船射击来袭陨石/敌舰
  • 功能:计分、生命、多波敌人、道具(三连发/护盾)、音效、特效、主菜单、存档、排行榜
  • 技术:粒子、相机震动、着色器、单例、JSON 存档

项目结构搭建

建立规范结构:

star_hunter/
├── scenes/ main.tscn menu.tscn player.tscn enemy.tscn bullet.tscn ui.tscn
├── scripts/ 对应脚本
├── autoload/ globals.gd audio.gd
├── assets/ images/ audio/ shaders/
└── data/ settings.json

单例准备代码

Globals 单例管全局状态:

GDSCRIPTextends Node

var score: int = 0
var best_score: int = 0
var lives: int = 3
var wave: int = 1

func reset_game():
    score = 0
    lives = 3
    wave = 1

func add_score(points: int):
    score += points
    if score > best_score:
        best_score = score

主菜单搭建

  1. menu.tscn:标题 + 开始/设置/排行榜/退出(第 37 课)
  2. 背景:滚动的星空(第 95 课做)
  3. 设为 Main Scene

玩家飞船搭建

  1. player.tscn:Area2D + 飞船图 + 碰撞 + 尾部粒子
  2. 移动(左右上下 + 限制边界)
  3. 自动射击(空格/自动)
  4. 三连发道具支持
GDSCRIPTextends Area2D

@export var speed: float = 400.0
var triple: bool = false
var fire_timer: float = 0.0

func _physics_process(delta):
    var dir = Input.get_vector("move_left", "move_right", "move_up", "move_down")
    global_position += dir * speed * delta
    clamp_position()
    fire_timer -= delta
    if Input.is_action_pressed("fire") or auto_fire:
        if fire_timer <= 0:
            fire_timer = 0.18
            shoot()

func shoot():
    if triple:
        # 三连发
        spawn_bullet(Vector2(0, -1))
        spawn_bullet(Vector2(-0.3, -1))
        spawn_bullet(Vector2(0.3, -1))
    else:
        spawn_bullet(Vector2(0, -1))

背景滚动星空特效

做滚动星空背景(动态感):

GDSCRIPTextends Node2D

@export var scroll_speed: float = 60.0
@onready var stars = $Stars   # 多层精灵

func _process(delta):
    # 让星空背景向下滚动
    stars.position.y += scroll_speed * delta
    if stars.position.y >= 240:
        stars.position.y = 0   # 循环

测试框架测试

  1. 菜单 → 开始 → 进入游戏场景
  2. 飞船移动、射击、背景滚动
  3. 下一课加敌人与道具

🎉 框架搭建完成!

⚠️
背景滚动有缝?

星空图上下需无缝循环(或两张图拼接),偏移量取整到图高。

⚠️
飞船飞出屏幕?

clamp_position 用 clampf 限制在视口内。

🧪 动手试一试

🏋️ 课后练习

完成框架:主菜单能进游戏,飞船八方向移动 + 自动射击,滚动星空背景。

第 37 课场景跳转 + 飞船脚本 + 背景循环。

💡

框架先行,功能后补——先让「菜单→游戏」闭环跑通。

💡

Globals 统一管分数/生命,后面所有系统都读它。

🎓 本课小结

太空射击框架:项目规划 + Globals 单例 + 主菜单 + 玩家飞船射击 + 滚动星空背景;「菜单→游戏」闭环打通。