From 949ed42cfa4fd486dabe11f6b4d8e7a0ae4405e9 Mon Sep 17 00:00:00 2001 From: maxluli Date: Wed, 18 May 2022 12:23:24 +0200 Subject: [PATCH] Added all the Jumping mechanics --- src/main.rs | 128 +++++++++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 57 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7b00362..4e3e1bb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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, x:i32, y:i32, radius:i32, color:Color) { @@ -313,7 +324,8 @@ pub fn draw_circle(ctx:&mut sdl2::render::Canvas, 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,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);