Skip to content

Commit

Permalink
game: cache tilesets because wasm doesnt support asset-server caching
Browse files Browse the repository at this point in the history
  • Loading branch information
marijanp committed Oct 5, 2024
1 parent 602a78c commit e9e18f4
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 9 deletions.
13 changes: 7 additions & 6 deletions game/src/animation/systems.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ use bevy::prelude::*;
use bevy_rapier2d::prelude::{KinematicCharacterControllerOutput, Velocity};

use super::components::{AnimationIndices, AnimationTimer};
use crate::player::components::Player;
use crate::player::components::{Movement, Player};
use crate::Tilesets;

pub fn animate_sprite(
time: Res<Time>,
Expand Down Expand Up @@ -32,7 +33,7 @@ const DELTA: f32 = 10.0;

pub fn change_player_animation(
mut player: Query<AnimationRelated, With<Player>>,
asset_server: Res<AssetServer>,
tileset: Res<Tilesets<Movement>>,
) {
if let Ok((
velocity,
Expand All @@ -44,18 +45,18 @@ pub fn change_player_animation(
{
if character_controller.grounded {
if (-DELTA..=DELTA).contains(&velocity.linvel.x) {
*current_texture = asset_server.load("Main Characters/Mask Dude/Idle (32x32).png");
*current_texture = tileset.get(&Movement::Idle).unwrap().clone();
animation_indices.last = 10;
} else {
animation_indices.last = 10;
*current_texture = asset_server.load("Main Characters/Mask Dude/Run (32x32).png");
*current_texture = tileset.get(&Movement::Run).unwrap().clone();
}
} else if !character_controller.grounded && velocity.linvel.y > DELTA {
*current_texture = asset_server.load("Main Characters/Mask Dude/Jump (32x32).png");
*current_texture = tileset.get(&Movement::Jump).unwrap().clone();
animation_indices.last = 0;
} else if !character_controller.grounded && velocity.linvel.y < -DELTA {
animation_indices.last = 0;
*current_texture = asset_server.load("Main Characters/Mask Dude/Fall (32x32).png");
*current_texture = tileset.get(&Movement::Fall).unwrap().clone();
}
if velocity.linvel.x > DELTA {
sprite.flip_x = false;
Expand Down
14 changes: 13 additions & 1 deletion game/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use crate::cli::CliArgs;
use crate::collider::ColliderBundle;
use crate::fruit::components::FruitBundle;
use crate::player::components::{Player, PlayerBundle};
use std::collections::HashMap;

use bevy::prelude::*;
use bevy::window::PrimaryWindow;
Expand Down Expand Up @@ -45,7 +46,15 @@ impl Plugin for GamePlugin {
.add_plugins(player::PlayerPlugin)
.add_plugins(fruit::FruitPlugin)
.add_plugins(ui::UiPlugin)
.add_systems(OnEnter(AppState::InGame), (spawn_ground, touch_system));
.insert_resource(Tilesets::<player::components::Movement>::default())
.add_systems(
OnEnter(AppState::InGame),
(
spawn_ground,
touch_system,
player::systems::load_player_tilesets,
),
);
#[cfg(debug_assertions)]
app.add_plugins(RapierDebugRenderPlugin::default());
}
Expand Down Expand Up @@ -157,3 +166,6 @@ fn touch_system(
}
};
}

#[derive(Default, Deref, Resource)]
pub struct Tilesets<T>(pub HashMap<T, Handle<Image>>);
10 changes: 10 additions & 0 deletions game/src/player/components.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@ use leafwing_input_manager::InputManagerBundle;
use crate::animation::components::{AnimationIndices, AnimationTimer};
use crate::{Action, ColliderBundle};

#[derive(Default, Hash, PartialEq, Eq)]
pub enum Movement {
#[default]
Idle,
Run,
Jump,
Fall,
}

#[derive(Default, Component)]
pub struct Player;

Expand All @@ -29,6 +38,7 @@ pub struct PlayerBundle {
fn animation_indices(_: &EntityInstance) -> AnimationIndices {
AnimationIndices { first: 0, last: 10 }
}

fn animation_timer(_: &EntityInstance) -> AnimationTimer {
AnimationTimer(Timer::from_seconds(0.1, TimerMode::Repeating))
}
Expand Down
24 changes: 22 additions & 2 deletions game/src/player/systems.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,32 @@
use bevy::prelude::*;
use bevy::window::PrimaryWindow;
use bevy_rapier2d::prelude::*;
use std::collections::HashMap;

use leafwing_input_manager::prelude::*;

use crate::fruit::components::Fruit;
use crate::player::{components::Player, PLAYER_HEIGHT, PLAYER_WIDTH};
use crate::Action;
use crate::player::{
components::{Movement, Player},
PLAYER_HEIGHT, PLAYER_WIDTH,
};
use crate::{Action, Tilesets};

pub fn load_player_tilesets(
asset_server: Res<AssetServer>,
mut tileset: ResMut<Tilesets<Movement>>,
) {
let idle_tileset = asset_server.load("Main Characters/Mask Dude/Idle (32x32).png");
let run_tileset = asset_server.load("Main Characters/Mask Dude/Run (32x32).png");
let jump_tileset = asset_server.load("Main Characters/Mask Dude/Jump (32x32).png");
let fall_tileset = asset_server.load("Main Characters/Mask Dude/Fall (32x32).png");
*tileset = Tilesets(HashMap::from([
(Movement::Idle, idle_tileset),
(Movement::Run, run_tileset),
(Movement::Jump, jump_tileset),
(Movement::Fall, fall_tileset),
]));
}

pub fn despawn(mut commands: Commands, enemy_entity_query: Query<Entity, With<Player>>) {
if let Ok(player_entity) = enemy_entity_query.get_single() {
Expand Down

0 comments on commit e9e18f4

Please sign in to comment.