Guest User

Untitled

a guest
Jan 24th, 2023
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 8.11 KB | Source Code | 0 0
  1. use bevy::{prelude::*, sprite::collide_aabb::collide, asset::LoadState};
  2.  
  3. use crate::{SIZE, map::TileCollider, TILESIZE, TILEDIST, Animator, Animations, AnimationTimer};
  4.  
  5. pub struct BoxPlugin;
  6.  
  7. #[derive(Bundle)]
  8. struct PlayerBundle {
  9.     #[bundle]
  10.     sprite_bundle: SpriteSheetBundle,
  11.     player: Player,
  12.     animator: Animator,
  13.     animations: Animations,
  14. }
  15.  
  16. impl Plugin for BoxPlugin {
  17.     fn build(&self, app: &mut App) {
  18.         app
  19.             .add_state(AppState::Setup)
  20.             .add_system_set(
  21.                 SystemSet::on_enter(AppState::Setup)
  22.                     .with_system(resource_gen)
  23.             )
  24.             .add_system_set(
  25.                 SystemSet::on_update(AppState::Setup)
  26.                     .with_system(check_textures)
  27.             )
  28.             .add_system_set(
  29.                 SystemSet::on_enter(AppState::Finished)
  30.                     .with_system(texture_loading)
  31.             )
  32.             .add_system_set(
  33.                 SystemSet::on_update(AppState::Finished)
  34.                     .with_system(move_box)
  35.                     .with_system(change_texture_atlas)
  36.             );
  37.             // .add_startup_system(spawn_box);
  38.             // .add_startup_system(spawn_box)
  39.             // .add_system(move_box);
  40.             // .add_system(camera_follow);
  41.     }
  42. }
  43.  
  44. #[derive(Debug, Clone, PartialEq, Eq, Hash)]
  45. enum AppState {
  46.     Setup,
  47.     Finished,
  48. }
  49.  
  50.  
  51. #[derive(Component, Reflect, Default)]
  52. #[reflect(Component)]
  53. pub struct Player {
  54.     speed: f32,
  55.     is_moving: bool,
  56.     idle: Handle<TextureAtlas>,
  57.     run: Handle<TextureAtlas>,
  58.     direction: f32,
  59. }
  60. #[derive(Resource, Default)]
  61. pub struct PlayerAssets {
  62.     pub idle: Vec<HandleUntyped>,
  63.     pub run: Vec<HandleUntyped>,
  64. }
  65.  
  66. //Generate PlayerAsset
  67. fn resource_gen(mut commands: Commands, asset_server: Res<AssetServer>) {
  68.     let mut plr_assets = PlayerAssets::default();
  69.     plr_assets.idle = asset_server.load_folder("dungeon_sprites/frames/skeleton/idle").unwrap();
  70.     plr_assets.run = asset_server.load_folder("dungeon_sprites/frames/skeleton/run").unwrap();
  71.     commands.insert_resource(plr_assets);
  72.     println!("GameAssets Loaded");    
  73. }
  74.  
  75. fn check_textures(
  76.     mut state: ResMut<State<AppState>>,
  77.     game_assets: ResMut<PlayerAssets>,
  78.     asset_server: Res<AssetServer>,
  79. ) {
  80.     if let LoadState::Loaded = asset_server
  81.         .get_group_load_state(
  82.             game_assets.idle.iter().map( |handle| handle.id )
  83.         )
  84.     {
  85.         state.set(AppState::Finished).unwrap();
  86.     }
  87. }
  88.  
  89. fn create_texture(
  90.     sprites: Vec<HandleUntyped>,
  91.     asset_server: &Res<AssetServer>,
  92.     texture_atlases: &mut ResMut<Assets<TextureAtlas>>,
  93.     mut textures: &mut ResMut<Assets<Image>>
  94. ) -> Handle<TextureAtlas> {
  95.     let mut texture_atlas_builder = TextureAtlasBuilder::default();
  96.     for handle in &sprites {
  97.         let handle = handle.typed_weak();
  98.         let Some(texture) = textures.get(&handle) else {
  99.             warn!("{:?} did not resolve to an `Image` asset.", asset_server.get_handle_path(handle));
  100.             continue;
  101.         };
  102.         texture_atlas_builder.add_texture(handle, texture);
  103.     }
  104.     let texture_atlas = texture_atlas_builder.finish(&mut textures).unwrap();
  105.     let texture_atlas_handle = texture_atlases.add(texture_atlas);
  106.     texture_atlas_handle
  107. }
  108.  
  109. fn texture_loading(
  110.     mut commands: Commands,
  111.     plr_assets: Res<PlayerAssets>,
  112.     asset_server: Res<AssetServer>,
  113.     mut texture_atlases: ResMut<Assets<TextureAtlas>>,
  114.     mut textures: ResMut<Assets<Image>>,
  115. ) {
  116.     let run = create_texture(plr_assets.run.clone(), &asset_server, &mut texture_atlases, &mut textures);
  117.     let idle = create_texture(plr_assets.idle.clone(), &asset_server, &mut texture_atlases, &mut textures);
  118.     //  let animation1 =
  119.      // let plr_bundle = PlayerBundle {
  120.     //     player: Player { speed: 3. * 100., is_moving: false, direction: 1. },
  121.     //     sprite_bundle: SpriteSheetBundle {
  122.     //         texture_atlas: idle.clone(),
  123.     //         transform: Transform {
  124.     //             translation: Vec3::new(0.0, 0.0, 2.0),
  125.     //             scale: Vec3::splat(SIZE),
  126.     //             ..default()
  127.     //         },
  128.     //         ..default()
  129.     //     },
  130.     //     animator: Animator {
  131.     //         animations: Animations {
  132.     //             idle: 0..4,
  133.     //             run: 0..6,
  134.     //         },
  135.     //         current_animation: 0..4,
  136.     //         current_frame: 0,
  137.     //         timer: Timer::from_seconds(0.1, TimerMode::Repeating),
  138.     //     },
  139.     //     animations: Animations {
  140.     //        
  141.     //        
  142.     //     },
  143.     // }
  144.     commands.spawn((SpriteSheetBundle {
  145.         texture_atlas: idle.clone(),
  146.         transform: Transform {
  147.             translation: Vec3::new(0.0, 0.0, 2.0),
  148.             scale: Vec3::splat(SIZE),
  149.             ..default()
  150.         },
  151.         ..default()
  152.         },
  153.         AnimationTimer(Timer::from_seconds(0.1, TimerMode::Repeating)),
  154.     ))
  155.     .insert(Name::new("Player"))
  156.     .insert(Player {
  157.             speed: 3. * 100.,
  158.             is_moving: false,
  159.             idle,
  160.             run,
  161.             direction: 1.,
  162.         });
  163. }
  164.  
  165.  
  166.  
  167. fn change_texture_atlas(
  168.     mut player: Query<(&mut Handle<TextureAtlas>, &Player), With<Player>>,
  169. )
  170. {
  171.     for (mut texture_atlas, player) in &mut player {
  172.         if player.is_moving {
  173.             *texture_atlas = player.run.clone();
  174.         } else {
  175.             *texture_atlas = player.idle.clone();
  176.         }
  177.     }  
  178. }
  179. fn change_direciton(
  180.     mut player: Query<(&mut Transform, &Player), With<Player>>,
  181. )
  182. {
  183.     for (mut transform, player) in &mut player {
  184.         if player.direction == -1. {
  185.             //Change scale
  186.             transform.scale = Vec3::new(-1. * SIZE, SIZE, SIZE);
  187.         } else {
  188.             //Change scale
  189.             transform.scale = Vec3::new(SIZE, SIZE, SIZE);
  190.         }
  191.     }
  192. }
  193.  
  194. fn move_box(
  195.     keyboard_input: Res<Input<KeyCode>>,
  196.     mut query: Query<(&mut Transform, &mut Player),With<Player>>,
  197.     collider_query: Query<&Transform, (With<TileCollider>, Without<Player>)>,
  198.     time: Res<Time>
  199. ) {
  200.     let mut change_x: f32 = 0.0;
  201.     let mut change_y: f32 = 0.0;
  202.     let (mut transform, mut square) = query.single_mut(); //As long as there is one player this should work. If there's another player include networking and rollback
  203.     let velocity = square.speed * time.delta_seconds();
  204.     if keyboard_input.pressed(KeyCode::Left) || keyboard_input.pressed(KeyCode::Right) || keyboard_input.pressed(KeyCode::Up) || keyboard_input.pressed(KeyCode::Down) {
  205.        square.is_moving = true;
  206.     }
  207.     else {
  208.         square.is_moving = false;
  209.     }
  210.     if keyboard_input.pressed(KeyCode::Left) {
  211.          change_x -= velocity;
  212.  
  213.     }
  214.     if keyboard_input.pressed(KeyCode::Right) {
  215.         change_x += velocity;
  216.     }
  217.     if keyboard_input.pressed(KeyCode::Up) {
  218.         change_y += velocity;
  219.     }
  220.     if keyboard_input.pressed(KeyCode::Down) {
  221.         change_y -= velocity;
  222.     }
  223.     let target = transform.translation + Vec3::new(change_x,0.,0.);
  224.     if !collider_query.iter().any(|&transform| wall_collision_check(target, transform.translation)) {
  225.         transform.translation = target;
  226.     }
  227.     let target = transform.translation + Vec3::new(0., change_y, 0.);
  228.     if !collider_query.iter().any(|&transform| wall_collision_check(target, transform.translation)) {
  229.         transform.translation = target;
  230.     }        
  231. }
  232.  
  233. fn wall_collision_check(
  234.     target_player_pos: Vec3,
  235.     wall_translation: Vec3,
  236. )-> bool
  237. {
  238.         let collision = collide(
  239.             target_player_pos,
  240.             Vec2::splat(TILEDIST * 0.8),
  241.             wall_translation,
  242.             Vec2::splat(TILEDIST)
  243.         );
  244.         collision.is_some()
  245. }
  246.  
  247. fn camera_follow(
  248.     player: Query<&Transform, With<Player>>,
  249.     mut camera: Query<&mut Transform, (Without<Player>, With<Camera>)>,
  250. ) {
  251.     let player_transform = player.single();
  252.     let mut camera_transform = camera.single_mut();
  253.     camera_transform.translation.x = player_transform.translation.x;
  254.     camera_transform.translation.y = player_transform.translation.y;
  255. }
  256.  
Tags: bevy
Advertisement
Add Comment
Please, Sign In to add comment