add player model and zooming
parent
b52b1b0d42
commit
96453bfd49
Binary file not shown.
|
@ -15,11 +15,10 @@ fn fragment(
|
||||||
@builtin(position) position: vec4<f32>,
|
@builtin(position) position: vec4<f32>,
|
||||||
#import bevy_sprite::mesh2d_vertex_output
|
#import bevy_sprite::mesh2d_vertex_output
|
||||||
) -> @location(0) vec4<f32> {
|
) -> @location(0) vec4<f32> {
|
||||||
// Get screen position with coordinates from 0 to 1
|
|
||||||
let uv = position.xy / vec2<f32>(view.width, view.height);
|
let uv = position.xy / vec2<f32>(view.width, view.height);
|
||||||
let uv = floor(uv * 400.0) / 400.0;
|
let uv = floor(uv * 400.0) / 400.0;
|
||||||
|
|
||||||
let col = textureSample(texture, our_sampler, uv);
|
let col = texturesample(texture, our_sampler, uv);
|
||||||
|
|
||||||
return round(col * 50.0) / 50.0;
|
return round(col * 50.0) / 50.0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,9 @@ use crate::{pillar::UnlitPillar, player::*};
|
||||||
pub struct MyRaycastSet;
|
pub struct MyRaycastSet;
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
pub struct Camera;
|
pub struct Camera {
|
||||||
|
distance_to_player: f32,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn spawn_camera(
|
pub fn spawn_camera(
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
|
@ -66,7 +68,9 @@ pub fn spawn_camera(
|
||||||
},
|
},
|
||||||
..default()
|
..default()
|
||||||
})
|
})
|
||||||
.insert(Camera)
|
.insert(Camera {
|
||||||
|
distance_to_player: 100.0,
|
||||||
|
})
|
||||||
.insert(RayCastSource::<MyRaycastSet>::new());
|
.insert(RayCastSource::<MyRaycastSet>::new());
|
||||||
|
|
||||||
// This specifies the layer used for the post processing camera, which will be attached to the post processing camera and 2d quad.
|
// This specifies the layer used for the post processing camera, which will be attached to the post processing camera and 2d quad.
|
||||||
|
@ -139,8 +143,8 @@ pub fn camera_follow_player(
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
for (mut trans, _) in camera.iter_mut() {
|
for (mut trans, camera) in camera.iter_mut() {
|
||||||
trans.translation = player_pos + Vec3::new(-100.0, 200.0, 100.0);
|
trans.translation = player_pos + Vec3::new(-1.0, 2.0, 1.0) * camera.distance_to_player;
|
||||||
trans.look_at(player_pos, Vec3::Y);
|
trans.look_at(player_pos, Vec3::Y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -195,3 +199,11 @@ pub fn update_processed_mouse_coords(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn update_distance_to_player(input: Res<Input<KeyCode>>, mut camera: Query<&mut Camera>) {
|
||||||
|
let pressed = input.pressed(KeyCode::Space);
|
||||||
|
for mut camera in &mut camera {
|
||||||
|
let dis = if pressed { 20.0 } else { 100.0 };
|
||||||
|
camera.distance_to_player += (dis - camera.distance_to_player) / 80.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -51,12 +51,15 @@ fn main() {
|
||||||
.add_system_set(
|
.add_system_set(
|
||||||
SystemSet::on_enter(AppState::Game)
|
SystemSet::on_enter(AppState::Game)
|
||||||
.with_system(setup)
|
.with_system(setup)
|
||||||
|
.with_system(spawn_player)
|
||||||
.with_system(spawn_camera),
|
.with_system(spawn_camera),
|
||||||
)
|
)
|
||||||
.add_system_set(
|
.add_system_set(
|
||||||
SystemSet::on_update(AppState::Game)
|
SystemSet::on_update(AppState::Game)
|
||||||
|
.with_system(setup_scene_once_loaded)
|
||||||
.with_system(update_raw_mouse_coords)
|
.with_system(update_raw_mouse_coords)
|
||||||
.with_system(update_processed_mouse_coords)
|
.with_system(update_processed_mouse_coords)
|
||||||
|
.with_system(update_distance_to_player)
|
||||||
.with_system(close_on_esc)
|
.with_system(close_on_esc)
|
||||||
.with_system(light_movement)
|
.with_system(light_movement)
|
||||||
.with_system(move_light_friends)
|
.with_system(move_light_friends)
|
||||||
|
@ -137,9 +140,6 @@ fn setup(
|
||||||
Vec3::new(30.0, 1.0, 50.0),
|
Vec3::new(30.0, 1.0, 50.0),
|
||||||
);
|
);
|
||||||
|
|
||||||
// player
|
|
||||||
spawn_player(&mut commands, &mut meshes, &mut materials);
|
|
||||||
|
|
||||||
// light balls
|
// light balls
|
||||||
for i in 2..12 {
|
for i in 2..12 {
|
||||||
spawn_light_ball(
|
spawn_light_ball(
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use bevy::prelude::*;
|
use bevy::{prelude::*, render::view::NoFrustumCulling};
|
||||||
|
|
||||||
use crate::{camera::MouseCoords, illumination::Illumination, pillar::PillarActivationProgress};
|
use crate::{camera::MouseCoords, illumination::Illumination, pillar::PillarActivationProgress};
|
||||||
|
|
||||||
|
@ -9,27 +9,41 @@ pub struct PlayerLight {
|
||||||
i: u8,
|
i: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct PlayerAnimations {
|
||||||
|
idle: Handle<AnimationClip>,
|
||||||
|
run: Handle<AnimationClip>,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn spawn_player(
|
pub fn spawn_player(
|
||||||
commands: &mut Commands,
|
mut commands: Commands,
|
||||||
meshes: &mut Assets<Mesh>,
|
asset_server: Res<AssetServer>,
|
||||||
materials: &mut Assets<StandardMaterial>,
|
mut meshes: ResMut<Assets<Mesh>>,
|
||||||
|
mut materials: ResMut<Assets<StandardMaterial>>,
|
||||||
) {
|
) {
|
||||||
|
// Insert a resource with the current scene information
|
||||||
|
commands.insert_resource(PlayerAnimations {
|
||||||
|
idle: asset_server.load("models/scout_girl.glb#Animation0"),
|
||||||
|
run: asset_server.load("models/scout_girl.glb#Animation1"),
|
||||||
|
});
|
||||||
|
|
||||||
commands
|
commands
|
||||||
.spawn_bundle(PbrBundle {
|
.spawn_bundle(SpatialBundle {
|
||||||
mesh: meshes.add(Mesh::from(shape::Capsule {
|
|
||||||
radius: 0.5,
|
|
||||||
..Default::default()
|
|
||||||
})),
|
|
||||||
material: materials.add(Color::rgb(1.0, 1.0, 1.0).into()),
|
|
||||||
transform: Transform::from_xyz(0.0, 1.0, 0.0),
|
transform: Transform::from_xyz(0.0, 1.0, 0.0),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
.insert(Player);
|
.insert(Player)
|
||||||
|
.add_children(|parent| {
|
||||||
|
parent.spawn_bundle(SceneBundle {
|
||||||
|
scene: asset_server.load("models/scout_girl.glb#Scene0"),
|
||||||
|
..default()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// light
|
// light
|
||||||
commands
|
commands
|
||||||
.spawn_bundle(SpatialBundle::default())
|
.spawn_bundle(SpatialBundle::default())
|
||||||
.insert(LightFriends)
|
.insert(LightFriends)
|
||||||
|
.insert(NoFrustumCulling)
|
||||||
.with_children(|children| {
|
.with_children(|children| {
|
||||||
let count = 6;
|
let count = 6;
|
||||||
for i in 0..count {
|
for i in 0..count {
|
||||||
|
@ -59,12 +73,26 @@ pub fn spawn_player(
|
||||||
},
|
},
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
|
.insert(NoFrustumCulling)
|
||||||
.insert(PlayerLight { i: i as u8 + 1 })
|
.insert(PlayerLight { i: i as u8 + 1 })
|
||||||
.insert(Illumination { radius: 13.0 });
|
.insert(Illumination { radius: 13.0 });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn setup_scene_once_loaded(
|
||||||
|
animations: Res<PlayerAnimations>,
|
||||||
|
mut player: Query<&mut AnimationPlayer>,
|
||||||
|
mut done: Local<bool>,
|
||||||
|
) {
|
||||||
|
if !*done {
|
||||||
|
if let Ok(mut player) = player.get_single_mut() {
|
||||||
|
player.play(animations.idle.clone_weak()).repeat();
|
||||||
|
*done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
pub struct LightFriends;
|
pub struct LightFriends;
|
||||||
pub fn move_light_friends(
|
pub fn move_light_friends(
|
||||||
|
@ -150,21 +178,51 @@ pub fn move_player(
|
||||||
mut query: Query<(&mut Transform, &Player)>,
|
mut query: Query<(&mut Transform, &Player)>,
|
||||||
input: Res<Input<KeyCode>>,
|
input: Res<Input<KeyCode>>,
|
||||||
time: Res<Time>,
|
time: Res<Time>,
|
||||||
|
animations: Res<PlayerAnimations>,
|
||||||
|
mut animation_player: Query<&mut AnimationPlayer>,
|
||||||
|
mut is_walking: Local<bool>,
|
||||||
) {
|
) {
|
||||||
let ds = time.delta_seconds() * 5.0;
|
let ds = time.delta_seconds() * 5.0;
|
||||||
|
|
||||||
|
let mut anim = if let Ok(player) = animation_player.get_single_mut() {
|
||||||
|
player
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
for (mut transform, _) in query.iter_mut() {
|
for (mut transform, _) in query.iter_mut() {
|
||||||
|
let mut delta = Vec3::ZERO;
|
||||||
if input.pressed(KeyCode::W) {
|
if input.pressed(KeyCode::W) {
|
||||||
transform.translation += Vec3::X * ds;
|
delta += Vec3::X;
|
||||||
}
|
}
|
||||||
if input.pressed(KeyCode::S) {
|
if input.pressed(KeyCode::S) {
|
||||||
transform.translation -= Vec3::X * ds;
|
delta -= Vec3::X;
|
||||||
}
|
}
|
||||||
if input.pressed(KeyCode::A) {
|
if input.pressed(KeyCode::A) {
|
||||||
transform.translation -= Vec3::Z * ds;
|
delta -= Vec3::Z;
|
||||||
}
|
}
|
||||||
if input.pressed(KeyCode::D) {
|
if input.pressed(KeyCode::D) {
|
||||||
transform.translation += Vec3::Z * ds;
|
delta += Vec3::Z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !*is_walking && delta.length_squared() > 0.2 {
|
||||||
|
anim.play(animations.run.clone_weak()).repeat();
|
||||||
|
anim.set_speed(0.5);
|
||||||
|
*is_walking = true;
|
||||||
|
}
|
||||||
|
if *is_walking && delta.length_squared() < 0.2 {
|
||||||
|
anim.play(animations.idle.clone_weak()).repeat();
|
||||||
|
anim.set_speed(1.0);
|
||||||
|
*is_walking = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if delta.length_squared() > 0.2 {
|
||||||
|
let mut ct = *transform;
|
||||||
|
ct.look_at(transform.translation - delta, Vec3::Y);
|
||||||
|
let rot = transform.rotation.slerp(ct.rotation, ds * 2.0);
|
||||||
|
transform.rotation = rot;
|
||||||
|
}
|
||||||
|
|
||||||
|
transform.translation += delta * ds;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue