feat: Player, assets and basic movement
14
Cargo.lock
generated
|
|
@ -1377,13 +1377,6 @@ dependencies = [
|
||||||
"pin-project",
|
"pin-project",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bevy_template"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"bevy",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bevy_text"
|
name = "bevy_text"
|
||||||
version = "0.18.0"
|
version = "0.18.0"
|
||||||
|
|
@ -2275,6 +2268,13 @@ dependencies = [
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "expedition_demo"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"bevy",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastrand"
|
name = "fastrand"
|
||||||
version = "2.3.0"
|
version = "2.3.0"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
cargo-features = ["codegen-backend"]
|
cargo-features = ["codegen-backend"]
|
||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "bevy_template"
|
name = "expedition_demo"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
|
|
|
||||||
BIN
assets/sprites/interactive/crate_closed.png
Normal file
|
After Width: | Height: | Size: 205 B |
BIN
assets/sprites/interactive/crate_opened.png
Normal file
|
After Width: | Height: | Size: 263 B |
BIN
assets/sprites/interactive/door_closed.png
Normal file
|
After Width: | Height: | Size: 129 B |
BIN
assets/sprites/interactive/door_opened.png
Normal file
|
After Width: | Height: | Size: 130 B |
BIN
assets/sprites/interactive/lamp.png
Normal file
|
After Width: | Height: | Size: 157 B |
BIN
assets/sprites/interactive/padlock.png
Normal file
|
After Width: | Height: | Size: 110 B |
BIN
assets/sprites/interactive/wardrobe.png
Normal file
|
After Width: | Height: | Size: 156 B |
BIN
assets/sprites/items/choco_bar.png
Normal file
|
After Width: | Height: | Size: 211 B |
BIN
assets/sprites/level/ceiling.png
Normal file
|
After Width: | Height: | Size: 113 B |
BIN
assets/sprites/level/floor.png
Normal file
|
After Width: | Height: | Size: 126 B |
BIN
assets/sprites/level/stairs_base.png
Normal file
|
After Width: | Height: | Size: 110 B |
BIN
assets/sprites/level/stairs_main.png
Normal file
|
After Width: | Height: | Size: 161 B |
BIN
assets/sprites/level/wall.png
Normal file
|
After Width: | Height: | Size: 138 B |
BIN
assets/sprites/level/wall_connector.png
Normal file
|
After Width: | Height: | Size: 171 B |
BIN
assets/sprites/level/window.png
Normal file
|
After Width: | Height: | Size: 111 B |
BIN
assets/sprites/player/player.png
Normal file
|
After Width: | Height: | Size: 199 B |
1
src/layout.rs
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
|
||||||
34
src/lib.rs
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
pub mod player;
|
||||||
|
pub mod layout;
|
||||||
|
|
||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
pub struct ExpeditionPlugin;
|
||||||
|
|
||||||
|
fn camera_bundle() -> impl Bundle {
|
||||||
|
(
|
||||||
|
Camera2d,
|
||||||
|
Camera {
|
||||||
|
clear_color: ClearColorConfig::Custom(Color::hsl(0.02, 0.67, 0.65)),
|
||||||
|
..default()
|
||||||
|
},
|
||||||
|
Projection::Orthographic(OrthographicProjection {
|
||||||
|
scaling_mode: bevy::camera::ScalingMode::FixedVertical {
|
||||||
|
viewport_height: 384.,
|
||||||
|
},
|
||||||
|
scale: 1.,
|
||||||
|
..OrthographicProjection::default_2d()
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn setup_global(mut commands: Commands) {
|
||||||
|
commands.spawn(camera_bundle());
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Plugin for ExpeditionPlugin {
|
||||||
|
fn build(&self, app: &mut App) {
|
||||||
|
app.add_systems(Startup, (player::setup_player, setup_global))
|
||||||
|
.add_systems(Update, player::handle_input);
|
||||||
|
}
|
||||||
|
}
|
||||||
50
src/main.rs
|
|
@ -1,54 +1,10 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
#[derive(Component)]
|
use expedition_demo::ExpeditionPlugin;
|
||||||
struct Person;
|
|
||||||
|
|
||||||
#[derive(Component)]
|
|
||||||
struct Name(String);
|
|
||||||
|
|
||||||
#[derive(Resource)]
|
|
||||||
struct GreetTimer(Timer);
|
|
||||||
|
|
||||||
#[derive(Resource)]
|
|
||||||
struct UpdateTimer(Timer);
|
|
||||||
|
|
||||||
pub struct HelloPlugin;
|
|
||||||
|
|
||||||
impl Plugin for HelloPlugin {
|
|
||||||
fn build(&self, app: &mut App) {
|
|
||||||
app.insert_resource(GreetTimer(Timer::from_seconds(2.0, TimerMode::Repeating)));
|
|
||||||
app.insert_resource(UpdateTimer(Timer::from_seconds(10.0, TimerMode::Once)));
|
|
||||||
app.add_systems(Startup, add_people);
|
|
||||||
app.add_systems(Update, (update_people, greet_people).chain());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fn add_people(mut commands: Commands) {
|
|
||||||
commands.spawn((Person, Name("Alkesey Mirnekov".to_string())));
|
|
||||||
commands.spawn((Person, Name("Alkesey Mirnekov 2".to_string())));
|
|
||||||
commands.spawn((Person, Name("Alkesey Mirnekov 3".to_string())));
|
|
||||||
}
|
|
||||||
|
|
||||||
fn greet_people(time: Res<Time>, mut timer: ResMut<GreetTimer>, query: Query<&Name, With<Person>>) {
|
|
||||||
if timer.0.tick(time.delta()).just_finished() {
|
|
||||||
for name in &query {
|
|
||||||
println!("hello {}!", name.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn update_people(time: Res<Time>, mut timer: ResMut<UpdateTimer>, mut query: Query<&mut Name, With<Person>>) {
|
|
||||||
if timer.0.tick(time.delta()).just_finished() {
|
|
||||||
for mut name in &mut query {
|
|
||||||
name.0 = format!("{} II", name.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest()))
|
||||||
.add_plugins(HelloPlugin)
|
.add_plugins(ExpeditionPlugin)
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
41
src/player.rs
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct Player {
|
||||||
|
// px/s
|
||||||
|
speed: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn player_bundle(asset_server: &Res<AssetServer>) -> impl Bundle {
|
||||||
|
let image = asset_server.load("sprites/player/player.png");
|
||||||
|
(
|
||||||
|
Player {
|
||||||
|
speed: 51.2,
|
||||||
|
},
|
||||||
|
Sprite::from_image(image),
|
||||||
|
Transform::from_xyz(0f32, 0f32, 1f32),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn setup_player(mut commands: Commands, asset_server: Res<AssetServer>) {
|
||||||
|
commands.spawn(player_bundle(&asset_server));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn handle_input(
|
||||||
|
key_input: Res<ButtonInput<KeyCode>>,
|
||||||
|
time: Res<Time>,
|
||||||
|
player: Query<(&Player, &mut Transform, &mut Sprite)>,
|
||||||
|
) {
|
||||||
|
let exclusive_pressed = key_input.pressed(KeyCode::KeyA) != key_input.pressed(KeyCode::KeyD);
|
||||||
|
let direction = if !exclusive_pressed { 0f32 }
|
||||||
|
else if key_input.pressed(KeyCode::KeyA) { -1f32 }
|
||||||
|
else if key_input.pressed(KeyCode::KeyD) { 1f32 }
|
||||||
|
else { unreachable!() };
|
||||||
|
|
||||||
|
for (Player {speed}, mut transform, mut sprite) in player {
|
||||||
|
transform.translation.x += direction * speed * time.delta_secs();
|
||||||
|
if direction != 0f32 {
|
||||||
|
sprite.flip_x = direction < 0f32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||