performance/
performance.rs1use lotus_engine::*;
2use rand::{rng, rngs::ThreadRng, Rng};
3
4#[derive(Clone, Component)]
5struct Object();
6
7#[derive(Clone, Component)]
8struct Border();
9
10your_game!(
11 WindowConfiguration::default(),
12 setup,
13 update
14);
15
16fn setup(context: &mut Context) {
17 let circle: Circle = Circle::new(64, 0.5);
18 let mut thread_rng: ThreadRng = rng();
19
20 let left_border_perimeter: f64 = -1.3;
21 let right_border_perimiter: f64 = 1.3;
22 let bottom_border_perimeter: f64 = -0.9;
23 let top_border_perimeter: f64 = 0.9;
24
25 for _ in 1..=10 {
27 let randomic_position_x: f32 = thread_rng.random_range(left_border_perimeter..right_border_perimiter) as f32;
28 let randomic_position_y: f32 = thread_rng.random_range(bottom_border_perimeter..top_border_perimeter) as f32;
29
30 let randomic_velocity_x: f32 = thread_rng.random_range(-0.5..0.5) as f32;
31 let randomic_velocity_y: f32 = thread_rng.random_range(-0.5..0.5) as f32;
32
33 context.commands.spawn(
34 vec![
35 Box::new(Shape::new(Orientation::Horizontal, GeometryType::Circle(circle.clone()), Color::BLUE)),
36 Box::new(Object()),
37 Box::new(Transform::new(
38 Position::new(Vector2::new(randomic_position_x, randomic_position_y), Strategy::Normalized),
39 0.0,
40 Vector2::new(0.15, 0.15)
41 )),
42 Box::new(Velocity::new(Vector2::new(randomic_velocity_x, randomic_velocity_y))),
43 Box::new(Collision::new(Collider::new_simple(GeometryType::Square)))
44 ]
45 );
46 }
47
48 spawn_border(context, Orientation::Horizontal, Vector2::new(0.0, -1.), Vector2::new(context.window_configuration.width as f32, 0.01));
49 spawn_border(context, Orientation::Horizontal, Vector2::new(0.0, 1.), Vector2::new(context.window_configuration.width as f32, 0.01));
50 spawn_border(context, Orientation::Vertical, Vector2::new(1.35, 0.), Vector2::new(0.01, context.window_configuration.height as f32));
51 spawn_border(context, Orientation::Vertical, Vector2::new(-1.35, 0.), Vector2::new(0.01, context.window_configuration.height as f32));
52}
53
54fn update(context: &mut Context) {
55 context.commands.show_fps(context.game_loop_listener.current_fps, Color::BLACK);
56
57 let mut query: Query = Query::new(&context.world).with::<Object>();
58 let entities: Vec<Entity> = query.entities_with_components().unwrap();
59
60 check_border_collision(context, &entities);
61 move_objects(context, &entities);
62}
63
64fn spawn_border(context: &mut Context, orientation: Orientation, position: Vector2<f32>, scale: Vector2<f32>) {
65 let border: Shape = Shape::new(orientation, GeometryType::Rectangle, Color::WHITE);
66
67 context.commands.spawn(
68 vec![
69 Box::new(border),
70 Box::new(Border()),
71 Box::new(Transform::new(
72 Position::new(position, Strategy::Normalized),
73 0.0,
74 scale
75 )),
76 Box::new(Collision::new(Collider::new_simple(GeometryType::Rectangle)))
77 ]
78 );
79}
80
81fn check_border_collision(context: &mut Context, entities: &Vec<Entity>) {
82 let mut border_query: Query = Query::new(&context.world).with::<Border>();
83 let borders: Vec<Entity> = border_query.entities_with_components().unwrap();
84
85 for entity in entities {
86 let mut velocity: ComponentRefMut<'_, Velocity> = context.world.get_entity_component_mut::<Velocity>(entity).unwrap();
87 let collision: ComponentRef<'_, Collision> = context.world.get_entity_component::<Collision>(entity).unwrap();
88
89 for border in &borders {
90 let border_collision: ComponentRef<'_, Collision> = context.world.get_entity_component::<Collision>(&border).unwrap();
91
92 if Collision::check(CollisionAlgorithm::Aabb, &collision, &border_collision) {
93 let border_transform: ComponentRef<'_, Transform> = context.world.get_entity_component::<Transform>(&border).unwrap();
94
95 if border_transform.position.x.abs() < border_transform.position.y.abs() {
96 velocity.y *= -1.0;
97 } else {
98 velocity.x *= -1.0;
99 }
100 break;
101 }
102 }
103 }
104}
105
106fn move_objects(context: &mut Context, entities: &Vec<Entity>) {
107 for entity in entities {
108 let mut transform: ComponentRefMut<'_, Transform> = context.world.get_entity_component_mut::<Transform>(entity).unwrap();
109 let velocity: ComponentRef<'_, Velocity> = context.world.get_entity_component::<Velocity>(entity).unwrap();
110
111 let new_position: Vector2<f32> = transform.position.to_vec() + velocity.to_vec() * context.delta;
112 transform.set_position(&context.render_state, new_position);
113 }
114}