From 297811e8825dbbe468d09fe83c281371e07754a7 Mon Sep 17 00:00:00 2001 From: tuxmain Date: Wed, 24 Aug 2022 12:21:08 +0200 Subject: [PATCH] Platform material & filter bundle --- src/filters.rs | 20 +++++++++++++++++ src/game.rs | 2 ++ src/levels.rs | 3 +++ src/levels/level0.rs | 19 +++++++++++----- src/levels/level1.rs | 53 ++++++++++++++++++++++++++++++++++++++------ src/main.rs | 17 +++++++------- 6 files changed, 93 insertions(+), 21 deletions(-) create mode 100644 src/filters.rs diff --git a/src/filters.rs b/src/filters.rs new file mode 100644 index 0000000..a4439c4 --- /dev/null +++ b/src/filters.rs @@ -0,0 +1,20 @@ +use bevy::prelude::*; +use bevy_rapier2d::prelude::*; + +#[derive(Component, Default)] +pub struct FilterColor(pub Color); + +#[derive(Component)] +pub enum PassThroughFilter { + Absorbing, +} + +#[derive(Bundle)] +pub struct AbsorbingFilter { + pub color: FilterColor, + #[bundle] + pub mesh: ColorMesh2dBundle, + pub collider: Collider, + pub sensor: Sensor, + pub filter_type: PassThroughFilter, +} diff --git a/src/game.rs b/src/game.rs index b9ca210..908752a 100644 --- a/src/game.rs +++ b/src/game.rs @@ -1,6 +1,8 @@ #![allow(clippy::precedence)] #![allow(clippy::too_many_arguments)] +pub use crate::filters::*; + use crate::AppState; use bevy::{ diff --git a/src/levels.rs b/src/levels.rs index fbe3ff8..0d2ce89 100644 --- a/src/levels.rs +++ b/src/levels.rs @@ -36,6 +36,7 @@ pub fn despawn_level(mut commands: Commands, level_query: Query, + mut meshes: ResMut>, mut materials: ResMut>, current_level: Res, mut level_startup_event: EventReader, @@ -47,12 +48,14 @@ pub fn post_setup_level( match level_id.0 { 0 => level0::setup( &mut commands, + &mut meshes, &character_meshes, &mut materials, &audio, ), 1 => level1::setup( &mut commands, + &mut meshes, &character_meshes, &mut materials, &audio, diff --git a/src/levels/level0.rs b/src/levels/level0.rs index 01b13a4..6cec4c4 100644 --- a/src/levels/level0.rs +++ b/src/levels/level0.rs @@ -1,19 +1,28 @@ use crate::game::*; -use bevy::prelude::*; +use bevy::prelude::{shape::Quad, *}; use bevy_rapier2d::prelude::*; pub fn setup( commands: &mut Commands, + meshes: &mut ResMut>, character_meshes: &Res, materials: &mut ResMut>, - // selected_character_id: &mut Mut, - // character_id_list: &mut Mut, audio: &Res>, ) { commands - .spawn_bundle(TransformBundle::from(Transform::from_xyz(0.0, -256.0, 0.0))) - .insert(Collider::cuboid(400., 10.)) + .spawn_bundle(ColorMesh2dBundle { + mesh: meshes + .add(Mesh::from(Quad { + size: Vec2 { x: 800.0, y: 16.0 }, + flip: false, + })) + .into(), + material: materials.add(ColorMaterial::from(Color::GRAY)), + transform: Transform::from_xyz(0.0, -256.0, 0.0), + ..default() + }) + .insert(Collider::cuboid(400., 8.)) .insert(Level); spawn_character( diff --git a/src/levels/level1.rs b/src/levels/level1.rs index 3efdebf..4699cb1 100644 --- a/src/levels/level1.rs +++ b/src/levels/level1.rs @@ -1,23 +1,42 @@ use crate::game::*; -use bevy::prelude::*; +use bevy::prelude::{shape::Quad, *}; use bevy_rapier2d::prelude::*; pub fn setup( commands: &mut Commands, + meshes: &mut ResMut>, character_meshes: &Res, materials: &mut ResMut>, audio: &Res>, ) { commands - .spawn_bundle(TransformBundle::from(Transform::from_xyz(0.0, -256.0, 0.0))) - .insert(Collider::cuboid(400., 10.)) + .spawn_bundle(ColorMesh2dBundle { + mesh: meshes + .add(Mesh::from(Quad { + size: Vec2 { x: 800.0, y: 16.0 }, + flip: false, + })) + .into(), + material: materials.add(ColorMaterial::from(Color::GRAY)), + transform: Transform::from_xyz(0.0, -256.0, 0.0), + ..default() + }) + .insert(Collider::cuboid(400., 8.)) .insert(Level); commands - .spawn_bundle(TransformBundle::from(Transform::from_xyz( - 256.0, -128.0, 0.0, - ))) - .insert(Collider::cuboid(200., 10.)) + .spawn_bundle(ColorMesh2dBundle { + mesh: meshes + .add(Mesh::from(Quad { + size: Vec2 { x: 400.0, y: 16.0 }, + flip: false, + })) + .into(), + material: materials.add(ColorMaterial::from(Color::GRAY)), + transform: Transform::from_xyz(256.0, -128.0, 0.0), + ..default() + }) + .insert(Collider::cuboid(200., 8.)) .insert(Level); spawn_character( @@ -47,4 +66,24 @@ pub fn setup( Color::GREEN, false, ); + + commands + .spawn_bundle(AbsorbingFilter { + color: FilterColor(Color::RED), + mesh: ColorMesh2dBundle { + mesh: meshes + .add(Mesh::from(Quad { + size: Vec2 { x: 128.0, y: 16.0 }, + flip: false, + })) + .into(), + material: materials.add(Color::rgba(1., 0., 0., 0.5).into()), + transform: Transform::from_xyz(0., 0., 2.), + ..Default::default() + }, + collider: Collider::cuboid(64., 8.), + sensor: Sensor, + filter_type: PassThroughFilter::Absorbing, + }) + .insert(Level); } diff --git a/src/main.rs b/src/main.rs index 7a19dab..b7fbbc2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,12 @@ #[cfg(not(target_arch = "wasm32"))] mod audio; +mod filters; mod game; mod levels; mod menu; mod particle_effect; -use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*}; +use bevy::prelude::*; use bevy_rapier2d::prelude::*; #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] @@ -23,15 +24,18 @@ fn main() { std::thread::spawn(move || audio::setup(audio_event_receiver)); App::new() + .insert_resource(Msaa { samples: 4 }) .insert_resource(audio_event_sender) .add_state(AppState::Menu) + .insert_resource(ClearColor(Color::BLACK)) .add_plugins(DefaultPlugins) .add_plugin(RapierPhysicsPlugin::::pixels_per_meter(64.0)) - .add_plugin(RapierDebugRenderPlugin::default()) + //.add_plugin(RapierDebugRenderPlugin::default()) .add_plugin(menu::MenuPlugin) .add_plugin(game::GamePlugin) .add_plugin(particle_effect::ParticleEffectPlugin) - .add_plugin(bevy_inspector_egui::WorldInspectorPlugin::new()) + //.add_plugin(bevy_inspector_egui::WorldInspectorPlugin::new()) + .add_system(bevy::window::close_on_esc) .add_startup_system(setup) .run(); } @@ -43,12 +47,7 @@ fn setup(mut commands: Commands, asset_server: Res) { let font: Handle = asset_server.load("UacariLegacy-Thin.ttf"); commands.insert_resource(font); - commands.spawn_bundle(Camera2dBundle { - camera_2d: Camera2d { - clear_color: ClearColorConfig::Custom(Color::BLACK), - }, - ..Default::default() - }); + commands.spawn_bundle(Camera2dBundle::default()); commands.insert_resource(AmbientLight { color: Color::WHITE, brightness: 0.6,