-
记录工作实践
-
这是全新的系列,一直有个游戏制作梦
-
感谢AI时代,让这一切变得可行
-
长欢迎共同见证,期更新,欢迎保持关注,待到游戏上架那一天,一起玩
面向AI编程的godot独立游戏制作流程实录001
本期是第一篇 统领总纲
首先搞清楚大象长什么样子,也就是游戏是怎么跑起来的。
游戏开发的本质
一、指挥中心与部门
游戏是一个指挥中心(主循环),带着一群部门(功能模块)协同工作。
- 指挥中心(主循环):负责每秒发出指令,协调所有部门。
- 核心部门(核心模块):比如“玩家部门”“资源部门”“UI部门”,各自有自己的任务。
- 子部门(拓展功能):比如“建造小组”挂在“资源部门”下。
这个比喻的好处是:
- 强调协调性:指挥中心不自己干活,而是通过指令让各部门动起来。
- 突出通讯:部门之间通过“报告”和“请求”交流。
二、主循环如何与其他部分通讯?
你提到“主循环通过API调用各个核心模块”,这个理解方向是对的!让我们拆解一下实际的运作方式。
- 主循环的角色
主循环是游戏引擎(比如Godot)内置的“心脏”,它每帧(约1/60秒)运行一次,负责:
- 检查输入(玩家按键)。
- 更新状态(计算位置、资源)。
- 渲染画面。
在Godot中,主循环由引擎管理,你通过特定的函数“插入”你的代码,比如:
- _ready():游戏启动时运行一次。
- _process(delta):每帧运行,更新逻辑。
- _input(event):处理输入事件。
- 通讯的方式
主循环并不直接“写信”给每个模块,而是通过节点树(Node Tree)和函数调用来通讯。Godot的节点系统就像一个组织架构图:
- 主节点(指挥中心)是根节点。
- 子节点(部门)挂在主节点下。
通讯机制:
- 直接调用:主节点可以调用子节点的函数。
- 信号(Signal):子节点可以向上“报告”事件。
- 共享数据:通过变量在节点间传递信息。
- API和SDK的类比
-
API(应用程序接口):你可以把Godot的内置函数(比如move_and_slide())看作API。它们是主循环提供给你的“工具”,让你能指挥模块做事。
-
SDK(软件开发包):Godot整个引擎就是一个SDK,包含工具、函数、编辑器,帮助你开发游戏。
在你的游戏中,主循环通过这些“接口”调用核心模块,而不是手动写通讯代码。
三、实际代码中的通讯
让我们用一个简单例子,看看主循环如何与模块互动。
示例场景:采集游戏
- 主节点:Main.tscn,负责协调。
- 核心模块1:Player.tscn,控制玩家移动。
- 核心模块2:ResourceManager.tscn,管理资源。
- UI模块:UI.tscn,显示资源。
- 主脚本(指挥中心)
extends Node2D
var resources = {"wood": 0} # 共享数据
onready var player = $Player # 子节点:玩家部门
onready var resource_manager = $ResourceManager # 子节点:资源部门
onready var ui = $UI # 子节点:UI部门
func _ready():
print("指挥中心启动!")
func _process(delta):
player.update(delta) # 告诉玩家部门更新
ui.update(resources) # 告诉UI部门显示最新数据
func _input(event):
if event.is_action_pressed("ui_select"):
resource_manager.collect("wood", 1) # 通知资源部门加木材
- 玩家模块(Player.gd)
extends KinematicBody2D
var speed = 100
func update(delta):
var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
velocity.x += 1
move_and_slide(velocity * speed) # 使用Godot的API移动
- 资源模块(ResourceManager.gd)
extends Node
func collect(resource_type, amount):
get_parent().resources[resource_type] += amount # 更新主节点的共享数据
print("采集了", amount, resource_type)
- UI模块(UI.gd)
extends Control
func update(resources):
$Label.text = "木材: " + str(resources["wood"]) # 读取共享数据并显示
四、实际运作过程
- 主循环启动:
- Godot每帧调用Main.gd的_process(delta)。
- 通讯发生:
- player.update(delta)让玩家移动。
- 玩家点击鼠标,_input调用resource_manager.collect()加木材。
- ui.update(resources)刷新屏幕上的木材数量。
- 结果:
- 玩家感觉移动、采集、显示是“同时”发生的,因为主循环每秒跑60次。
文件关系
- 有多个文件(Main.gd、Player.gd、ResourceManager.gd、UI.gd)。
- 主循环通过节点引用($Player)或函数调用(collect())联系它们。
- 不需要手动写“API”,Godot的节点系统已经提供了通讯框架。