melting platform, level 4
This commit is contained in:
parent
585b74bf72
commit
a859d72da3
9 changed files with 471 additions and 16 deletions
103
src/editor.rs
103
src/editor.rs
|
|
@ -63,6 +63,9 @@ struct RotatingFilterAngle(f32);
|
|||
#[derive(Component)]
|
||||
struct AbsorbingFilterColor(Color);
|
||||
|
||||
#[derive(Component)]
|
||||
struct MeltyPlatformColor(Color);
|
||||
|
||||
#[derive(Component)]
|
||||
struct Removable;
|
||||
|
||||
|
|
@ -122,6 +125,17 @@ struct RotatingFilterBundle {
|
|||
removable: Removable,
|
||||
}
|
||||
|
||||
#[derive(Bundle)]
|
||||
struct MeltyPlatformBundle {
|
||||
#[bundle]
|
||||
mesh: ColorMesh2dBundle,
|
||||
color: MeltyPlatformColor,
|
||||
#[bundle]
|
||||
pickable: PickableBundle,
|
||||
draggable: Draggable,
|
||||
removable: Removable,
|
||||
}
|
||||
|
||||
// Functions
|
||||
|
||||
fn spawn_platform(
|
||||
|
|
@ -360,6 +374,52 @@ fn spawn_rotating_filter(
|
|||
.id()
|
||||
}
|
||||
|
||||
fn spawn_melty_platform(
|
||||
commands: &mut Commands,
|
||||
meshes: &mut ResMut<Assets<Mesh>>,
|
||||
materials: &mut ResMut<Assets<ColorMaterial>>,
|
||||
asset_server: &Res<AssetServer>,
|
||||
|
||||
transform: Transform,
|
||||
color: Color,
|
||||
) -> Entity {
|
||||
let font = asset_server.get_handle("UacariLegacy-Thin.ttf");
|
||||
commands
|
||||
.spawn_bundle(MeltyPlatformBundle {
|
||||
mesh: ColorMesh2dBundle {
|
||||
mesh: meshes
|
||||
.add(Mesh::from(Quad {
|
||||
size: Vec2 { x: 96., y: 16. },
|
||||
flip: false,
|
||||
}))
|
||||
.into(),
|
||||
material: materials.add(ColorMaterial::from(color)),
|
||||
transform,
|
||||
..default()
|
||||
},
|
||||
color: MeltyPlatformColor(color),
|
||||
pickable: PickableBundle::default(),
|
||||
draggable: Draggable,
|
||||
removable: Removable,
|
||||
})
|
||||
.with_children(|c| {
|
||||
c.spawn_bundle(Text2dBundle {
|
||||
text: Text::from_section(
|
||||
"MELTY",
|
||||
TextStyle {
|
||||
font: font.clone(),
|
||||
font_size: 16.,
|
||||
color: Color::BLACK,
|
||||
},
|
||||
)
|
||||
.with_alignment(TextAlignment::CENTER),
|
||||
transform: Transform::from_xyz(0., 0., 1.),
|
||||
..Default::default()
|
||||
});
|
||||
})
|
||||
.id()
|
||||
}
|
||||
|
||||
fn spawn_stored_level(
|
||||
commands: &mut Commands,
|
||||
meshes: &mut ResMut<Assets<Mesh>>,
|
||||
|
|
@ -413,6 +473,17 @@ fn spawn_stored_level(
|
|||
rotating_filter.angle,
|
||||
);
|
||||
}
|
||||
|
||||
for melty_platform in stored_level.melty_platforms.iter() {
|
||||
spawn_melty_platform(
|
||||
commands,
|
||||
meshes,
|
||||
materials,
|
||||
asset_server,
|
||||
Transform::from_xyz(melty_platform.pos.x, melty_platform.pos.y, 0.),
|
||||
melty_platform.color.into(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
fn save_level(
|
||||
|
|
@ -427,6 +498,10 @@ fn save_level(
|
|||
(&Transform, &RotatingFilterAngle),
|
||||
(Without<Platform>, Without<CharacterColor>),
|
||||
>,
|
||||
melty_platform_query: &Query<
|
||||
(&Transform, &MeltyPlatformColor),
|
||||
(Without<Platform>, Without<CharacterColor>),
|
||||
>,
|
||||
) {
|
||||
let stored_levels = stored_levels_assets.get_mut(stored_levels_handle).unwrap();
|
||||
if let Some(stored_level) = stored_levels.levels.get_mut(level_id.0 .0 as usize) {
|
||||
|
|
@ -476,6 +551,17 @@ fn save_level(
|
|||
angle: angle.0,
|
||||
})
|
||||
}
|
||||
|
||||
stored_level.melty_platforms.clear();
|
||||
for (transform, color) in melty_platform_query.iter() {
|
||||
stored_level.melty_platforms.push(StoredMeltyPlatform {
|
||||
pos: Vec2 {
|
||||
x: transform.translation.x,
|
||||
y: transform.translation.y,
|
||||
},
|
||||
color: color.0.into(),
|
||||
})
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
|
@ -537,8 +623,12 @@ fn input_control_system(
|
|||
(&Transform, &RotatingFilterAngle),
|
||||
(Without<Platform>, Without<CharacterColor>),
|
||||
>,
|
||||
melty_platform_query: Query<
|
||||
(&Transform, &MeltyPlatformColor),
|
||||
(Without<Platform>, Without<CharacterColor>),
|
||||
>,
|
||||
) {
|
||||
if keyboard_input.just_released(KeyCode::S)
|
||||
if keyboard_input.just_pressed(KeyCode::S)
|
||||
&& (keyboard_input.pressed(KeyCode::LControl) || keyboard_input.pressed(KeyCode::RControl))
|
||||
{
|
||||
save_level(
|
||||
|
|
@ -550,6 +640,7 @@ fn input_control_system(
|
|||
&platform_query,
|
||||
&absorbing_filter_query,
|
||||
&rotating_filter_query,
|
||||
&melty_platform_query,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -681,6 +772,16 @@ fn spawn_system(
|
|||
90.,
|
||||
);
|
||||
}
|
||||
if keyboard_input.just_released(KeyCode::M) {
|
||||
spawn_melty_platform(
|
||||
&mut commands,
|
||||
&mut meshes,
|
||||
&mut materials,
|
||||
&asset_server,
|
||||
Transform::from_xyz(camera_pos.x, camera_pos.y, 0.),
|
||||
Color::RED,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
fn follow_ends_system(
|
||||
|
|
|
|||
53
src/game.rs
53
src/game.rs
|
|
@ -98,6 +98,9 @@ pub struct Player;
|
|||
#[derive(Component)]
|
||||
pub struct CollisionCount(usize);
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct Melty(pub Color);
|
||||
|
||||
// Systems
|
||||
|
||||
fn setup(
|
||||
|
|
@ -217,6 +220,39 @@ pub fn spawn_platform(
|
|||
.insert(Level);
|
||||
}
|
||||
|
||||
pub fn spawn_melty_platform(
|
||||
commands: &mut Commands,
|
||||
meshes: &mut ResMut<Assets<Mesh>>,
|
||||
materials: &mut ResMut<Assets<ColorMaterial>>,
|
||||
asset_server: &Res<AssetServer>,
|
||||
|
||||
transform: Transform,
|
||||
color: Color,
|
||||
) {
|
||||
commands
|
||||
.spawn_bundle(ColorMesh2dBundle {
|
||||
mesh: meshes
|
||||
.add(Mesh::from(Quad {
|
||||
size: Vec2 { x: 96., y: 16. },
|
||||
flip: false,
|
||||
}))
|
||||
.into(),
|
||||
material: materials.add(ColorMaterial::from(color)),
|
||||
transform,
|
||||
..default()
|
||||
})
|
||||
.insert(Collider::cuboid(48., 8.))
|
||||
.insert(Melty(color))
|
||||
.insert(Level)
|
||||
.with_children(|c| {
|
||||
c.spawn_bundle(SpriteBundle {
|
||||
texture: asset_server.get_handle("melty.png"),
|
||||
transform: Transform::from_xyz(0., 0., 0.5),
|
||||
..default()
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
fn collision_event_system(
|
||||
mut commands: Commands,
|
||||
character_meshes: Res<CharacterMeshes>,
|
||||
|
|
@ -229,6 +265,7 @@ fn collision_event_system(
|
|||
Option<&Player>,
|
||||
)>,
|
||||
pass_through_filter_query: Query<&PassThroughFilter>,
|
||||
melty_query: Query<&Melty>,
|
||||
mut collision_counter_query: Query<&mut CollisionCount>,
|
||||
mut app_state: ResMut<State<AppState>>,
|
||||
audio: Res<crossbeam_channel::Sender<AudioMsg>>,
|
||||
|
|
@ -250,7 +287,7 @@ fn collision_event_system(
|
|||
|
||||
// If color approximately white
|
||||
if app_state.current() == &AppState::Game
|
||||
&& 4. - new_color.length_squared() < 0.1
|
||||
&& Vec4::from(new_color).min_element() >= 0.9
|
||||
{
|
||||
app_state.replace(AppState::Win).ok();
|
||||
}
|
||||
|
|
@ -275,6 +312,18 @@ fn collision_event_system(
|
|||
);
|
||||
|
||||
audio.send(AudioMsg::Fusion).ok();
|
||||
} else if let (Ok((c_color, _c_transform, _c_material, _c_player)), Ok(melty)) =
|
||||
(character_query.get_mut(*e1), melty_query.get(*e2))
|
||||
{
|
||||
if (Vec4::from(melty.0) - Vec4::from(c_color.0)).max_element() <= 0. {
|
||||
commands.entity(*e2).despawn_recursive();
|
||||
}
|
||||
} else if let (Ok((c_color, _c_transform, _c_material, _c_player)), Ok(melty)) =
|
||||
(character_query.get_mut(*e2), melty_query.get(*e1))
|
||||
{
|
||||
if (Vec4::from(melty.0) - Vec4::from(c_color.0)).max_element() <= 0. {
|
||||
commands.entity(*e1).despawn_recursive();
|
||||
}
|
||||
}
|
||||
} else if *flags == CollisionEventFlags::SENSOR {
|
||||
if let (Ok((mut c_color, _c_transform, mut c_material, c_player)), Ok(filter)) = (
|
||||
|
|
@ -292,6 +341,7 @@ fn collision_event_system(
|
|||
c_color.0.b(),
|
||||
]))
|
||||
.ok();
|
||||
audio.send(AudioMsg::Switch).ok();
|
||||
}
|
||||
} else if let (
|
||||
Ok((mut c_color, _c_transform, mut c_material, c_player)),
|
||||
|
|
@ -311,6 +361,7 @@ fn collision_event_system(
|
|||
c_color.0.b(),
|
||||
]))
|
||||
.ok();
|
||||
audio.send(AudioMsg::Switch).ok();
|
||||
}
|
||||
} else if let (Ok(mut collision_count), Err(_)) = (
|
||||
collision_counter_query.get_mut(*e1),
|
||||
|
|
|
|||
|
|
@ -109,6 +109,16 @@ pub fn spawn_stored_level(
|
|||
rotating_filter.angle,
|
||||
);
|
||||
}
|
||||
for melty_platform in stored_level.melty_platforms.iter() {
|
||||
spawn_melty_platform(
|
||||
commands,
|
||||
meshes,
|
||||
materials,
|
||||
asset_server,
|
||||
Transform::from_xyz(melty_platform.pos.x, melty_platform.pos.y, 2.),
|
||||
melty_platform.color.into(),
|
||||
);
|
||||
}
|
||||
for text in stored_level.texts.iter() {
|
||||
commands
|
||||
.spawn_bundle(Text2dBundle {
|
||||
|
|
@ -145,6 +155,7 @@ pub mod stored {
|
|||
pub platforms: Vec<StoredPlatform>,
|
||||
pub absorbing_filters: Vec<StoredAbsorbingFilter>,
|
||||
pub rotating_filters: Vec<StoredRotatingFilter>,
|
||||
pub melty_platforms: Vec<StoredMeltyPlatform>,
|
||||
pub texts: Vec<StoredText>,
|
||||
}
|
||||
|
||||
|
|
@ -177,6 +188,13 @@ pub mod stored {
|
|||
pub angle: f32,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize, TypeUuid)]
|
||||
#[uuid = "cb0773ef-eca6-9b96-dcba-f4240ebdcf40"]
|
||||
pub struct StoredMeltyPlatform {
|
||||
pub pos: Vec2,
|
||||
pub color: Vec4,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize, TypeUuid)]
|
||||
#[uuid = "72f6321a-f01f-6eea-9b17-3159837a2fd3"]
|
||||
pub struct StoredText {
|
||||
|
|
|
|||
|
|
@ -99,7 +99,10 @@ fn setup(mut commands: Commands, mut windows: ResMut<Windows>, asset_server: Res
|
|||
assets.add(asset_server.load::<levels::StoredLevels, _>("game.levels.json")),
|
||||
);
|
||||
commands.insert_resource(assets.add(asset_server.load::<Font, _>("UacariLegacy-Thin.ttf")));
|
||||
commands.insert_resource(assets.add(asset_server.load::<Image, _>("bevy.png")));
|
||||
commands.insert_resource([
|
||||
assets.add(asset_server.load::<Image, _>("bevy.png")),
|
||||
assets.add(asset_server.load("melty.png")),
|
||||
]);
|
||||
commands.insert_resource(assets);
|
||||
|
||||
commands.spawn_bundle(Camera2dBundle::default());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue