Added all the Jumping mechanics

This commit is contained in:
2022-05-18 12:23:24 +02:00
parent 3d5c4af0a2
commit 949ed42cfa
+71 -57
View File
@@ -51,11 +51,11 @@ const DEFAULT_MAP:&[Tile] = &[
Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky,
Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky, Tile::sky,Tile::sky,Tile::sky,Tile::sky,Tile::sky,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::sand,Tile::grass,Tile::sand,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::sand,Tile::grass,Tile::sand,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::sand,Tile::grass,Tile::sand, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::sand,Tile::grass, Tile::sand,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::sand, Tile::grass,Tile::sand,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock, Tile::rock,Tile::rock,Tile::rock,Tile::rock,Tile::rock,
];
#[derive(Clone)]
@@ -155,8 +155,8 @@ impl Game{
let main_ball_color:Color = Color::RGB(0xFA, 0xFD, 0xF6);
let main_ball_outline:Color = Color::RGB(0x17, 0x2A, 0x33);
let background_color:Color = Color::RGB(0xFF,0xFF,0xFF);
let velocity_color:u8 = ((self.main_ball.velocity.x * 4).abs() + (self.main_ball.velocity.y * 4).abs()) as u8;
let arrow_color:Color = Color::RGB(velocity_color,0x00,0x00);
let charge_color:u8 = ((self.main_ball.charge.x * 4).abs() + (self.main_ball.charge.y * 4).abs()) as u8;
let arrow_color:Color = Color::RGB(charge_color,0x00,0x00);
let arrow_outline:Color = Color::RGB(0x00,0x00,0x00);
ctx.set_draw_color(background_color);
ctx.clear();
@@ -169,34 +169,41 @@ impl Game{
ctx.fill_rect(self.main_ball.shape).expect("Could not fill the rectangle");
ctx.set_draw_color(main_ball_outline);
ctx.draw_rect(self.main_ball.shape).expect("Could not ouline the rectangle");
let apex:Point = Point::new(center.x + (self.main_ball.velocity.x * DEBUG_FX_SIZE_RATIO) as i32,center.y + (self.main_ball.velocity.y * DEBUG_FX_SIZE_RATIO) as i32);
let apex:Point = Point::new(center.x + (self.main_ball.charge.x * DEBUG_FX_SIZE_RATIO) as i32,center.y + (self.main_ball.charge.y * DEBUG_FX_SIZE_RATIO) as i32);
ctx.draw_line(center,apex).expect("Could not render the Debug FX");
}else{
fill_circle(ctx, center.x, center.y,self.main_ball.shape.width() as i32 / 2, main_ball_color);
draw_circle(ctx,center.x,center.y,self.main_ball.shape.width() as i32 / 2, main_ball_outline);
draw_circle(ctx,center.x,center.y,self.main_ball.shape.width() as i32 / 2 + 1, main_ball_outline);
let apex:Point = Point::new(center.x + (self.main_ball.velocity.x * ARROW_SIZE_RATIO) as i32,center.y + (self.main_ball.velocity.y * ARROW_SIZE_RATIO) as i32);
let apex:Point = Point::new(center.x + (self.main_ball.charge.x * ARROW_SIZE_RATIO) as i32,center.y + (self.main_ball.charge.y * ARROW_SIZE_RATIO) as i32);
let offset = Point::new(((apex.x - center.x) as f32 / ARROW_PARTS as f32) as i32,((apex.y -center.y) as f32 / ARROW_PARTS as f32) as i32);
for i in 0..ARROW_PARTS{
ctx.set_draw_color(arrow_color);
let center = Point::new(center.x + i*offset.x,center.y + i*offset.y);
fill_circle(ctx, center.x, center.y, ARROW_WIDTH, arrow_color);
draw_circle(ctx, center.x, center.y, ARROW_WIDTH + 1, arrow_outline);
if self.main_ball.grounded{
for i in 0..ARROW_PARTS{
ctx.set_draw_color(arrow_color);
let center = Point::new(center.x + i*offset.x,center.y + i*offset.y);
fill_circle(ctx, center.x, center.y, ARROW_WIDTH, arrow_color);
draw_circle(ctx, center.x, center.y, ARROW_WIDTH + 1, arrow_outline);
}
}
}
}
pub fn up(&mut self){
self.main_ball.velocity.y -= BALL_SPEED as i32;
if self.main_ball.grounded{self.main_ball.charge.y -= BALL_SPEED as i32;}
}
pub fn down(&mut self){
self.main_ball.velocity.y += BALL_SPEED as i32;
if self.main_ball.grounded{self.main_ball.charge.y += BALL_SPEED as i32;}
}
pub fn left(&mut self){
self.main_ball.velocity.x -= BALL_SPEED as i32;
if self.main_ball.grounded{self.main_ball.charge.x -= BALL_SPEED as i32;}
}
pub fn right(&mut self){
self.main_ball.velocity.x += BALL_SPEED as i32;
if self.main_ball.grounded{self.main_ball.charge.x += BALL_SPEED as i32;}
}
pub fn jump(&mut self){
if self.main_ball.grounded{
self.main_ball.grounded = false;
}
}
pub fn toggle_debug(&mut self){
self.draw_debug = !self.draw_debug;
@@ -208,7 +215,7 @@ impl Game{
}
pub fn right_click(&mut self,_mouse_position:Point){
// Removes any vectors
self.main_ball.velocity = Point::new(0,0);
self.main_ball.charge = Point::new(0,0);
}
pub fn update(&mut self){
let bloc = &mut self.main_ball;
@@ -217,49 +224,53 @@ impl Game{
let width = bloc.shape.width() as i32;
let height = bloc.shape.height() as i32;
//Window Collision Detection
if posy + height >= WINDOW_HEIGHT{
posy = WINDOW_HEIGHT - height;
bloc.velocity.y = bounce(bloc.velocity.y);
}
if posy <= 0{
posy = 0;
bloc.velocity.y = bounce(bloc.velocity.y);
}
if posx + width >= WINDOW_WIDTH{
posx = WINDOW_WIDTH - width;
bloc.velocity.x = bounce(bloc.velocity.x);
}
if posx <= 0{
posx = 0;
bloc.velocity.x = bounce(bloc.velocity.x);
}
//Uggly way to maintain the bloc in a normal speed
if bloc.velocity.x > MAX_SPEED as i32{
bloc.velocity.x = MAX_SPEED as i32;
}
if bloc.velocity.x < -MAX_SPEED as i32{
bloc.velocity.x = -MAX_SPEED as i32;
}
if bloc.velocity.y > MAX_SPEED as i32{
bloc.velocity.y = MAX_SPEED as i32;
}
if bloc.velocity.y < -MAX_SPEED as i32{
bloc.velocity.y = -MAX_SPEED as i32;
if !bloc.grounded{
posx += bloc.charge.x;
posy += bloc.charge.y;
//gravity
bloc.charge.y += 1;
if posy + height >= WINDOW_HEIGHT{
posy = WINDOW_HEIGHT - height;
//hits the bottom
bloc.grounded = true;
bloc.charge = Point::new(0,0);
}
if posy <= 0{
posy = 0;
}
if posx + width >= WINDOW_WIDTH{
posx = WINDOW_WIDTH - width;
bloc.charge.x = ((-bloc.charge.x as f32 / 100.0) * BOUNCE_RATIO as f32) as i32;
}
if posx <= 0{
posx = 0;
bloc.charge.x = -bloc.charge.x;
}
}
posx += bloc.velocity.x;
posy += bloc.velocity.y;
//Uggly way to maintain the bloc in a normal speed
if bloc.charge.x > MAX_SPEED as i32{
bloc.charge.x = MAX_SPEED as i32;
}
if bloc.charge.x < -MAX_SPEED as i32{
bloc.charge.x = -MAX_SPEED as i32;
}
if bloc.charge.y > MAX_SPEED as i32{
bloc.charge.y = MAX_SPEED as i32;
}
if bloc.charge.y < -MAX_SPEED as i32{
bloc.charge.y = -MAX_SPEED as i32;
}
bloc.shape.set_x(posx);
bloc.shape.set_y(posy);
}
}
pub fn bounce(acceleration:i32)->i32{
-(acceleration as f32 / 100.0 * BOUNCE_RATIO as f32) as i32
}
//https://stackoverflow.com/questions/65723827/sdl2-function-to-draw-a-filled-circle ## Translated to Rust
pub fn fill_circle(ctx:&mut sdl2::render::Canvas<sdl2::video::Window>, x:i32, y:i32, radius:i32, color:Color)
{
@@ -313,7 +324,8 @@ pub fn draw_circle(ctx:&mut sdl2::render::Canvas<sdl2::video::Window>, centre_x:
}
pub struct Entity{
shape:Rect,
velocity:Point,
charge:Point,
grounded:bool,
}
fn is_up_pressed(e: &sdl2::EventPump) -> bool {
e.keyboard_state().is_scancode_pressed(Scancode::W) || e.keyboard_state().is_scancode_pressed(Scancode::Up)
@@ -391,6 +403,7 @@ pub fn main_loop(canvas: &mut sdl2::render::Canvas<sdl2::video::Window>,event_pu
if space_state == true{
//KeyDown
space_state = false;
game.jump();
}
}
let mut mouse_position:Point = check_mouse_left_pressed(event_pump);
@@ -443,10 +456,11 @@ pub fn main() {
let main_ball_rectangle = Rect::new(
DEFAULT_START_BALL_LOCATION_X,DEFAULT_START_BALL_LOCATION_Y, DEFAULT_BALL_WIDTH as u32, DEFAULT_BALL_WIDTH as u32);
let main_ball_velocity = Point::new(0,0);
let main_ball_charge = Point::new(0,0);
let main_entity = Entity{
shape:main_ball_rectangle,
velocity:main_ball_velocity
charge:main_ball_charge,
grounded:false,
};
let mut game = Game{main_ball:main_entity,draw_debug:false,map:Map::new()};
main_loop(&mut canvas,&mut event_pump,&mut game);