|
|
|
@ -16,6 +16,7 @@ fn main() {
|
|
|
|
Physics2dPlugin,
|
|
|
|
Physics2dPlugin,
|
|
|
|
))
|
|
|
|
))
|
|
|
|
.insert_resource(Gravity(Vec2::NEG_Y * 9.8 * 100.0))
|
|
|
|
.insert_resource(Gravity(Vec2::NEG_Y * 9.8 * 100.0))
|
|
|
|
|
|
|
|
.init_resource::<BirdAssets>()
|
|
|
|
.init_resource::<PipeAssets>()
|
|
|
|
.init_resource::<PipeAssets>()
|
|
|
|
.init_resource::<GroundAssets>()
|
|
|
|
.init_resource::<GroundAssets>()
|
|
|
|
.init_resource::<Score>()
|
|
|
|
.init_resource::<Score>()
|
|
|
|
@ -26,16 +27,17 @@ fn main() {
|
|
|
|
.add_systems(
|
|
|
|
.add_systems(
|
|
|
|
Startup,
|
|
|
|
Startup,
|
|
|
|
(
|
|
|
|
(
|
|
|
|
init_bird,
|
|
|
|
|
|
|
|
// init_obstacles,
|
|
|
|
// init_obstacles,
|
|
|
|
init_obstacle_assets,
|
|
|
|
init_assets,
|
|
|
|
init_first_batches.after(init_obstacle_assets),
|
|
|
|
init_bird.after(init_assets),
|
|
|
|
|
|
|
|
init_first_batches.after(init_assets),
|
|
|
|
init_ui,
|
|
|
|
init_ui,
|
|
|
|
tweak_camera.after(create_camera_2d),
|
|
|
|
tweak_camera.after(create_camera_2d),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.add_systems(OnEnter(PlayerState::Alive), alive_bird)
|
|
|
|
.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::Pause), pause_bird)
|
|
|
|
.add_systems(OnEnter(PlayerState::Stasis), pause_bird)
|
|
|
|
.add_systems(OnEnter(PlayerState::Stasis), pause_bird)
|
|
|
|
.add_systems(
|
|
|
|
.add_systems(
|
|
|
|
@ -133,18 +135,10 @@ struct Tape {
|
|
|
|
fn init_bird(
|
|
|
|
fn init_bird(
|
|
|
|
mut commands: Commands,
|
|
|
|
mut commands: Commands,
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
|
|
|
|
bird_assets: Res<BirdAssets>,
|
|
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
|
|
mut materials: ResMut<Assets<ColorMaterial>>,
|
|
|
|
mut materials: ResMut<Assets<ColorMaterial>>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
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 name = Name::new("bird");
|
|
|
|
|
|
|
|
|
|
|
|
let t = Transform::from_xyz(0.0, 0.0, 0.0).with_scale(Vec3::splat(50.0));
|
|
|
|
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((
|
|
|
|
commands.spawn((
|
|
|
|
name,
|
|
|
|
name,
|
|
|
|
mesh,
|
|
|
|
bird_assets.mesh.clone(),
|
|
|
|
material,
|
|
|
|
bird_assets.material.clone(),
|
|
|
|
physics,
|
|
|
|
physics,
|
|
|
|
t,
|
|
|
|
t,
|
|
|
|
Bird,
|
|
|
|
Bird,
|
|
|
|
@ -318,22 +312,32 @@ fn populate_hitbox(trigger: Trigger<OnAdd, Hitbox>, mut commands: Commands) {
|
|
|
|
));
|
|
|
|
));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Resource, Default)]
|
|
|
|
|
|
|
|
struct BirdAssets {
|
|
|
|
|
|
|
|
material: MeshMaterial2d<ColorMaterial>,
|
|
|
|
|
|
|
|
rewind_material: MeshMaterial2d<ColorMaterial>,
|
|
|
|
|
|
|
|
mesh: Mesh2d,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Resource, Default)]
|
|
|
|
#[derive(Resource, Default)]
|
|
|
|
struct GroundAssets {
|
|
|
|
struct GroundAssets {
|
|
|
|
material: MeshMaterial2d<ColorMaterial>,
|
|
|
|
material: MeshMaterial2d<ColorMaterial>,
|
|
|
|
|
|
|
|
rewind_material: MeshMaterial2d<ColorMaterial>,
|
|
|
|
mesh: Mesh2d,
|
|
|
|
mesh: Mesh2d,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Resource, Default)]
|
|
|
|
#[derive(Resource, Default)]
|
|
|
|
struct PipeAssets {
|
|
|
|
struct PipeAssets {
|
|
|
|
material: MeshMaterial2d<ColorMaterial>,
|
|
|
|
material: MeshMaterial2d<ColorMaterial>,
|
|
|
|
|
|
|
|
rewind_material: MeshMaterial2d<ColorMaterial>,
|
|
|
|
mesh: Mesh2d,
|
|
|
|
mesh: Mesh2d,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Initialize some materials and meshes used by the environment obstacles
|
|
|
|
/// Initialize some materials and meshes used by the environment obstacles
|
|
|
|
fn init_obstacle_assets(
|
|
|
|
fn init_assets(
|
|
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
|
|
mut materials: ResMut<Assets<ColorMaterial>>,
|
|
|
|
mut materials: ResMut<Assets<ColorMaterial>>,
|
|
|
|
|
|
|
|
mut bird_assets: ResMut<BirdAssets>,
|
|
|
|
mut pipe_assets: ResMut<PipeAssets>,
|
|
|
|
mut pipe_assets: ResMut<PipeAssets>,
|
|
|
|
mut ground_assets: ResMut<GroundAssets>,
|
|
|
|
mut ground_assets: ResMut<GroundAssets>,
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
@ -343,6 +347,11 @@ fn init_obstacle_assets(
|
|
|
|
color: GREEN.into(),
|
|
|
|
color: GREEN.into(),
|
|
|
|
..default()
|
|
|
|
..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)));
|
|
|
|
pipe_assets.mesh = Mesh2d(meshes.add(Rectangle::new(1.0, 1.0)));
|
|
|
|
|
|
|
|
|
|
|
|
ground_assets.material = MeshMaterial2d(materials.add(ColorMaterial {
|
|
|
|
ground_assets.material = MeshMaterial2d(materials.add(ColorMaterial {
|
|
|
|
@ -350,8 +359,26 @@ fn init_obstacle_assets(
|
|
|
|
color: BLACK.into(),
|
|
|
|
color: BLACK.into(),
|
|
|
|
..default()
|
|
|
|
..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)));
|
|
|
|
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) {
|
|
|
|
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<ColorMaterial>>,
|
|
|
|
|
|
|
|
birds: Query<Entity, With<Bird>>,
|
|
|
|
|
|
|
|
bird_assets: ResMut<BirdAssets>,
|
|
|
|
|
|
|
|
pipes: Query<Entity, With<Pipe>>,
|
|
|
|
|
|
|
|
pipe_assets: ResMut<PipeAssets>,
|
|
|
|
|
|
|
|
grounds: Query<Entity, With<Ground>>,
|
|
|
|
|
|
|
|
ground_assets: ResMut<GroundAssets>,
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
// 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<ColorMaterial>>,
|
|
|
|
|
|
|
|
birds: Query<Entity, With<Bird>>,
|
|
|
|
|
|
|
|
bird_assets: ResMut<BirdAssets>,
|
|
|
|
|
|
|
|
pipes: Query<Entity, With<Pipe>>,
|
|
|
|
|
|
|
|
pipe_assets: ResMut<PipeAssets>,
|
|
|
|
|
|
|
|
grounds: Query<Entity, With<Ground>>,
|
|
|
|
|
|
|
|
ground_assets: ResMut<GroundAssets>,
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
// 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());
|
|
|
|
|
|
|
|
}
|
|
|
|
|