feat: Player, assets and basic movement
14
Cargo.lock
generated
|
|
@ -1377,13 +1377,6 @@ dependencies = [
|
|||
"pin-project",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bevy_template"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"bevy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bevy_text"
|
||||
version = "0.18.0"
|
||||
|
|
@ -2275,6 +2268,13 @@ dependencies = [
|
|||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "expedition_demo"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"bevy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "2.3.0"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
cargo-features = ["codegen-backend"]
|
||||
|
||||
[package]
|
||||
name = "bevy_template"
|
||||
name = "expedition_demo"
|
||||
version = "0.1.0"
|
||||
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::*;
|
||||
|
||||
#[derive(Component)]
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
use expedition_demo::ExpeditionPlugin;
|
||||
|
||||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
.add_plugins(HelloPlugin)
|
||||
.add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest()))
|
||||
.add_plugins(ExpeditionPlugin)
|
||||
.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;
|
||||
}
|
||||
}
|
||||
}
|
||||