diff --git a/assets/flappy/CREDITS b/assets/flappy/CREDITS index dd853fc..b9e477f 100644 --- a/assets/flappy/CREDITS +++ b/assets/flappy/CREDITS @@ -6,4 +6,4 @@ Art Assets: Kenney.nl Engine: Bevy Physics: Avian2D -Inspired by the 2013 Flappy Bird by Dong Nguyen +Inspired by Flappy Bird (2013) by Dong Nguyen diff --git a/src/bin/flappy/main.rs b/src/bin/flappy/main.rs index 396baa7..aa228b2 100644 --- a/src/bin/flappy/main.rs +++ b/src/bin/flappy/main.rs @@ -16,6 +16,7 @@ fn main() { Physics2dPlugin, )) .insert_resource(Gravity(Vec2::NEG_Y * 9.8 * 100.0)) + .init_resource::() .init_resource::() .init_resource::() .init_resource::() @@ -26,16 +27,17 @@ fn main() { .add_systems( Startup, ( - init_bird, // init_obstacles, - init_obstacle_assets, - init_first_batches.after(init_obstacle_assets), + init_assets, + init_bird.after(init_assets), + init_first_batches.after(init_assets), init_ui, tweak_camera.after(create_camera_2d), ), ) .add_systems(OnEnter(PlayerState::Alive), alive_bird) - .add_systems(OnEnter(PlayerState::Rewind), alive_bird) + .add_systems(OnEnter(PlayerState::Rewind), (invert_colors, alive_bird)) + .add_systems(OnExit(PlayerState::Rewind), uninvert_colors) .add_systems(OnEnter(PlayerState::Pause), pause_bird) .add_systems(OnEnter(PlayerState::Stasis), pause_bird) .add_systems( @@ -133,18 +135,10 @@ struct Tape { fn init_bird( mut commands: Commands, server: Res, + bird_assets: Res, mut meshes: ResMut>, mut materials: ResMut>, ) { - let material = MeshMaterial2d(materials.add(ColorMaterial { - texture: Some(server.load("flappy/bird.png")), - color: ORANGE.into(), - alpha_mode: AlphaMode2d::Blend, - ..default() - })); - - let mesh = Mesh2d(meshes.add(Rectangle::new(1.0, 1.2))); - let name = Name::new("bird"); let t = Transform::from_xyz(0.0, 0.0, 0.0).with_scale(Vec3::splat(50.0)); @@ -161,8 +155,8 @@ fn init_bird( commands.spawn(( name, - mesh, - material, + bird_assets.mesh.clone(), + bird_assets.material.clone(), physics, t, Bird, @@ -318,22 +312,32 @@ fn populate_hitbox(trigger: Trigger, mut commands: Commands) { )); } +#[derive(Resource, Default)] +struct BirdAssets { + material: MeshMaterial2d, + rewind_material: MeshMaterial2d, + mesh: Mesh2d, +} + #[derive(Resource, Default)] struct GroundAssets { material: MeshMaterial2d, + rewind_material: MeshMaterial2d, mesh: Mesh2d, } #[derive(Resource, Default)] struct PipeAssets { material: MeshMaterial2d, + rewind_material: MeshMaterial2d, mesh: Mesh2d, } /// Initialize some materials and meshes used by the environment obstacles -fn init_obstacle_assets( +fn init_assets( mut meshes: ResMut>, mut materials: ResMut>, + mut bird_assets: ResMut, mut pipe_assets: ResMut, mut ground_assets: ResMut, server: Res, @@ -343,6 +347,11 @@ fn init_obstacle_assets( color: GREEN.into(), ..default() })); + pipe_assets.rewind_material = MeshMaterial2d(materials.add(ColorMaterial { + texture: Some(server.load("flappy/pipe.png")), + color: (WHITE - GREEN).with_alpha(1.0).into(), + ..default() + })); pipe_assets.mesh = Mesh2d(meshes.add(Rectangle::new(1.0, 1.0))); ground_assets.material = MeshMaterial2d(materials.add(ColorMaterial { @@ -350,8 +359,26 @@ fn init_obstacle_assets( color: BLACK.into(), ..default() })); - + ground_assets.rewind_material = MeshMaterial2d(materials.add(ColorMaterial { + texture: Some(server.load("flappy/ground.png")), + color: WHITE.into(), + ..default() + })); ground_assets.mesh = Mesh2d(meshes.add(Rectangle::new(1.0, 1.0))); + + bird_assets.material = MeshMaterial2d(materials.add(ColorMaterial { + texture: Some(server.load("flappy/bird.png")), + color: ORANGE.into(), + alpha_mode: AlphaMode2d::Blend, + ..default() + })); + bird_assets.rewind_material = MeshMaterial2d(materials.add(ColorMaterial { + texture: Some(server.load("flappy/bird.png")), + color: (WHITE - ORANGE).with_alpha(1.0).into(), + alpha_mode: AlphaMode2d::Blend, + ..default() + })); + bird_assets.mesh = Mesh2d(meshes.add(Rectangle::new(1.0, 1.2))); } fn init_ui(mut commands: Commands) { @@ -884,3 +911,59 @@ fn update_tooltip( }) }); } + +fn invert_colors( + camera: Single<&mut Camera>, + mut materials: Query<&mut MeshMaterial2d>, + birds: Query>, + bird_assets: ResMut, + pipes: Query>, + pipe_assets: ResMut, + grounds: Query>, + ground_assets: ResMut, +) { + // Invert bird + birds.iter().for_each(|e| { + *materials.get_mut(e).unwrap() = bird_assets.rewind_material.clone(); + }); + // Set pipes + pipes.iter().for_each(|e| { + *materials.get_mut(e).unwrap() = pipe_assets.rewind_material.clone(); + }); + // Set ground + grounds.iter().for_each(|e| { + *materials.get_mut(e).unwrap() = ground_assets.rewind_material.clone(); + }); + + // Set background color + let mut c = camera.into_inner(); + c.clear_color = ClearColorConfig::Custom(BLACK.into()); +} + +fn uninvert_colors( + camera: Single<&mut Camera>, + mut materials: Query<&mut MeshMaterial2d>, + birds: Query>, + bird_assets: ResMut, + pipes: Query>, + pipe_assets: ResMut, + grounds: Query>, + ground_assets: ResMut, +) { + // Set bird + birds.iter().for_each(|e| { + *materials.get_mut(e).unwrap() = bird_assets.material.clone(); + }); + // Set pipes + pipes.iter().for_each(|e| { + *materials.get_mut(e).unwrap() = pipe_assets.material.clone(); + }); + // Set ground + grounds.iter().for_each(|e| { + *materials.get_mut(e).unwrap() = ground_assets.material.clone(); + }); + + // Set background color + let mut c = camera.into_inner(); + c.clear_color = ClearColorConfig::Custom(WHITE.into()); +}