Godot扫雷游戏制作记录1——基础场景搭建

本游戏制作基于Godot4.6稳定版,windows11。

一、新建一个项目

打开Godot版本管理器,点击新建:

填写好项目名称,设置好项目路径后,点击创建:

创建好后,将自动打开编辑界面,本项目是2D游戏项目,点击上方"2D"切换为2D开发视角:

二、规范项目文件夹:

这步应该在第三步之前,我这里的顺序有点问题,先不需要管上方的场景里的已有内容。

在左侧下方的文件系统,右键"res://",创建三个文件夹,命名为"场景"、"代码"、"美术音乐资源":

全部完成后,我们的项目资源应该长这个样子:

三、创建主场景

在左侧场景面板中,点击"其他节点":

弹出的界面,找到并选择"Control"节点,点击创建,此时该节点会出现在左侧场景栏,右键选中该节点,并将其重命名为"main":

选中"main"节点,点击左上角加号添加子节点:

在弹出窗口中,找到"GridContainer"节点,点击添加:

创建好后,可以看到该节点被挂载在"main"节点下,成为其子节点。右键重命名为"grid":

在右侧"检查器"面板,找到"Columns"(列)属性,将其设置为10:

ctrl+s,保存当前场景至"场景"文件夹:

四、创建格子子场景

右键"场景"文件夹,新建一个场景:

弹出界面中,点击选取根节点类型:

找到"Control"节点,点击选取:

场景名称输入"tile",点击确定:

在新场景中,点击右上角加号创建子节点:

找到"ColorRect",点击创建:

在右侧检查器中,设置一个喜欢的颜色:

ctrl+s,保存场景。

五、在主场景中添加脚本:

双击文件系统中的"main.tscn",打开主场景。选中"main"节点,点击上方按钮为其添加一个脚本:

保持默认设置,在路径处,选择我们创建好的"代码"文件夹:

选择好后,点击创建:

此时,编辑器会自动打开代码编辑界面:

接下来,我们来完成代码:

python 复制代码
extends Control

# 常量定义
const GRID_SIZE = 10  # 网格大小为10x10
const TILE_SCENE = preload("res://场景/tile.tscn")  # 预加载格子场景

# 变量定义
var tiles: Array = []  # 存储所有格子节点

# 节点绑定
@onready var grid: GridContainer = $grid

func _ready():
	_init_grid()  # 初始化网格

# 初始化网格函数
func _init_grid():
	for i in range(GRID_SIZE * GRID_SIZE):
		# 实例化格子场景
		var tile = TILE_SCENE.instantiate()
		# 设置格子大小为50x50像素
		tile.custom_minimum_size = Vector2(50, 50)
		# 将格子添加到GridContainer中
		grid.add_child(tile)
		# 将格子存入数组,方便后续管理
		tiles.append(tile)

ctrl+s保存脚本。

六、代码详细解释

6.1 基础继承

python 复制代码
extends Control

声明这个脚本属于Control节点(主场景的根节点是 Control),脚本可以使用 Control 节点的所有属性和方法(比如添加子节点、设置布局等)。

6.2 常量定义

python 复制代码
const GRID_SIZE = 10  # 网格大小为10x10
  • const:关键字,表示这是 "常量",一旦定义就不能修改(比如后续代码里不能写GRID_SIZE = 15),适合存储固定的配置参数。
  • GRID_SIZE:变量名(大写是行业惯例,区分常量和普通变量),代表网格的行数 / 列数(10×10)。
  • 为什么用常量:如果后续想改成 9×9 或 16×16,只需要改这一行,不用改所有用到 "10" 的地方,方便维护。
python 复制代码
const TILE_SCENE = preload("res://场景/tile.tscn")  # 预加载格子场景
  • preload():Godot 的预加载函数,作用是 "提前加载场景文件到内存",避免运行时临时加载导致卡顿。
  • "res://场景/tile.tscn":场景文件的路径(res://是 Godot 的项目根目录),指向我们创建的 "单个格子" 场景。
  • 作用:把 tile.tscn 这个场景文件 "存" 到TILE_SCENE常量里,后续可以直接用它创建格子实例,不用每次都写路径。

6.3 普通变量

python 复制代码
var tiles: Array = []  # 存储所有格子节点
  • var:声明普通变量(可以修改)。
  • :Array:类型注解,明确这个变量是 "数组" 类型(Godot 4.x 推荐写类型注解,方便编辑器提示和排错)。
  • = []:初始化数组为空数组。
  • 核心作用:后续生成的 100 个格子节点都会存入这个数组,方便后续操作(比如给每个格子加点击事件、计算周围地雷数)------ 如果不存数组,后续想找到某个格子会非常麻烦。

6.4 节点绑定

python 复制代码
@onready var grid: GridContainer = $grid
  • @onready:关键注解!表示 "当节点准备好(_ready 函数执行前),再执行这个赋值"。如果没有@onready,直接写var grid = $grid,会因为节点还没加载完成导致grid为null(空),后续调用grid.add_child()会报错。
  • :GridContainer:类型注解,明确grid变量是GridContainer类型的节点。
  • $grid:节点路径简写,等价于get_node("grid"),作用是"找到当前节点下名为grid的子节点"(也就是我们创建的 GridContainer 节点)。
  • 作用:把场景里的 GridContainer 节点 "绑定" 到grid变量上,后续可以通过grid直接操作这个节点(比如添加子节点、设置列数)。

6.5 生命周期函数

python 复制代码
func _ready():
    _init_grid()  # 初始化网格
  • func:声明函数(方法)。
  • _ready():Godot 的内置生命周期函数,作用是 "当节点及其所有子节点都加载完成后,自动执行这个函数"------ 游戏启动后,这个函数是第一个执行的核心函数。
  • _init_grid():调用我们自定义的 "初始化网格" 函数,把核心逻辑拆到单独函数里,代码更清晰(避免所有逻辑都堆在_ready 里)。

6.6 核心函数

python 复制代码
func _init_grid():
    for i in range(GRID_SIZE * GRID_SIZE):
        # 实例化格子场景
        var tile = TILE_SCENE.instantiate()
        # 设置格子大小为50x50像素
        tile.custom_minimum_size = Vector2(50, 50)
        # 将格子添加到GridContainer中
        grid.add_child(tile)
        # 将格子存入数组,方便后续管理
        tiles.append(tile)

(1)循环生成100个格子 for i in range(GRID_SIZE * GRID_SIZE):

  • for i in range():循环语句,range(GRID_SIZE * GRID_SIZE)等价于range(100),会循环 100 次(i 从 0 到 99)。
  • GRID_SIZE * GRID_SIZE:10×10=100,代表需要生成 100 个格子,这样写比直接写range(100)更灵活(改 GRID_SIZE 后循环次数自动变)。

(2)创建格子实例 var tile = TILE_SCENE.instantiate():

  • instantiate():实例化函数,作用是 "把预加载的 Tile.tscn 场景变成可使用的节点实例"。相当于 "用 tile.tscn 这个'模板',打印出一个具体的格子节点",每次调用 instantiate () 都会生成一个新的格子。
  • var tile:临时变量,存储当前循环生成的这个格子实例。

(3)设置格子大小 tile.custom_minimum_size = Vector2(50, 50):

  • custom_minimum_size:Control 节点的属性,代表 "节点的最小尺寸",GridContainer 会根据这个尺寸自动排列格子。
  • Vector2(50, 50):Godot 的二维向量类型,这里代表 "宽度 50 像素,高度 50 像素"。
  • 作用:确保每个格子都是 50×50 的正方形,不会因为内容为空而缩成一条线。

(4)添加到网格容器 grid.add_child(tile):

  • add_child(tile):Node 节点的核心方法,作用是 "把 tile 这个节点添加为 grid 的子节点"。
  • 关键逻辑:GridContainer 会自动把所有子节点排成网格(因为我们之前设置了 Grid 的列数为 10),所以添加 100 个格子后,会自动排成 10 列、10 行的矩阵。

(5)存入数组 tiles.append(tile):

  • append(tile):数组的添加方法,把当前生成的格子实例存入tiles数组。
  • 核心意义:这一步是后续所有功能的基础!比如要给每个格子加点击事件、 要随机埋雷,都需要通过这个数组找到对应的格子。如果不存数组,后续想操作某个格子会非常困难。

六、运行测试

点击编辑器右上方开始按钮:

若我们没有提前选择一个主场景,系统会提示让我们选择一个主场景,我们点击选择当前即可:

可以看到一个窗口,里面是10×10的红色块矩阵,第一阶段开发已完成:

下一节,我们将完成鼠标的简单交互。

相关推荐
top_designer2 小时前
Magnific:老旧 UI 糊成马?720p 截图重铸 4K 界面
前端·游戏·ui·prompt·aigc·设计师·游戏策划
da_vinci_x17 小时前
Luma:手绘特效肝出血?“关键帧补全流”,两张图生成丝滑序列帧
游戏·3d·aigc·设计师·特效·游戏策划·游戏美术
爱搞虚幻的阿恺18 小时前
Niagara粒子系统-超炫酷的闪电特效(第二期 旋转的纸片)
游戏·游戏引擎·虚幻
WarPigs1 天前
Unity渲染问题记录
unity·游戏引擎
~央千澈~1 天前
抖音弹幕游戏开发之第9集:pyautogui进阶 - 模拟鼠标操作·优雅草云桧·卓伊凡
开发语言·python·游戏
陈天伟教授1 天前
人工智能应用- 搜索引擎:02. 搜索引擎发展史
人工智能·深度学习·神经网络·游戏·搜索引擎·机器翻译
dlpay1 天前
使用blender搭建模型并导入godot游戏引擎
游戏引擎·godot·blender
不是AI1 天前
【Unity开发】一、在安卓设备上运行Unity项目
android·unity·游戏引擎
haierccc1 天前
2026年贺新春:Reflexive Arcade 游戏合集下载
游戏