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次下载

MIT/Apache

98KB
72

Double_Dot_State是一个有用的Crate,用于在Rust中维护状态管理

它主要用于Bevy的状态管理,但很快将包括一个功能,使其适用于任何Rust项目,即不实现任何Bevy功能,仅检查状态转换是否有效。

Double_Dot_State能做什么

正确管理状态可能是一项繁重的任务。以下是一个状态图的示例

alt text

在这个例子中,存在线性状态转换和任意状态转换的混合。

有了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