A Quadrilateral Cowboy clone intended to help me learn Game Dev

The terminal now renders, yay

+47 -11
+3
Cargo.lock
··· 563 563 "bevy_asset", 564 564 "bevy_asset_loader_derive", 565 565 "bevy_ecs", 566 + "bevy_image", 566 567 "bevy_log", 568 + "bevy_pbr", 567 569 "bevy_platform", 568 570 "bevy_reflect", 571 + "bevy_render", 569 572 "bevy_state", 570 573 "bevy_utils", 571 574 "path-slash",
+1 -1
Cargo.toml
··· 6 6 [dependencies] 7 7 bevy = "0.18.0" 8 8 bevy-inspector-egui = "0.36.0" 9 - bevy_asset_loader = "0.25.0" 9 + bevy_asset_loader = { version = "0.25.0", features = ["3d"] } 10 10 bevy_flycam = "0.18.0"
+5 -5
src/game.rs
··· 1 1 use bevy::prelude::*; 2 - use bevy_asset_loader::prelude::*; 3 2 4 3 #[derive(States, Debug, Clone, PartialEq, Eq, Hash, Default)] 5 4 pub enum GameState { 6 5 #[default] 6 + TestLoading, 7 + Test, 7 8 Loading, 8 9 Main, 9 10 LoadingLevel(String), 10 11 Level(String) 11 12 } 12 13 13 - #[derive(AssetCollection, Resource)] 14 - pub struct TerminalAssets { 15 - #[asset(path="models/terminal.glb")] 16 - mesh: Handle<Mesh> 14 + #[derive(Resource)] 15 + pub struct GameAssets { 16 + pub terminal: Handle<Scene> 17 17 }
+38 -3
src/level.rs
··· 1 1 use bevy::prelude::*; 2 2 3 + use crate::game::{GameAssets, GameState}; 4 + 3 5 pub fn plugin(app: &mut App) { 4 - app.add_systems(OnEnter(crate::game::GameState::Loading), check_levels); 6 + app.add_systems(OnEnter(GameState::Loading), check_levels) 7 + .add_systems(OnEnter(GameState::Test), run_test) 8 + .add_systems(OnEnter(GameState::TestLoading), load_resources); 5 9 } 6 10 7 11 #[derive(Resource, Default)] ··· 9 13 pub levels: Vec<(String, String)> 10 14 } 11 15 12 - fn check_levels(mut manifest: ResMut<LevelManifest>, mut next_state: ResMut<NextState<crate::game::GameState>>) { 16 + fn check_levels(mut manifest: ResMut<LevelManifest>, mut next_state: ResMut<NextState<GameState>>) { 13 17 let path = "assets/levels"; 14 18 15 19 if let Ok(entries) = std::fs::read_dir(path) { ··· 31 35 } 32 36 } 33 37 34 - next_state.set(crate::game::GameState::Main); 38 + next_state.set(GameState::Main); 39 + } 40 + 41 + fn load_resources(mut commands: Commands, asset_server: Res<AssetServer>, mut next_state: ResMut<NextState<GameState>>) { 42 + let assets = GameAssets{ 43 + terminal: asset_server.load("models/terminal.glb#Scene0") 44 + }; 45 + commands.insert_resource(assets); 46 + next_state.set(GameState::Test); 47 + } 48 + 49 + fn run_test(mut commands: Commands, game_assets: Res<GameAssets>) { 50 + println!("in run_test"); 51 + // terminal mesh 52 + commands.spawn(( 53 + SceneRoot(game_assets.terminal.clone()), 54 + Transform::from_translation(Vec3::ZERO).with_rotation(Quat::from_rotation_y(-std::f32::consts::FRAC_PI_2)) 55 + )); 56 + // light 57 + commands.spawn(( 58 + PointLight{ 59 + shadows_enabled: true, 60 + ..default() 61 + }, 62 + Transform::from_xyz(4.0, 8.0, 4.0).looking_at(Vec3::ZERO, Vec3::Y) 63 + )); 64 + // camera 65 + commands.spawn(( 66 + Camera3d::default(), 67 + Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y), 68 + AmbientLight::default() 69 + )); 35 70 }
-2
src/main.rs
··· 1 1 use bevy::prelude::*; 2 2 use bevy_inspector_egui::{bevy_egui::EguiPlugin, quick::WorldInspectorPlugin}; 3 - use bevy_flycam::prelude::*; 4 3 5 4 mod game; 6 5 mod level; ··· 8 7 fn main() { 9 8 App::new() 10 9 .add_plugins(DefaultPlugins) 11 - .add_plugins(PlayerPlugin) 12 10 .add_plugins(EguiPlugin::default()) 13 11 .add_plugins(WorldInspectorPlugin::new()) 14 12 .init_state::<game::GameState>()