Bastien Sevajol 3 years ago
parent
commit
8d32d21422
2 changed files with 32 additions and 32 deletions
  1. 2 0
      src/config.rs
  2. 30 32
      src/scene/main.rs

+ 2 - 0
src/config.rs View File

34
 pub const SCENE_ITEMS_CHANGE_ERR_MSG: &str = "scene_items content change !";
34
 pub const SCENE_ITEMS_CHANGE_ERR_MSG: &str = "scene_items content change !";
35
 //
35
 //
36
 pub const DEBUG: bool = true;
36
 pub const DEBUG: bool = true;
37
+// Distance from move target point to consider reached
38
+pub const MOVE_TO_REACHED_WHEN_DISTANCE_INFERIOR_AT: f32 = 1.0;

+ 30 - 32
src/scene/main.rs View File

11
 use crate::behavior::ItemBehavior;
11
 use crate::behavior::ItemBehavior;
12
 use crate::config::{
12
 use crate::config::{
13
     ANIMATE_EACH, DEBUG, DEFAULT_SELECTED_SQUARE_SIDE, DEFAULT_SELECTED_SQUARE_SIDE_HALF,
13
     ANIMATE_EACH, DEBUG, DEFAULT_SELECTED_SQUARE_SIDE, DEFAULT_SELECTED_SQUARE_SIDE_HALF,
14
-    DISPLAY_OFFSET_BY, DISPLAY_OFFSET_BY_SPEED, MAX_FRAME_I, META_EACH, PHYSICS_EACH,
15
-    SCENE_ITEMS_CHANGE_ERR_MSG, SPRITE_EACH, TARGET_FPS,
14
+    DISPLAY_OFFSET_BY, DISPLAY_OFFSET_BY_SPEED, MAX_FRAME_I, META_EACH,
15
+    MOVE_TO_REACHED_WHEN_DISTANCE_INFERIOR_AT, PHYSICS_EACH, SCENE_ITEMS_CHANGE_ERR_MSG,
16
+    SPRITE_EACH, TARGET_FPS,
16
 };
17
 };
17
 use crate::physics::util::scene_point_from_window_point;
18
 use crate::physics::util::scene_point_from_window_point;
18
 use crate::physics::util::window_point_from_scene_point;
19
 use crate::physics::util::window_point_from_scene_point;
292
             //         }
293
             //         }
293
             //     }
294
             //     }
294
             // }
295
             // }
295
-
296
-            scene_item.meta_events.drain(..);
296
+            //
297
+            // scene_item.meta_events.drain(..);
297
 
298
 
298
             if let Some(next_order) = &scene_item.next_order {
299
             if let Some(next_order) = &scene_item.next_order {
299
                 // TODO: Compute here if it possible (fear, compatible with current order, etc)
300
                 // TODO: Compute here if it possible (fear, compatible with current order, etc)
305
                 scene_item.next_order = None;
306
                 scene_item.next_order = None;
306
             }
307
             }
307
 
308
 
308
-            // FIXME BS NOW: stop move when move is accomplished; warn: recompute move_vector here
309
+            // TODO: here, compute state according to order. Ex: if too much fear, move order do not produce walking state
309
             if let Some(current_order) = &scene_item.current_order {
310
             if let Some(current_order) = &scene_item.current_order {
310
                 match current_order {
311
                 match current_order {
311
                     Order::MoveTo(move_to_scene_point) => {
312
                     Order::MoveTo(move_to_scene_point) => {
312
-                        let change_to_walk = match scene_item.state.current_behavior {
313
-                            ItemBehavior::Standing(_) => true,
314
-                            ItemBehavior::CrawlingTo(_) => true,
315
-                            ItemBehavior::WalkingTo(_) => false,
316
-                        };
317
-
318
-                        if change_to_walk {
319
-                            scene_item.state =
320
-                                ItemState::new(ItemBehavior::WalkingTo(*move_to_scene_point));
321
-                        }
313
+                        scene_item.state =
314
+                            ItemState::new(ItemBehavior::WalkingTo(*move_to_scene_point));
322
                     }
315
                     }
323
                 }
316
                 }
324
             }
317
             }
325
 
318
 
326
             match scene_item.state.current_behavior {
319
             match scene_item.state.current_behavior {
327
                 ItemBehavior::Standing(_) => {}
320
                 ItemBehavior::Standing(_) => {}
328
-                ItemBehavior::CrawlingTo(scene_point) => {
329
-                    let angle = f32::atan2(
330
-                        scene_point.y - scene_item.position.y,
331
-                        scene_point.x - scene_item.position.x,
332
-                    ) + FRAC_PI_2;
333
-                    scene_item.display_angle = angle;
334
-
335
-                    let move_vector = (scene_point - scene_item.position).normalize() * 1.0;
336
-                    println!("{:?}", move_vector);
337
-                }
338
-                ItemBehavior::WalkingTo(scene_point) => {
339
-                    let angle = f32::atan2(
340
-                        scene_point.y - scene_item.position.y,
341
-                        scene_point.x - scene_item.position.x,
321
+                ItemBehavior::WalkingTo(going_to_scene_point)
322
+                | ItemBehavior::CrawlingTo(going_to_scene_point) => {
323
+                    // Note: angle computed by adding FRAC_PI_2 because sprites are north oriented
324
+                    scene_item.display_angle = f32::atan2(
325
+                        going_to_scene_point.y - scene_item.position.y,
326
+                        going_to_scene_point.x - scene_item.position.x,
342
                     ) + FRAC_PI_2;
327
                     ) + FRAC_PI_2;
343
-                    scene_item.display_angle = angle;
344
 
328
 
345
-                    let move_vector = (scene_point - scene_item.position).normalize() * 1.0;
346
-                    println!("{:?}", move_vector);
329
+                    // Check if scene_point reached
330
+                    let distance = going_to_scene_point.distance(scene_item.position);
331
+                    println!("{:?}", distance);
332
+                    if distance < MOVE_TO_REACHED_WHEN_DISTANCE_INFERIOR_AT {
333
+                        scene_item.state = ItemState::new(ItemBehavior::Standing(self.frame_i));
334
+                        if let Some(current_order) = &scene_item.current_order {
335
+                            match current_order {
336
+                                Order::MoveTo(move_to_scene_point) => {
337
+                                    if *move_to_scene_point == going_to_scene_point {
338
+                                        // TODO: If multiple moves, setup next move order
339
+                                        scene_item.current_order = None;
340
+                                    }
341
+                                }
342
+                            }
343
+                        }
344
+                    }
347
                 }
345
                 }
348
             }
346
             }
349
         }
347
         }