-
Notifications
You must be signed in to change notification settings - Fork 16
/
full.rs
144 lines (122 loc) · 3.53 KB
/
full.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#![allow(dead_code)]
use bevy::prelude::*;
use iyes_progress::prelude::*;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, States)]
enum AppState {
#[default]
Splash,
MainMenu,
GameLoading,
InGame,
}
fn main() {
App::new()
// Init bevy
.add_plugins(DefaultPlugins)
// Add our state type
.init_state::<AppState>()
// Add plugin for the splash screen
.add_plugins(
ProgressPlugin::new(AppState::Splash)
.continue_to(AppState::MainMenu)
.track_assets(),
)
// Add plugin for our game loading screen
.add_plugins(ProgressPlugin::new(AppState::GameLoading).continue_to(AppState::InGame))
// Load our UI assets during our splash screen
.add_systems(OnEnter(AppState::Splash), load_ui_assets)
// Our game loading screen
// systems that implement tasks to be tracked for completion:
.add_systems(
Update,
(
net_init_session.track_progress(),
world_generation.track_progress(),
internal_thing.track_progress(),
// we can also add regular untracked systems to our loading screen,
// like to draw our progress bar:
ui_progress_bar.after(TrackedProgressSet),
)
.run_if(in_state(AppState::GameLoading)),
)
.run();
}
#[derive(Resource)]
struct MyUiAssets {
ui_font: Handle<Font>,
btn_img: Handle<Image>,
}
fn load_ui_assets(
mut commands: Commands,
ass: Res<AssetServer>,
// we need to add our handles here, to track their loading progress:
mut loading: ResMut<AssetsLoading>,
) {
let ui_font = ass.load("font.ttf");
let btn_img = ass.load("btn.png");
// etc ...
// don't forget to add them so they can be tracked:
loading.add(&ui_font);
loading.add(&btn_img);
commands.insert_resource(MyUiAssets { ui_font, btn_img });
}
fn net_init_session(// ...
) -> Progress {
if my_session_is_ready() {
// we can convert a `bool` into a `Progress`
return true.into();
}
my_session_try_init();
false.into()
}
fn world_generation(
// ...
mut next_chunk_id: Local<u32>,
) -> Progress {
const N_CHUNKS: u32 = 16;
if *next_chunk_id < N_CHUNKS {
// every frame, do some work
gen_chunk(*next_chunk_id);
*next_chunk_id += 1;
}
// here we can return a `Progress` value that more accurately represents
// how much of our world map has been generated so far
Progress {
done: *next_chunk_id,
total: N_CHUNKS,
}
}
fn internal_thing(
// ...
) -> HiddenProgress {
// "hidden progress" allows us to report progress
// that is tracked separately, so it is counted for
// the state transition, but not for our user-facing
// progress bar
// Just wrap the usual `Progress` value in a `HiddenProgress`
HiddenProgress(internal_ready().into())
}
fn ui_progress_bar(
counter: Res<ProgressCounter>,
// ...
) {
// Get the overall loading progress
let progress = counter.progress();
// we can use `progress.done` and `progress.total`,
// or convert it to a float:
let _float_progress: f32 = progress.into();
// TODO: implement our progress bar
unimplemented!()
}
fn my_session_is_ready() -> bool {
unimplemented!()
}
fn my_session_try_init() {
unimplemented!()
}
fn gen_chunk(_id: u32) {
unimplemented!()
}
fn internal_ready() -> bool {
unimplemented!()
}