5个版本
0.2.1 | 2024年5月4日 |
---|---|
0.2.0 | 2024年5月3日 |
0.1.21 | 2023年12月29日 |
0.1.2 | 2023年12月29日 |
0.1.0 | 2023年12月28日 |
638 在 游戏开发 分类中
每月40次下载
98KB
72 行
Double_Dot_State是一个有用的Crate,用于在Rust中维护状态管理
它主要用于Bevy的状态管理,但很快将包括一个功能,使其适用于任何Rust项目,即不实现任何Bevy功能,仅检查状态转换是否有效。
Double_Dot_State能做什么
正确管理状态可能是一项繁重的任务。以下是一个状态图的示例
在这个例子中,存在线性状态转换和任意状态转换的混合。
有了DoubleState
宏,管理这种状态变得容易。
DoubleState
将自动实现Bevy中的States
。
你只需要定义你的状态枚举的线性或任意状态转换。
#[derive(Debug, Clone, Default, DoubleState)]
pub enum AppState {
#[default]
#[linear(MainMenu)]
Loading,
#[linear(Playing)]
#[arbitrary(Exit)]
MainMenu,
#[linear(Paused)]
Playing,
#[linear(Playing)]
#[arbitrary(MainMenu, Exit)]
Paused,
Exit
}
注意 如果你没有通过Default
派生宏定义默认状态,你会得到一个编译器错误。
DoubleState
派生宏将检查每个状态上放置的每个属性,以确定它们是否是有效的枚举字段。所以如果你将OptionMenu(它不存在)定义为从MainMenu到线性转换,你会得到一个编译器错误,告诉你“OptionMenu”在“AppState”中不存在。了解这一点可以减少运行时错误。
每个状态只能允许一个线性转换,但你可以定义无限数量的任意转换。
用法
在定义你的状态枚举后,通过double_dot_state添加到Bevy,使用来自double_dot_state的add_double_state()
方法,该方法添加到App
。
use bevy::prelude::*;
fn main() {
App::new()
// your implementation here
.add_double_state::<AppState>()
;
}
线性转换
在您的AppState进入系统后,例如在资源加载完成后,您可以过渡到MainMenu状态。
fn load_assets(
mut texture_atlases: ResMut<Assets<TextureAtlas>>,
mut next_state: EventWriter<DoubleStateEvent<AppState>>
) {
// load your assets
// transition into the next linear state defined in the enum type
next_state.send(DoubleStateEvent(DoubleStateTransition::Linear));
}
DoubleStateTransition::Linear
告诉double_dot_state您想要尝试从当前状态进行线性状态转换。
注意 如果没有为Loading(在这个例子中是当前的AppState)定义线性转换,将使用消息No linear transition found for "AppState::Loading"
引发panic。在这里panic很重要,因为这样的错误会使您的程序变得无用。了解这一点可以帮助您调试代码。
任意转换
如果您有一个可以转换到多个任意状态的状态,您可以转换到您想要的状态。
因此,如果您想从暂停状态过渡到MainMenu,可以这样做
fn pause_menu(
mut state: EventWriter<DoubleStateEvent<AppState>>
) {
// your pause menu implementation here
// if the user clicks Main Menu transition to MainMenu state
next_state.send(DoubleStateEvent(DoubleStateTransition::Arbitrary(AppState::MainMenu)));
}
DoubleStateTransition::Arbitrary
告诉double_dot_state您想要尝试从当前的AppState到新的AppState的任意转换。
注意 如果指定的转换不存在,将使用消息Arbitrary transition "MainMenu" not found for "AppState::Paused"
引发panic。在这里panic很重要,因为这样的错误会使您的程序变得无用。了解这一点可以帮助您调试代码。
许可证 根据您的选择,双重许可
Apache License,版本2.0,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)MIT许可证(LICENSE-MIT或https://opensource.org/licenses/MIT)。
贡献 除非您明确声明,否则通过GitHub仓库有意提交并包含在您的工作中的任何贡献,根据Apache-2.0许可证定义,应按上述方式双重许可,不附加任何额外的条款或条件。
依赖关系
~23MB
~429K SLoC