由单牌到多牌
在对单张牌建模之后,这一步将创建由这些牌组成的网格。要让网格成为游戏棋盘,你需要两个特性:
-
数据模型:在代码中作为模型创建的数组,其中每个元素描述牌的数据结构,例如:
- 图像的 URL
- 图像是否可见
- 玩家是否已解开这张牌。
-
创建牌的多实例的方式。
在 Slint 中,你使用方括号声明一个基于模型的结构体数组。使用 for 循环 来创建同一元素的多个实例。
for 循环是声明式的,并会在 模型变化时自动更新。该循环会实例化所有 MemoryTile 元素,并根据它们的 索引将它们放置到网格上,牌与牌之间留有间距。
首先,在 ui/app-window.slint 文件顶部添加牌的数据结构定义:
struct TileData { image: image, image_visible: bool, solved: bool,}接下来,将 ui/app-window.slint 文件底部的 _export component MainWindow inherits Window { … } 部分替换为以下内容:
export component MainWindow inherits Window { width: 326px; height: 326px;
in property <[TileData]> memory_tiles: [ { image: @image-url("icons/at.png") }, { image: @image-url("icons/balance-scale.png") }, { image: @image-url("icons/bicycle.png") }, { image: @image-url("icons/bus.png") }, { image: @image-url("icons/cloud.png") }, { image: @image-url("icons/cogs.png") }, { image: @image-url("icons/motorcycle.png") }, { image: @image-url("icons/video.png") }, ]; for tile[i] in memory_tiles : MemoryTile { x: mod(i, 4) * 74px; y: floor(i / 4) * 74px; width: 64px; height: 64px; icon: tile.image; open_curtain: tile.image_visible || tile.solved; // propagate the solved status from the model to the tile solved: tile.solved; clicked => { tile.image_visible = !tile.image_visible; } }}for tile[i]
in memory_tiles:
语法声明了一个变量 tile,它包含来自 memory_tiles 数组的一个元素的数据,
还声明了一个变量 i,即牌的索引。代码使用 i
索引,根据牌所在的行和列来计算其位置, 使用取模和整数除法来创建 4×4 网格。
运行这段代码会打开一个窗口,显示 8 张牌,玩家可以逐一打开它们。
© 2026 SixtyFPS GmbH