CoolFace
Apppublic

HugoDzz/rust-sandbox

sourceHugging Facemitupdated 3y agoView on Hugging Face
11likes
blood.rs101 linesDownload Raw Back to src
1use bevy::prelude::*;2use crate::utils::constants::{GAME_RESOLUTION_X, GAME_RESOLUTION_Y, BLOOD_SAFE_TIME};3use crate::utils::boundaries::is_within_boundaries;4use crate::grid::{Grid, GridPosition};5use crate::grain::{GrainType, Direction};6 7fn move_grain(transform: &mut Transform, grid_position: &mut GridPosition, x: i32, y: i32) {8    transform.translation.x += x as f32;9    transform.translation.y -= y as f32;10    grid_position.prev_x = Some(grid_position.current_x);11    grid_position.prev_y = Some(grid_position.current_y);12    grid_position.current_x += x;13    grid_position.current_y += y;14}15 16pub fn handle_blood_grain(17    transform: &mut Transform,18    grid_position: &mut GridPosition,19    grid_data: &Grid,20    direction: &mut Direction,21    lifetime: u3222) {23    // Ensure coordinates are in the grid24    if is_within_boundaries(grid_position, GAME_RESOLUTION_X as i32, GAME_RESOLUTION_Y as i32) {25 26        let maybe_grain_below = grid_data.get(grid_position.current_x as usize, (grid_position.current_y + 1) as usize);27        let maybe_grain_right = grid_data.get((grid_position.current_x + 1) as usize, grid_position.current_y as usize);28        let maybe_grain_left = grid_data.get((grid_position.current_x - 1) as usize, grid_position.current_y as usize);29 30        match maybe_grain_below {31            Some(_) => {32 33                // Do nothing (to avoid grain behavior in the air just after spawning)34                if lifetime < 5 {35                    return;36                }37 38                // There is a grain below, try moving39                match (maybe_grain_left, maybe_grain_right) {40                    (Some(_), None) => match direction {41                        Direction::Left => {42                            if lifetime < BLOOD_SAFE_TIME {43                                *direction = Direction::Right;44                            }45                        }46                        Direction::Right => move_grain(transform, grid_position, 1, 0)47                    },48                    (None, Some(_)) => match direction {49                        Direction::Left => move_grain(transform, grid_position, -1, 0),50                        Direction::Right => {51                            if lifetime < BLOOD_SAFE_TIME {52                                *direction = Direction::Left;53                            }54                        }55                    },56                    (None, None) => {57                        match *direction {58                            Direction::Right => move_grain(transform, grid_position, 1, 0),59                            Direction::Left => move_grain(transform, grid_position, -1, 0)60                        }61                    }62                    (Some(_), Some(_)) => { /* Do nothing, stay in place */ }63                }64            }65            None => {66                // No grain below, just fall67                move_grain(transform, grid_position, 0, 1)68            }69        }70    }71}72 73/*74 75    🦀 Systems. Learn more: https://bevy-cheatbook.github.io/programming/systems.html76 77*/78 79pub fn shade_blood(80    mut query: Query<(&GrainType, &mut GridPosition, &mut Handle<Image>)>,81    grid_data: ResMut<Grid>,82    asset_server: Res<AssetServer>,83) {84    for (grain_type, grid_position, mut texture_handle) in query.iter_mut() {85 86        let maybe_grain_above = grid_data.get(grid_position.current_x as usize, (grid_position.current_y - 1) as usize);87 88        match grain_type {89            GrainType::Blood => match maybe_grain_above {90                None => {91                    *texture_handle = asset_server.load("blood_1.png");92                }93                _ => {94                    *texture_handle = asset_server.load("blood_2.png");95                }96            },97            _ => {}98        }99    }100}101