欢迎光临
我们一直在努力

BrotatoLike游戏制作(第一天)

        在Godot中从零搭建一个Brotato-like游戏的“脚手架”,核心在于建立一个松耦合、高复用的项目架构。这意味着像玩家、敌人、武器等各个模块应该是相互独立且可替换的,这能极大地方便后续调整、扩展和维护。

一、开始搭建之前先搞清楚两个概念

        松耦合:模块之间的依赖关系尽可能少、尽可能弱。一个模块的修改不会强制要求其他模块也修改。

 松耦合的好处

  • 你可以替换玩家角色而不需要修改敌人的代码。

  • 你可以修改 UI 布局而不担心武器系统崩溃。

  • 多人协作时,不同成员可以独立开发各自模块。

如何实现松耦合

  • 使用信号(Signal):子节点向上通知事件,而不是直接调用父节点的方法。

  • 使用组(Group):通过 

    get_tree().get_nodes_in_group("enemy")

     查找对象,而不是硬编码路径。

  • 依赖注入:通过 @export 变量在编辑器中赋值,而不是在代码中硬编码引用。

  • 使用 AutoLoad 单例:作为中介者,模块之间通过单例通信而不是直接交互。

  •         高复用:一个模块(脚本、场景、资源)可以在不同上下文或项目中重复使用,无需或仅需少量修改。

    高复用的好处

    • 你可以创建不同类型的敌人(近战、远程、Boss)而不用重复写移动、生命值、死亡逻辑。

    • 你可以把武器系统移植到另一个游戏。

    • 减少 bug:复用经过充分测试的模块。

    如何实现高复用

  • 使用组合而非继承:创建小的功能组件(如 HealthComponent、MovementComponent),挂载到不同实体上。

  • 数据与逻辑分离:用 Resource 文件存储数值(攻击力、速度等),脚本只负责行为。

  • 参数化:用 @export 暴露关键参数,方便调整而不改代码。

  • 场景继承:创建 BaseEnemy.tscn,然后通过继承创建 Goblin.tscn、Orc.tscn。

  • 在 Brotato-like 项目中的应用

            了解了基础概念之后开始搭建

    ⚙️ 核心设计原则

    • 场景驱动,继承复用:利用Godot的节点和场景系统创建独立的实体场景(如玩家、敌人),并通过继承来复用它们,实现模块化。

    • 资源驱动,数据分离:使用Godot的Resource文件(.tres)管理武器、道具等所有游戏数据,实现数据和逻辑的分离,便于数值调整。

    • 自上而下,信号传递:像GameManager这样的顶级管理器在ready()函数中获取子节点的引用,子节点则通过信号向上层传达事件,实现松耦合。

    • 组件化AI(可选):当基础状态机(Idle/Chase/Attack)无法满足复杂需求时,可引入BehaviorTree等节点来实现更高级的AI行为逻辑-。

          二、 接下来先搭建项目结构

    1. 顶层架构:Main场景 (Main.tscn)

    游戏的主控制中心,根节点是一个普通的Node。它负责承载游戏的世界地图和所有全局系统-。

    • GameWorld (Node2D): 作为游戏世界的容器,包含玩家、敌人等所有可见的游戏元素。

    • Spawner (Node): 挂载Spawner.gd脚本,负责控制敌人的波次与生成-1-3-27。

    • Player (CharacterBody2D): 实例化的玩家场景。

    • EnemyContainer (Node): 作为所有敌人实例的父节点,方便统一管理。

    • UI (CanvasLayer): UI层,确保界面始终显示在游戏内容之上。

    • Camera2D: 控制游戏视口,通常跟随玩家。

    2. 核心模块:游戏管理器

    创建几个关键的AutoLoad脚本,它们会在游戏启动时自动加载并全局可用,让各个系统能够方便地进行信息交换。

    • GameManager (全局): 管理游戏状态(开始/结束)、分数、波次、全局事件等。

    • PlayerStats (全局): 存储玩家的全局属性(生命值、攻击力、经验值等)。

    • AudioManager (全局): 统一控制音效和背景音乐的播放-3。

    • UIManager (可选): 如果需要跨场景更新UI,这个管理器会非常方便。

    3. 实体实现:Player & 敌人

    创建一个CharacterBody2D作为根节点,并为其添加必要的视觉和交互组件。

    • Player场景结构:

      • AnimationPlayer: 控制角色的行走动画和受伤闪烁。

      • CollisionShape2D: 角色的碰撞体,用于物理检测。

      • Area2D (名为PickupArea): 用于检测和拾取地上的经验值或道具。

      • WeaponContainer (Node): 作为武器节点的挂载点。

    • Enemy场景结构:

      • 根节点为CharacterBody2D,其下包含CollisionShape2D和Sprite2D。

      • StateMachine (Node): 挂载StateMachine.gd脚本,用于管理敌人的AI状态(如空闲、追逐、攻击)。

    4. 战斗系统:武器系统

    创建一个根节点为Node2D的武器场景。它的核心机制在于向最近敌人发射子弹,这可以通过检测EnemyContainer来实现。

    • Weapon.gd脚本:

      • attack(target: Node2D): 执行攻击逻辑。

      • _on_attack_timer_timeout(): 冷却结束后寻找攻击范围内最近的敌人。

    • Projectile场景 (可选):

      • 子弹可自带direction和speed属性,在移动时进行移动和碰撞检测。

    5. 交互系统:物品掉落
    • EXPOrb场景: 一个继承Area2D的小球体,用于提供经验值。

    • Pickup.gd脚本: 利用area_entered信号检测PickupArea,根据物品类型增加属性或经验值。

    6. 成长系统:升级面板 (UI)
    • UpgradePanel.tscn场景: 一个Control节点,通常包含三个代表随机升级选项的Button。

    • Upgrade.gd脚本: 通过Resource文件(.tres)定义升级选项的数据,如图标、描述、效果(增加多少生命值等),按钮点击后应用效果并关闭面板。

    赞(0)
    未经允许不得转载:171主机测评 » BrotatoLike游戏制作(第一天)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址