嵌套结构体 - 城堡数据结构体
在上一课中,我们学会了如何创建一个结构体并创建了表示城堡对象的 "Castle" 结构体。 在 Move Castle 游戏中,城堡配备了特定的游戏数据。本课中,我们将深入创建一个单独的城堡数据结构体,并探讨嵌套结构体的概念。
为了在 Sui 的 Move 中方便地使用嵌套结构体,一种常见做法是“包装”。在这种方法中,定义了外层的“包装”结构体 CastleData。
以下是在 sources/
下创建 core.move
模块,其中介绍了 CastleData 结构体,并填充了基本的游戏属性:
module move_castle::core {
use sui::object::{Self, UID, ID};
public struct CastleData has store {
id: ID,
size: u64,
race: u64,
level: u64,
experience_pool: u64,
}
}
与我们在 Castle 结构体中使用的 UID 不同,ID 不是全局唯一的,您可以从 UID 创建 ID,并且 ID 可以被复制和丢弃。有关详细信息,请查看 sui-framework
中 object.move
的源代码。
Move 2024.beta 版自动包含 sui::object
模块的别名。这意味着您可以从代码中删除 use sui::object::{Self, UID, ID};
这一行。
在游戏机制中,城堡的核心属性包括尺寸、种族、等级和升级所需的经验池。
还有两个核心方面:经济和战斗机制。
让我们创建 Economy
结构体:
public struct Economy has store {
treasury: u64,
base_power: u64,
settle_time: u64
}
将 economy
字段集成到现有的 CastleData 结构体中:
public struct CastleData has store {
id: ID,
size: u64,
race: u64,
level: u64,
experience_pool: u64,
economy: Economy,
}
现在,将 CastleData
结构体扩展以包括用于战斗机制的 Millitary
结构体:
public struct CastleData has store {
id: ID,
size: u64,
race: u64,
level: u64,
experience_pool: u64,
economy: Economy,
millitary: Millitary,
}
public struct Millitary has store {
attack_power: u64,
defense_power: u64,
total_attack_power: u64,
total_defense_power: u64,
soldiers: u64,
battle_cooldown: u64,
}
对于更复杂的情况,您可以更深入地嵌套结构体。向 Economy
结构体添加两个额外字段:
use std::vector;
public struct Economy has store {
treasury: u64,
base_power: u64,
settle_time: u64,
soldier_buff: EconomicBuff,
}
public struct EconomicBuff has copy, store, drop {
debuff: bool,
power: u64,
start: u64,
end: u64,
}
您是否注意到这里引入了一个 vector
?这是 Move 语言提供的集合支持。我们将在下一课中深入探讨其用法。顺便提一下,std::vector
模块也是默认提供的。