parallax!!!!!!

This commit is contained in:
TudbuT 2024-11-24 05:48:56 +01:00
parent 3944aabd27
commit 6a550cfcb8
No known key found for this signature in database
GPG key ID: B3CF345217F202D3
4 changed files with 136 additions and 1 deletions

View file

@ -1,4 +1,26 @@
header
parallax.size = 2000x1000
parallax.tiles = 2
parallax.factor.y = 100000
parallax.tex = BG0_himmel_blau.png
parallax.factor = 30
parallax.depth = 10
parallax.offset = -200
parallax.enable = true
parallax.tex = BG1_Berge_blau.png
parallax.factor = 10
parallax.depth = 9
parallax.enable = true
parallax.tex = BG2_Berge_gau.png
parallax.factor = 8
parallax.depth = 8
parallax.offset = -350
parallax.enable = true
parallax.tex = BG3_Berge_gruen.png
parallax.factor = 6
parallax.depth = 7
parallax.offset = 100
parallax.enable = true
block-size = 60
.P = [player]
.S = [spawn]

View file

@ -9,6 +9,7 @@ use bevy_rapier2d::prelude::{Collider, *};
use readformat::{readf, readf1};
use crate::game::WORLD_DEPTH;
use crate::parallax::{parallax, Parallax};
use crate::AppState;
use super::player::PlayerSpawnOneshot;
@ -77,6 +78,7 @@ pub(super) fn import_text_world(
};
let mut wi = WorldInfo::default();
let mut parallax_info = Parallax::default();
for line in info_string.lines() {
let [name, val] = &readf(" {} = {}", line).expect("invalid line in info section")[..]
else {
@ -85,6 +87,29 @@ pub(super) fn import_text_world(
match name.as_str() {
"block-size" => wi.block_size = val.parse().unwrap(),
"parallax.offset" => parallax_info.offset = val.parse().unwrap(),
"parallax.size" => {
parallax_info.size = {
let x = readf("{}x{}", val).unwrap();
Vec2::new(x[0].parse().unwrap(), x[1].parse().unwrap())
}
}
"parallax.tiles" => parallax_info.tiles = val.parse().unwrap(),
"parallax.tex" => parallax_info.tex = val.clone(),
"parallax.factor" => parallax_info.factor = val.parse().unwrap(),
"parallax.factor.y" => parallax_info.y_factor = val.parse().unwrap(),
"parallax.depth" => parallax_info.depth = val.parse().unwrap(),
"parallax.enable" => {
if val == "true" {
parallax(
&mut commands,
&mut materials,
&mut meshes,
&assets,
parallax_info.clone(),
)
}
}
x if x.starts_with(".") => {
let x = readf1(".{}", x).unwrap();
wi.blocks.push((x, val.to_owned()));

View file

@ -2,6 +2,7 @@
use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use game::game_plugin;
use parallax::parallax_plugin;
mod game;
mod parallax;
@ -42,6 +43,7 @@ fn main() {
//.add_plugins(RapierDebugRenderPlugin::default())
.add_systems(Startup, setup_camera)
.add_plugins(game_plugin)
.add_plugins(parallax_plugin)
.init_state::<AppState>()
.init_state::<PausedState>()
.insert_state(AppState::InGame) // TODO dont

View file

@ -1 +1,87 @@
use bevy::prelude::*;
use bevy::{
prelude::*,
render::{
primitives::Aabb,
view::{NoFrustumCulling, VisibilitySystems},
},
sprite::MaterialMesh2dBundle,
};
use bevy_rapier2d::parry::simba::scalar::SupersetOf;
#[derive(Component)]
pub struct ParallaxTile(usize);
#[derive(Component, Clone)]
pub struct Parallax {
pub offset: f32,
pub factor: f32,
pub y_factor: f32,
pub size: Vec2,
pub depth: f32,
pub tiles: usize,
pub tex: String,
}
impl Default for Parallax {
fn default() -> Self {
Self {
offset: 0.,
factor: 10.,
y_factor: 10.,
size: Vec2::new(2000., 1000.),
depth: 100.,
tiles: 4,
tex: "".to_owned(),
}
}
}
pub fn parallax_plugin(app: &mut App) {
app.add_systems(Update, (update_parallax,));
}
pub fn parallax(
commands: &mut Commands,
materials: &mut ResMut<Assets<ColorMaterial>>,
meshes: &mut ResMut<Assets<Mesh>>,
assets: &Res<AssetServer>,
parallax_info: Parallax,
) {
for i in 0..parallax_info.tiles {
commands.spawn((
ParallaxTile(i),
parallax_info.clone(),
MaterialMesh2dBundle {
mesh: meshes.add(Rectangle::from_size(parallax_info.size)).into(),
material: materials.add(assets.load(parallax_info.tex.clone())),
transform: Transform::from_xyz(0.0, 0.0, -parallax_info.depth),
visibility: Visibility::Visible,
..Default::default()
},
NoFrustumCulling,
));
}
}
fn update_parallax(
mut commands: Commands,
mut query: Query<(Entity, &Parallax, &ParallaxTile, &mut Transform)>,
camera_query: Query<(&Camera2d, &Transform), (Without<Parallax>)>,
) {
let (_, cam_transform) = camera_query.single();
let cam_transform = cam_transform.translation;
for (entity, parallax_info, ParallaxTile(tile), mut transform) in query.iter_mut() {
let position_on_parallax = cam_transform.xy()
- Vec2::new(
cam_transform.x / parallax_info.factor,
cam_transform.y / parallax_info.y_factor,
);
let first_parallax_on_cam =
(position_on_parallax / parallax_info.size).floor() * parallax_info.size;
let position = first_parallax_on_cam
+ Vec2::new(*tile as f32, 0.) * parallax_info.size
+ position_on_parallax % parallax_info.size;
transform.translation =
position.extend(-parallax_info.depth) + Vec3::new(0., parallax_info.offset, 0.);
}
}