oxygengine_core/
state.rs

1use crate::{ecs::Universe, id::ID};
2use std::marker::PhantomData;
3
4pub enum StateChange {
5    None,
6    Push(Box<dyn State>),
7    Pop,
8    Swap(Box<dyn State>),
9    Quit,
10}
11
12pub trait State: Send + Sync {
13    fn on_enter(&mut self, _universe: &mut Universe) {}
14
15    fn on_exit(&mut self, _universe: &mut Universe) {}
16
17    fn on_pause(&mut self, _universe: &mut Universe) {}
18
19    fn on_resume(&mut self, _universe: &mut Universe) {}
20
21    fn on_process(&mut self, _universe: &mut Universe) -> StateChange {
22        StateChange::None
23    }
24
25    fn on_process_background(&mut self, _universe: &mut Universe) {}
26}
27
28impl State for () {}
29
30impl State for bool {
31    fn on_process(&mut self, _universe: &mut Universe) -> StateChange {
32        if *self {
33            StateChange::None
34        } else {
35            StateChange::Quit
36        }
37    }
38}
39
40impl State for usize {
41    fn on_process(&mut self, _universe: &mut Universe) -> StateChange {
42        if *self > 0 {
43            *self -= 1;
44            StateChange::None
45        } else {
46            StateChange::Quit
47        }
48    }
49}
50
51pub type StateToken = ID<PhantomData<dyn State + Send + Sync>>;