diff --git a/src/main.rs b/src/main.rs index 9111059f0bcddb33a456c6a6dd4cb3eada447a7a..11e983a8e1ba4288a18ba23f3b78154a807f2b6d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ #![allow(unused)] use bevy::{core::FixedTimestep, prelude::*}; +use std::f32::consts::PI; const PLAYER_SHEET: &str = "character_zombie_sheet.png"; fn main() { @@ -10,7 +11,8 @@ fn main() { width: 1920., height: 1080., vsync: true, - resizable: false, + cursor_visible: false, + // resizable: false, ..Default::default() }) .add_startup_system(setup.system()) @@ -48,24 +50,32 @@ fn setup( }, ..Default::default() }) - .insert(Player::default()); + .insert(Player { + y: bottom / 2., + ..Player::default() + }); } -enum State { +#[derive(Copy, Clone)] +enum Direction { Right, Left, Idle, } pub struct Player { - state: State, + direction: Direction, + jump: bool, index: u32, + y: f32, } impl Default for Player { fn default() -> Self { Player { - state: State::Idle, + direction: Direction::Idle, + jump: false, index: 3, + y: 0., } } } @@ -76,44 +86,90 @@ fn player_movement( keyboard_input: Res<Input<KeyCode>>, ) { if let Ok((mut player, mut transform, mut sprite)) = query.single_mut() { - let (index, state, dir) = if keyboard_input.pressed(KeyCode::Right) { + let (index, state, dir) = if player.jump { + // already in jump + let mut index = player.index + 1; + match index { + 4 => { + sprite.index = 7; + } + 8 => { + sprite.index = 8; + } + 60 => { + sprite.index = 3; + } + _ => {} + }; + if index == 64 { + index = 0; + player.jump = false + }; + + if index > 8 && index < (60) { + transform.translation.y = + player.y + (((index - 8) as f32) * PI / (60.0 - 8.0)).sin() * 200.0; + } else { + transform.translation.y = player.y + } + + (index, player.direction, 0.) + } else if keyboard_input.pressed(KeyCode::Space) { + // start jump + player.jump = true; + sprite.index = 3; + let index = 0; + (index, player.direction, 0.) + } else if keyboard_input.pressed(KeyCode::Right) { sprite.flip_x = false; - match player.state { + match player.direction { // already walking - State::Right => { + Direction::Right => { let index = (player.index + 1) % 32; sprite.index = (4 * 9) + index / 4; - (index, State::Right, 2.) + (index, Direction::Right, 2.) } // starting walking _ => { let index = 3 * 4; sprite.index = (4 * 9) + index / 4; - (index, State::Right, 2.) + (index, Direction::Right, 2.) } } } else if keyboard_input.pressed(KeyCode::Left) { sprite.flip_x = true; - match player.state { + match player.direction { // already walking - State::Left => { + Direction::Left => { let index = (player.index + 1) % 32; sprite.index = (4 * 9) + index / 4; - (index, State::Left, -2.) + (index, Direction::Left, -2.) } // starting walking _ => { let index = 3 * 4; sprite.index = (4 * 9) + index / 4; - (index, State::Left, -2.) + (index, Direction::Left, -2.) } } } else { - sprite.index = 0; - (0, State::Idle, 0.) + match player.direction { + // already idle + Direction::Idle => { + let index = (player.index + 1) % 256; + sprite.index = if index > 224 { 0 } else { 9 * 1 + 6 }; + (index, Direction::Idle, 0.) + } + // start idle + _ => { + player.index = 0; + sprite.index = 0; + (0, Direction::Idle, 0.) + } + } }; - player.state = state; + player.direction = state; player.index = index; transform.translation.x += dir; }