From 90d016e012cb45e814d0a09ae59efa0d06a90308 Mon Sep 17 00:00:00 2001 From: arngo <27396817+arngo@users.noreply.github.com> Date: Tue, 25 Jan 2022 21:47:19 -0500 Subject: implement damage hitboxes --- assets/map1.png | Bin 0 -> 4742 bytes src/levels.rb | 31 ++++++++++++++++++++++++-- src/logic.rb | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 assets/map1.png diff --git a/assets/map1.png b/assets/map1.png new file mode 100644 index 0000000..e567f50 Binary files /dev/null and b/assets/map1.png differ diff --git a/src/levels.rb b/src/levels.rb index a6667cb..b655ed9 100644 --- a/src/levels.rb +++ b/src/levels.rb @@ -24,9 +24,14 @@ level0 = { [250,250, 250,150], [350,200, 050,350], [070,470, 200,200], - [350,200, 050,350], - [470,470, 200,020] + [470,470, 200,020], + ], + damage_areas: [ + [10, 0,0, 100,100], ], + damage_walls: [ + [10, 350,200, 050,350], + ] } Levels.push(level0) @@ -42,7 +47,29 @@ FECS::Sys.new('ConstructLevel') do offset_y: 0 ) end + level[:damage_areas].each do |dmg| + FECS::Cmp::DamageHitbox.new( + rec: Rl::Rectangle.new(*dmg[1..]), + damage: dmg[0], + ) + end + level[:damage_walls].each do |dmg| + FECS::Cmp::DamageHitbox.new( + rec: Rl::Rectangle.new(dmg[1]-1, dmg[2]-1, dmg[3]+2, dmg[4]+2), + damage: dmg[0], + ) + FECS::Cmp::Hitbox.new( + rec: Rl::Rectangle.new(*dmg[1..]), + ) + end + + player_pos = @player.component[FECS::Cmp::Position] + player_vel = @player.component[FECS::Cmp::Velocity] + player_pos.x = level[:player_spawn].x + player_pos.y = level[:player_spawn].y + player_vel.x = 0 + player_vel.y = 0 # use current_level component to know which level from levels array to load # create entities e.g. walls # set properties for scissor box diff --git a/src/logic.rb b/src/logic.rb index a714cf9..29bf5ef 100644 --- a/src/logic.rb +++ b/src/logic.rb @@ -26,7 +26,10 @@ FECS::Cmp.new('Hitbox', :rec, offset_x: 0, offset_y: 0) -FECS::Cmp.new('Hp', value: 0) +FECS::Cmp.new('Hp', + value: 0, + invincible_timer: 0.1, + max_invincible_time: 2) FECS::Cmp.new('Input', move_right: false, move_left: false, @@ -36,6 +39,11 @@ FECS::Cmp.new('Input', ) FECS::Cmp.new('ScissorBox', :rec) +FECS::Cmp.new('DamageHitbox', + :rec, + damage: 1, + offset_x: 0, + offset_y: 0) #ScissorPath = Path.new( # lambda do |time| @@ -50,6 +58,12 @@ Input = FECS::Cmp::Input.new lancelot = Tileset.new(texture: Rl::Texture.new('./assets/lancelot_.png')) +FECS::Cmp::Sprite.new( + texture: Rl::Texture.new('./assets/map1.png'), + source_rec: Rl::Rectangle.new(0,0,448,336), + dest_rec: Rl::Rectangle.new(0,0,448*2,336*2) +) + puts 'about to make rectangles' 4.times do |x| lancelot.frames.push Rl::Rectangle.new((24 * x), 24*2, 24, 24) @@ -91,6 +105,7 @@ FECS::Cmp::Hitbox.new( @player = FECS::Ent.new( FECS::Cmp::Player.new, + FECS::Cmp::Hp.new(value: 100, max_invincible_time: 2), FECS::Cmp::Position.new(x: 120, y: 300), FECS::Cmp::Velocity.new, FECS::Cmp::Tileset.new( @@ -266,6 +281,27 @@ FECS::Scn::Play.add( end end end, + FECS::Sys.new('Damage') do + player = FECS::Cmp::Player.first.entity + player_hitbox = player.component[FECS::Cmp::Hitbox] + hp_cmp = player.component[FECS::Cmp::Hp] + next if hp_cmp.value <= 0 + if hp_cmp.invincible_timer >= 0 + hp_cmp.invincible_timer -= Rl.frame_time + end + FECS::Cmp::DamageHitbox.each do |dmg_hitbox| + if player_hitbox.rec.collide_with_rec?(dmg_hitbox.rec) && + hp_cmp.invincible_timer <= 0 + hp_cmp.value -= dmg_hitbox.damage + hp_cmp.invincible_timer = hp_cmp.max_invincible_time + puts "oof -#{dmg_hitbox.damage} hp" + puts "hp: #{hp_cmp.value}" + if hp_cmp.value <= 0 + puts 'ded' + end + end + end + end, FECS::Sys.new('Movement') do FECS::Cmp::Velocity.each do |velocity_cmp| ent = velocity_cmp.entity @@ -307,21 +343,37 @@ FECS::Scn::Play.add( #Rl.draw_text(text: "animation frame: #{"%.2f" % frame}", x: 500, y: 30, font_size: 30, color: BLACK) #Rl.draw_text(text: "x vel: #{"%.1f" % x_vel}", x: 500, y: 60, font_size: 30, color: BLACK) #Rl.draw_text(text: "y vel: #{"%.1f" % y_vel}", x: 500, y: 90, font_size: 30, color: BLACK) - Rl.draw_text(text: "speed: #{"%.1f" % vel}", x: 10, y: 10, font_size: 30, color: BLACK) - Rl.draw_text(text: "fps: #{Rl.fps}", x: 10, y: 40, font_size: 30, color: BLACK) - Rl.draw_text(text: "mouse x: #{Rl.mouse_x}", x: 10, y: 70, font_size: 30, color: BLACK) - Rl.draw_text(text: "mouse y: #{Rl.mouse_y}", x: 10, y: 100, font_size: 30, color: BLACK) + Rl.draw_text(text: "speed: #{"%.1f" % vel}", x: 10, y: 10, font_size: 30, color: WHITE) + Rl.draw_text(text: "fps: #{Rl.fps}", x: 10, y: 40, font_size: 30, color: WHITE) + Rl.draw_text(text: "mouse x: #{Rl.mouse_x}", x: 10, y: 70, font_size: 30, color: WHITE) + Rl.draw_text(text: "mouse y: #{Rl.mouse_y}", x: 10, y: 100, font_size: 30, color: WHITE) end end, FECS::Sys.new('Render') do scissor_path = Levels[CurrentLevel.level][:scissor_path].call((Rl.time/8) % 1) scissor_size = Levels[CurrentLevel.level][:scissor_size].call((Rl.time/8) % 1) - Rl::Rectangle.new(scissor_path[0], scissor_path[1], scissor_size[0], scissor_size[1]).draw(color: WHITE) + Rl::Rectangle.new(scissor_path[0], scissor_path[1], scissor_size[0], scissor_size[1]).draw(color: Rl::Color.new(52,52,64,255)) + player = FECS::Cmp::Player.first.entity + y_vel = player.component[FECS::Cmp::Velocity].y.abs + x_vel = player.component[FECS::Cmp::Velocity].x.abs + vel = Math.sqrt(x_vel**2 + y_vel**2) Rl.scissor_mode( x: scissor_path[0], y: scissor_path[1], width: scissor_size[0], height: scissor_size[1]) do + if Input.show_debug + Rl.draw_text(text: "speed: #{"%.1f" % vel}", x: 10, y: 10, font_size: 30, color: BLACK) + Rl.draw_text(text: "fps: #{Rl.fps}", x: 10, y: 40, font_size: 30, color: BLACK) + Rl.draw_text(text: "mouse x: #{Rl.mouse_x}", x: 10, y: 70, font_size: 30, color: BLACK) + Rl.draw_text(text: "mouse y: #{Rl.mouse_y}", x: 10, y: 100, font_size: 30, color: BLACK) + end + FECS::Cmp::Sprite.each do |sprite_cmp| + Rl.draw_texture_pro(texture: sprite_cmp.texture, + origin: Rl::Vector2.new(0,0), + source_rec: sprite_cmp.source_rec, + dest_rec: sprite_cmp.dest_rec) + end FECS::Cmp::Tileset.each do |sprite_cmp| Rl.draw_texture_pro(texture: sprite_cmp.tileset.texture, origin: sprite_cmp.origin, @@ -374,7 +426,7 @@ FelECS::Order.sort( FECS::Sys::Walls, FECS::Sys::Movement, FECS::Sys::ApplyPositionToSprite, - FECS::Sys::Render, FECS::Sys::ShowSpeed, + FECS::Sys::Render, FECS::Sys::DebugRenderHitbox, ) -- cgit v1.2.3