Godot 的组织方式跟很多引擎不一样:不是「一个对象挂一堆组件」,而是「场景即节点树,场景可以再当节点塞进别的场景」。刚上手最别扭的就是这个,但想通了后面很顺。
这个项目按四个场景拆就够:
- Player:Area2D 作根,下面挂 AnimatedSprite2D、CollisionShape2D,再加一个屏幕尺寸相关的逻辑。
- Mob:同样 Area2D 作根,挂动画和碰撞体,出屏自己销毁。
- Main:Node 作根,下面放 Player 实例、几个 Timer、一个 Marker2D 或 Path2D 相关的生成位置、HUD 实例。
- HUD:CanvasLayer 作根,放分数标签、开始按钮、提示文字。
分场景的理由不是好看,是能单独跑、单独改。Player 场景按 F6 可以只跑它,调走路动画不用等敌人刷出来。改动 Player 之后,Main 里那个实例自动跟着变,不用手动同步。
文件怎么摆也有个朴素规矩:按类型分目录,别按「第几步」分。比如 scenes/、scripts/、assets/ 三四个文件夹,assets 里再分 images、fonts、audio。项目小的时候看不出差别,等素材上百个,按步骤命名的文件夹会让人找不到东西。
命名别用中文和空格。Godot 内部用 res:// 路径,大小写敏感,导出到某些平台后会出岔子。全小写加下划线最稳,比如 player.tscn、mob.gd。这个坑在导出那篇还会再提一次。
信号先在这里立个概念:节点之间不直接互相调函数,而是「发信号、连回调」。玩家碰到敌人发出 body_entered 或 area_entered,Main 接住再决定结束游戏。这样 Player 不需要知道 Main 存在,改起来互不牵连。刚开始会觉得多绕一层,等项目里节点上到几十个,就知道这层绕得值。
