1#include <scene_management.h>
2#include <iostream>
3#include <string>
4
5
6
7
8
9struct ActiveScene { };
10struct SceneRoot { };
11
12
14struct MenuScene { Pipeline pip; };
15struct GameScene { Pipeline pip; };
16
17
18struct Position { float x, y; };
19struct Button { std::string text; };
20struct Character { bool alive; };
21struct Health { int amount; };
22
23
24
26 ecs.delete_with(flecs::ChildOf, ecs.
entity<SceneRoot>());
27}
28
29void menu_scene(
flecs::iter& it,
size_t, ActiveScene) {
30 std::cout << "\n>> ActiveScene has changed to `MenuScene`\n\n";
31
34
35 reset_scene(ecs);
36
37
38
40 .set(Button{ "Play the Game!" })
41 .set(Position{ 50, 50 })
42 .child_of(scene);
43
45}
46
47void game_scene(
flecs::iter& it,
size_t, ActiveScene) {
48 std::cout << "\n>> ActiveScene has changed to `GameScene`\n\n";
49
52
53 reset_scene(ecs);
54
55
56
58 .set(Character{ })
59 .set(Health{ 2 })
60 .set(Position{ 0, 0 })
61 .child_of(scene);
62
64}
65
67
68
70 .add(flecs::Exclusive);
71
72
73
74
76 .with(flecs::System)
77 .without<GameScene>()
78
79
80 .build();
81
83 .with(flecs::System)
84 .without<MenuScene>()
85 .build();
86
87
88
89 ecs.set<MenuScene>({ menu });
90 ecs.set<GameScene>({ game });
91
92
93
94 ecs.
observer<ActiveScene>(
"Scene Change to Menu")
96 .second<MenuScene>()
98
99
100
101 ecs.
observer<ActiveScene>(
"Scene Change to Game")
103 .second<GameScene>()
105}
106
108
109
110 ecs.
system<
const Position>(
"Print Position")
112
113
114 std::cout << e.
name() <<
": {" << p.x <<
", " << p.y <<
"}\n";
115 });
116
117
118
119 ecs.
system<Health>(
"Characters Lose Health")
120 .kind<GameScene>()
121 .
each([](Health& h) {
122
123
124 std::cout << h.amount << " health remaining\n";
125 h.amount--;
126 });
127
128
129
130 ecs.
system<
const Button>(
"Print Menu Button Text")
131 .kind<MenuScene>()
132 .
each([](
const Button& b) {
133
134
135 std::cout << "Button says \"" << b.text << "\"\n";
136 });
137}
138
139int main(int, char *[]) {
141
142 init_scenes(ecs);
143 init_systems(ecs);
144
145 ecs.add<ActiveScene, MenuScene>();
147
148 ecs.add<ActiveScene, GameScene>();
152
153 ecs.add<ActiveScene, MenuScene>();
155
156 ecs.add<ActiveScene, GameScene>();
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189}
flecs::system system(flecs::entity e) const
Upcast an entity to a system.
flecs::component< T > component(Args &&... args) const
Find or register a component.
flecs::entity entity(Args &&... args) const
Create an entity.
flecs::observer observer(flecs::entity e) const
Observer world mixin.
flecs::pipeline_builder pipeline(const char *name=nullptr) const
Create a new pipeline.
bool progress(ecs_ftime_t delta_time=0.0) const
Progress the world one tick.
void set_pipeline(const flecs::entity pip) const
Set the pipeline.
flecs::string_view name() const
Return the entity name.
Class for iterating over query results.
system & each(Func &&func)
Replace the system's each callback.
void each(Func &&func) const
Iterate over all entities with components in the argument list of the function.
void get(const Func &func) const
Get a singleton component using a callback.
flecs::event_builder event(flecs::entity_t evt) const
Create a new event.