diff options
28 files changed, 286 insertions, 154 deletions
diff --git a/app/components/debug/singleton_debug_vector_arrow.rb b/app/components/debug/singleton_debug_vector_arrow.rb index f06cd27..d6d6de9 100644 --- a/app/components/debug/singleton_debug_vector_arrow.rb +++ b/app/components/debug/singleton_debug_vector_arrow.rb @@ -1,3 +1,4 @@ FF::Cmp.new('SingletonDebugVectorArrow', singleton: true, length: 1) +FF::Cmp::SingletonDebugVectorArrow.new(length: 5) diff --git a/app/components/singleton_ai_timer.rb b/app/components/singleton_ai_timer.rb new file mode 100644 index 0000000..ce14380 --- /dev/null +++ b/app/components/singleton_ai_timer.rb @@ -0,0 +1,5 @@ +FF::Cmp.new('SingletonAITimer', + timer: 0, + interval: 200, + singleton: true) +FF::Cmp::SingletonAITimer.new diff --git a/app/components/singleton_move_camera.rb b/app/components/singleton_move_camera.rb new file mode 100644 index 0000000..88cd8e1 --- /dev/null +++ b/app/components/singleton_move_camera.rb @@ -0,0 +1,3 @@ +FF::Cmp.new('SingletonMoveCamera', singleton: true) + +FF::Cmp::SingletonMoveCamera.new diff --git a/app/components/singleton_random_ai_pick.rb b/app/components/singleton_random_ai_pick.rb new file mode 100644 index 0000000..19f2ca8 --- /dev/null +++ b/app/components/singleton_random_ai_pick.rb @@ -0,0 +1,2 @@ +FF::Cmp.new('SingletonRandomAIPick', singleton: true) +FF::Cmp::SingletonRandomAIPick.new diff --git a/app/factories/ships/osprey.rb b/app/factories/ships/osprey.rb deleted file mode 100644 index e371e60..0000000 --- a/app/factories/ships/osprey.rb +++ /dev/null @@ -1,34 +0,0 @@ -class Factory - class Osprey - def self.new(x: x, y: y) - sprite = FF::Cmp::Sprite.new - sprite.props[:path] = [ - 'sprites/kenny/Ships/WeebillGrey.png', - 'sprites/kenny/Ships/BuntingGrey.png', - 'sprites/kenny/Ships/NighthawkGrey.png', - 'sprites/kenny/Ships/MagpieGrey.png', - 'sprites/kenny/Ships/WaxwingGrey.png', - 'sprites/kenny/Ships/LongspurGrey.png', - 'sprites/kenny/Ships/WarblerGrey.png', - 'sprites/kenny/Ships/NutcrackerGrey.png', - ].sample - FF::Ent.new( - FF::Cmp::Boid.new(x: x, y: y, vx: -3, vy: -3, w: 32, h: 32), - sprite, - FF::Cmp::BoidBounds.new(strength: 0.6), - FF::Cmp::BoidsAlignment.new(strength: 10), - FF::Cmp::BoidsSeparation.new(distance: 150, strength: 0.001), - FF::Cmp::BoidsCohesion.new(strength: 1000), - FF::Cmp::Hp.new(health: 100), - FF::Cmp::CollisionDamage.new(damage: 100), - FF::Cmp::Hitcircle.new(r: 12), - FF::Cmp::BoidMinimumSpeed.new(speed: 3), - FF::Cmp::DecaySpeed.new(strength: 0.9), - FF::Cmp::Team.new, - #FF::Cmp::SingletonDebugVectorArrow[0], - FF::Cmp::SingletonCamera[0], - ) - end - end -end - diff --git a/app/factories/ships/sample_enemy.rb b/app/factories/ships/sample_enemy.rb new file mode 100644 index 0000000..a2a3a21 --- /dev/null +++ b/app/factories/ships/sample_enemy.rb @@ -0,0 +1,48 @@ +class Factory + class SampleEnemy + def self.defaults + @defaults ||= { + boid_bounds_strength: 0.6, + boids_alignment_strength: 0.005, + boids_seperation_strength: 0.005, + boids_seperation_distance: 50, + boids_cohesion_strength: 0.003, + hp_health: 100, + collision_damage_damage: 100, + hitcircle_r: 12, + boid_minimum_speed_speed: 5, + decay_speed_multiplier: 0.9, + } + end + def self.new(x: 0, y: 0, vx: -3, vy: -3) + sprite = FF::Cmp::Sprite.new + sprite.props[:path] = [ + 'sprites/kenny/Ships/WeebillGrey.png', + 'sprites/kenny/Ships/BuntingGrey.png', + 'sprites/kenny/Ships/NighthawkGrey.png', + 'sprites/kenny/Ships/MagpieGrey.png', + 'sprites/kenny/Ships/WaxwingGrey.png', + 'sprites/kenny/Ships/LongspurGrey.png', + 'sprites/kenny/Ships/WarblerGrey.png', + 'sprites/kenny/Ships/NutcrackerGrey.png', + ].sample + FF::Ent.new( + FF::Cmp::Boid.new(x: x, y: y, vx: vx, vy: vy, w: 32, h: 32), + sprite, + FF::Cmp::BoidBounds.new(strength: self.defaults[:boid_bounds_strength]), + FF::Cmp::BoidsAlignment.new(strength: self.defaults[:boids_alignment_strength]), + FF::Cmp::BoidsSeparation.new(distance: self.defaults[:boids_seperation_distance], strength: self.defaults[:boids_seperation_strength]), + FF::Cmp::BoidsCohesion.new(strength: self.defaults[:boids_cohesion_strength]), + FF::Cmp::Hp.new(health: self.defaults[:hp_health]), + FF::Cmp::CollisionDamage.new(damage: self.defaults[:collision_damage_damage]), + FF::Cmp::Hitcircle.new(r: self.defaults[:hitcircle_r]), + FF::Cmp::BoidMinimumSpeed.new(speed: self.defaults[:boid_minimum_speed_speed]), + FF::Cmp::DecaySpeed.new(strength: self.defaults[:decay_speed_multiplier]), + FF::Cmp::Team.new, + FF::Cmp::SingletonDebugVectorArrow[0], + FF::Cmp::SingletonCamera[0], + ) + end + end +end + diff --git a/app/main.rb b/app/main.rb index 234143b..5f59b42 100644 --- a/app/main.rb +++ b/app/main.rb @@ -17,6 +17,7 @@ require 'app/components/rules/minimum_speed.rb' require 'app/components/rules/decay_speed.rb' require 'app/components/debug/singleton_debug_vector_arrow.rb' require 'app/components/singleton_camera.rb' +require 'app/components/singleton_move_camera.rb' require 'app/components/singleton_bullet.rb' require 'app/components/stats/collision_damage.rb' require 'app/components/stats/hp.rb' @@ -26,11 +27,15 @@ require 'app/components/teams/singleton_enemy_team.rb' require 'app/components/weapon.rb' require 'app/components/teams/team.rb' require 'app/components/singleton_title.rb' +require 'app/components/singleton_ai_timer.rb' +require 'app/components/singleton_random_ai_pick.rb' require 'app/systems/init_title_screen.rb' -require 'app/systems/title_screen.rb' +require 'app/systems/ui/button.rb' +require 'app/systems/ui/return_to_menu.rb' require 'app/systems/start_game.rb' +require 'app/systems/end_game.rb' require 'app/systems/render.rb' require 'app/systems/update_boid_sprite.rb' require 'app/systems/update_boid_position.rb' @@ -52,8 +57,9 @@ require 'app/systems/cleanup_bullets.rb' require 'app/systems/ai/scatter.rb' require 'app/systems/ai/rejoin.rb' require 'app/systems/ai/target_player.rb' +require 'app/systems/ai/randomize_ai.rb' require 'app/factories/bullet.rb' -require 'app/factories/ships/osprey.rb' +require 'app/factories/ships/sample_enemy.rb' require 'app/tick.rb' diff --git a/app/scenes/scenes.rb b/app/scenes/scenes.rb index 3d11802..f0cdf17 100644 --- a/app/scenes/scenes.rb +++ b/app/scenes/scenes.rb @@ -1,8 +1,8 @@ FF::Scn.new('BoidRules') -FF::Scn.new('Debug') FF::Scn.new('Camera') FF::Scn.new('Cleanup') FF::Stg.add( - FF::Scn.new('TitleScreen'), + FF::Scn.new('UI'), FF::Scn.new('Render'), + FF::Scn.new('Debug') ) diff --git a/app/systems/ai/randomize_ai.rb b/app/systems/ai/randomize_ai.rb new file mode 100644 index 0000000..f272181 --- /dev/null +++ b/app/systems/ai/randomize_ai.rb @@ -0,0 +1,34 @@ +FF::Scn::BoidRules.add( + FF::Sys.new('RandomizeAI', priority: 50) do + timer = FF::Cmp::SingletonAITimer[0] + timer.timer += 1 + if timer.timer > timer.interval + random_ai_pick = FF::Cmp::SingletonRandomAIPick[0] + random_ai_pick.entities.reverse_each do |entity| + entity.remove random_ai_pick + #puts 'remove pick' + end + FF::Cmp::BoidsSeparation.each do |sep| + if rand < 0.3 + sep.entities[0].add random_ai_pick + #puts 'pick' + end + end + x = rand 3 + if x == 0 + FF::Sys::Scatter.call + #puts 'scatter' + elsif x == 1 + FF::Sys::Rejoin.call + #puts 'rejoin' + elsif x == 2 + FF::Sys::TargetPlayer.call + #puts 'target' + end + #timer.interval = (300..1200).to_a.sample + timer.interval = 60 + #puts timer.interval + timer.timer = 0 + end + end +) diff --git a/app/systems/ai/rejoin.rb b/app/systems/ai/rejoin.rb index 606a0be..9e06eb7 100644 --- a/app/systems/ai/rejoin.rb +++ b/app/systems/ai/rejoin.rb @@ -1,14 +1,14 @@ FF::Sys.new("Rejoin", priority: 40) do - FF::Cmp::BoidsSeparation.each do |sep| - #puts 'add align/cohesion'.upcase - sep.distance = 150 - alignment_mgr = sep.entities[0].components[FF::Cmp::BoidsAlignment] - cohesion_mgr = sep.entities[0].components[FF::Cmp::BoidsCohesion] + FF::Cmp::SingletonRandomAIPick[0].entities.each do |entity| + sep = entity.components[FF::Cmp::BoidsSeparation][0] + sep.distance = Factory::SampleEnemy.defaults[:boids_seperation_distance] + alignment_mgr = entity.components[FF::Cmp::BoidsAlignment] + cohesion_mgr = entity.components[FF::Cmp::BoidsCohesion] if alignment_mgr.nil? || alignment_mgr.empty? - sep.entities[0].add FF::Cmp::BoidsAlignment.new(strength: 10) + entity.add FF::Cmp::BoidsAlignment.new(strength: Factory::SampleEnemy.defaults[:boids_alignment_strength]) end if cohesion_mgr.nil? || cohesion_mgr.empty? - sep.entities[0].add FF::Cmp::BoidsCohesion.new(strength: 1000) + entity.add FF::Cmp::BoidsCohesion.new(strength: Factory::SampleEnemy.defaults[:boids_cohesion_strength]) end end end diff --git a/app/systems/ai/scatter.rb b/app/systems/ai/scatter.rb index 1469fd9..82bcb65 100644 --- a/app/systems/ai/scatter.rb +++ b/app/systems/ai/scatter.rb @@ -1,10 +1,15 @@ FF::Sys.new("Scatter", priority: 40) do - FF::Cmp::BoidsSeparation.each do |sep| - sep.distance = 200 + FF::Cmp::SingletonRandomAIPick[0].entities.each do |entity| + sep = entity.components[FF::Cmp::BoidsSeparation][0] + # I did times 3 becase then it will always be greater then + # what it was before and that means it will force a + # seperation to happen even if the default value is + # changed and you forget to update this number here + sep.distance = Factory::SampleEnemy.defaults[:boids_seperation_distance] * 3 #puts 'remove align/cohesion/follow'.upcase - alignment_mgr = sep.entities[0].components[FF::Cmp::BoidsAlignment] - cohesion_mgr = sep.entities[0].components[FF::Cmp::BoidsCohesion] - follow_mgr = sep.entities[0].components[FF::Cmp::Follow] + alignment_mgr = entity.components[FF::Cmp::BoidsAlignment] + cohesion_mgr = entity.components[FF::Cmp::BoidsCohesion] + follow_mgr = entity.components[FF::Cmp::Follow] unless follow_mgr.nil? || follow_mgr.empty? follow_mgr[0].delete end diff --git a/app/systems/ai/target_player.rb b/app/systems/ai/target_player.rb index 8e715eb..1e4a3ea 100644 --- a/app/systems/ai/target_player.rb +++ b/app/systems/ai/target_player.rb @@ -1,11 +1,11 @@ FF::Sys.new("TargetPlayer", priority: 40) do - FF::Cmp::BoidsSeparation.each do |sep| - #puts 'target player'.upcase + FF::Cmp::SingletonRandomAIPick[0].entities.each do |entity| + sep = entity.components[FF::Cmp::BoidsSeparation][0] sep.distance = 200 - follow_mgr = sep.entities[0].components[FF::Cmp::Follow] + follow_mgr = entity.components[FF::Cmp::Follow] player_boid = FF::Cmp::SingletonPlayer[0].entities[0].components[FF::Cmp::Boid][0] if follow_mgr.nil? || follow_mgr.empty? - sep.entities[0].add FF::Cmp::Follow.new(target: player_boid, strength: 500) + entity.add FF::Cmp::Follow.new(target: player_boid, strength: 1.2) end end end diff --git a/app/systems/collision_damage.rb b/app/systems/collision_damage.rb index 7aba563..cc052bd 100644 --- a/app/systems/collision_damage.rb +++ b/app/systems/collision_damage.rb @@ -8,6 +8,10 @@ FF::Scn::BoidRules.add( #puts 'passed first check' boid_target = hitcircle_target.entities[0].components[FF::Cmp::Boid][0] if Math.sqrt(((boid_self.x - boid_target.x) ** 2) + ((boid_self.y - boid_target.y) ** 2)) < (hitcircle_target.r + hitcircle_self.r) + puts 'checks here'.upcase + puts 'hp dont exist' if hitcircle_target.entities[0].components[FF::Cmp::Hp].nil? + puts 'collision damage dont exist' if hitcircle_target.entities[0].components[FF::Cmp::CollisionDamage].nil? + puts 'checks end'.upcase hitcircle_target.entities[0].components[FF::Cmp::Hp][0].health -= hitcircle_self.entities[0].components[FF::Cmp::CollisionDamage][0].damage end end diff --git a/app/systems/death.rb b/app/systems/death.rb index 7c10212..edeb493 100644 --- a/app/systems/death.rb +++ b/app/systems/death.rb @@ -2,10 +2,12 @@ FF::Scn::BoidRules.add( FF::Sys.new("Death", priority: 200) do FF::Cmp::Hp.each do |hp| if hp.health <= 0 - component_hash = hp.entities[0].components.clone - component_hash.each_pair do |manager, manager_array| + hp.entities[0].components.each do |manager, manager_array| + if manager.equal?(FF::Cmp::SingletonPlayer) + FF::Sys::EndGame.call + end next if manager.equal?(FF::Cmp::Hp) - manager_array.each do |component| + manager_array.reverse_each do |component| next if component.respond_to?(:singleton) component.delete end diff --git a/app/systems/end_game.rb b/app/systems/end_game.rb new file mode 100644 index 0000000..4fa0b36 --- /dev/null +++ b/app/systems/end_game.rb @@ -0,0 +1,39 @@ +FF::Sys.new('EndGame', priority: 50) do + FF::Scn::BoidRules.remove(FF::Sys::Follow, FF::Sys::RandomizeAI) + overlay_sprite = FF::Cmp::Sprite.new + overlay_sprite.props.merge!({ + x: 0, + y: 0, + w: $gtk.args.grid.w, + h: $gtk.args.grid.h, + path: 'sprites/title/overlay.png' + }) + gameover_sprite = FF::Cmp::Sprite.new + gameover_sprite.props.merge!({ + x: 1280/2 - 643/2, + y: 500, + w: 643, + h: 76, + path: 'sprites/title/gameover.png' + }) + btn_w = 190 + btn_h = 49 + btn_x = 1280/2 - btn_w/2 + btn_y = 200 + btn_sprite = FF::Cmp::Sprite.new + btn_sprite.props.merge!({ + x: btn_x, + y: btn_y, + w: btn_w, + h: btn_h, + }) + FF::Ent.new( + overlay_sprite, + gameover_sprite, + ) + FF::Ent.new( + FF::Cmp::Button.new(action: FF::Sys::ReturnToMenu, pressed_sprite_path: 'sprites/title/return_pressed.png', unpressed_sprite_path: 'sprites/title/return.png'), + FF::Cmp::Hitbox.new(x: btn_x, y: btn_y, w: btn_w, h: btn_h), + btn_sprite, + ) +end diff --git a/app/systems/init_title_screen.rb b/app/systems/init_title_screen.rb index 7f966c2..5ec56a8 100644 --- a/app/systems/init_title_screen.rb +++ b/app/systems/init_title_screen.rb @@ -1,26 +1,36 @@ FF::Sys.new('InitTitleScreen', priority: 1) do + FF::Stg.remove( + FF::Scn::BoidRules, + FF::Scn::Camera, + FF::Scn::Cleanup, + ) + bg_sprite = FF::Cmp::Sprite.new + bg_sprite.props.merge!({ + x: 0, + y: 0, + w: 1280, + h: 720, + path: 'sprites/title/titlebackground.png' + }) + title_sprite = FF::Cmp::Sprite.new + title_sprite.props.merge!({ + x: 1280/2 - 993/2, + y: 500, + w: 993, + h: 89, + path: 'sprites/title/title.png' + }) + btn_sprite = FF::Cmp::Sprite.new btn_w = 190 btn_h = 49 btn_x = 1280/2 - btn_w/2 btn_y = 200 - - bg_sprite = FF::Cmp::Sprite.new - title_sprite = FF::Cmp::Sprite.new - btn_sprite = FF::Cmp::Sprite.new - title_sprite.props[:x] = 1280/2 - 993/2 - title_sprite.props[:y] = 500 - title_sprite.props[:w] = 993 - title_sprite.props[:h] = 89 - title_sprite.props[:path] = 'sprites/title/title.png' - bg_sprite.props[:x] = 0 - bg_sprite.props[:y] = 0 - bg_sprite.props[:w] = 1280 - bg_sprite.props[:h] = 720 - bg_sprite.props[:path] = 'sprites/title/titlebackground.png' - btn_sprite.props[:x] = btn_x - btn_sprite.props[:y] = btn_y - btn_sprite.props[:w] = btn_w - btn_sprite.props[:h] = btn_h + btn_sprite.props.merge!({ + x: btn_x, + y: btn_y, + w: btn_w, + h: btn_h, + }) FF::Ent.new( bg_sprite, FF::Cmp::SingletonTitle[0] diff --git a/app/systems/move_camera.rb b/app/systems/move_camera.rb index 939ce56..fc22475 100644 --- a/app/systems/move_camera.rb +++ b/app/systems/move_camera.rb @@ -1,9 +1,11 @@ FF::Scn::Camera.add( FF::Sys.new('MoveCamera', priority: 100) do - camera = FF::Cmp::SingletonCamera[0] - player_boid = FF::Cmp::SingletonPlayer[0].entities[0].components[FF::Cmp::Boid][0] - camera.x = player_boid.x - camera.y = player_boid.y + unless FF::Cmp::SingletonPlayer[0].entities[0].nil? + camera = FF::Cmp::SingletonCamera[0] + player_boid = FF::Cmp::SingletonPlayer[0].entities[0].components[FF::Cmp::Boid][0] + camera.x = player_boid.x + camera.y = player_boid.y + end #mouse = $gtk.args.inputs.mouse #camera_pos = [0,0] # diff --git a/app/systems/player_weapon.rb b/app/systems/player_weapon.rb index 02a50ec..2ecd250 100644 --- a/app/systems/player_weapon.rb +++ b/app/systems/player_weapon.rb @@ -2,14 +2,16 @@ FF::Scn::BoidRules.add( FF::Sys.new('PlayerWeapon') do if $gtk.args.inputs.mouse.down player = FF::Cmp::SingletonPlayer[0].entities[0] - boid = player.components[FF::Cmp::Boid][0] - weapon = player.components[FF::Cmp::Weapon][0] - if player.components[FF::Cmp::Weapon][0].cooldown <= 0 - # spawn bullet facing correct angle - mag = Math.sqrt((boid.vx ** 2) + (boid.vy ** 2)) - bullet = Factory::Bullet.new(damage: weapon.damage, vx: (boid.vx/mag) * weapon.speed, vy: (boid.vy/mag) * weapon.speed, x: boid.x, y: boid.y) - bullet.remove(bullet.components[FF::Cmp::Team][0]) - bullet.add(FF::Cmp::Team.new(team: 'player')) + unless player.nil? + boid = player.components[FF::Cmp::Boid][0] + weapon = player.components[FF::Cmp::Weapon][0] + if player.components[FF::Cmp::Weapon][0].cooldown <= 0 + # spawn bullet facing correct angle + mag = Math.sqrt((boid.vx ** 2) + (boid.vy ** 2)) + bullet = Factory::Bullet.new(damage: weapon.damage, vx: (boid.vx/mag) * weapon.speed, vy: (boid.vy/mag) * weapon.speed, x: boid.x, y: boid.y) + bullet.remove(bullet.components[FF::Cmp::Team][0]) + bullet.add(FF::Cmp::Team.new(team: 'player')) + end end end end diff --git a/app/systems/rules/follow.rb b/app/systems/rules/follow.rb index abaabd7..47835f2 100644 --- a/app/systems/rules/follow.rb +++ b/app/systems/rules/follow.rb @@ -5,11 +5,19 @@ FF::Scn::BoidRules.add( target_coords = [0.0, 0.0] case follow.target when FF::Cmp::Boid - target_coords[0] = follow.target.x - target_coords[1] = follow.target.y + mag = Helpers::Vectors.magnitude(follow.target.x, + follow.target.y, + boid.x, + boid.y) + target_coords[0] = (follow.target.x - boid.x) / mag + target_coords[1] = (follow.target.y - boid.y) / mag when Array - target_coords[0] = follow.target[0] - target_coords[1] = follow.target[1] + mag = Helpers::Vectors.magnitude(follow.target[0], + follow.target[1], + boid.x, + boid.y) + target_coords[0] = (follow.target[0] - boid.x) / mag + target_coords[1] = (follow.target[1] - boid.y) / mag when :mouse camera = FF::Cmp::SingletonCamera[0] angle = camera.angle * (Math::PI / 180) @@ -23,6 +31,7 @@ FF::Scn::BoidRules.add( mouse_y, half_width, half_height) / camera.zoom + # Caps the maximum power the mouse distance can inflict if mag > half_height mouse_x = (((mouse_x - half_width) / mag) * half_height) + half_width mouse_y = (((mouse_y - half_height) / mag) * half_height) + half_height @@ -31,15 +40,15 @@ FF::Scn::BoidRules.add( #puts "y: #{mouse_y}" #puts "x mag: #{mouse_x / mag}" #puts "y mag: #{mouse_y / mag}" - $gtk.args.outputs.solids << [mouse_x, mouse_y, 250, 250, 255, 0, 0, 255] + #$gtk.args.outputs.solids << [mouse_x, mouse_y, 250, 250, 255, 0, 0, 255] - target_coords[0] = (((mouse_x - half_width) / camera.zoom) * Math.cos(-angle)) - (((mouse_y - half_height) / camera.zoom) * Math.sin(-angle)) + camera.x - target_coords[1] = (((mouse_x - half_width) / camera.zoom) * Math.sin(-angle)) + (((mouse_y - half_height) / camera.zoom) * Math.cos(-angle)) + camera.y + target_coords[0] = (((mouse_x - half_width) / camera.zoom) * Math.cos(-angle)) - (((mouse_y - half_height) / camera.zoom) * Math.sin(-angle)) + camera.x - boid.x + target_coords[1] = (((mouse_x - half_width) / camera.zoom) * Math.sin(-angle)) + (((mouse_y - half_height) / camera.zoom) * Math.cos(-angle)) + camera.y - boid.y end - boid.cx += (target_coords[0] - boid.x) * follow.strength.to_f - boid.cy += (target_coords[1] - boid.y) * follow.strength.to_f + boid.cx += target_coords[0] * follow.strength.to_f + boid.cy += target_coords[1] * follow.strength.to_f end end ) diff --git a/app/systems/start_game.rb b/app/systems/start_game.rb index 4657e77..4d6289e 100644 --- a/app/systems/start_game.rb +++ b/app/systems/start_game.rb @@ -1,6 +1,5 @@ FF::Sys.new('StartGame', priority: 50 ) do - thing = FF::Cmp::SingletonTitle[0].entities.clone - thing.each do |entity| + FF::Cmp::SingletonTitle[0].entities.reverse_each do |entity| entity.components[FF::Cmp::Sprite][0].delete if (!entity.components[FF::Cmp::Button].nil? && !entity.components[FF::Cmp::Hitbox].nil?) entity.components[FF::Cmp::Hitbox][0].delete @@ -9,17 +8,17 @@ FF::Sys.new('StartGame', priority: 50 ) do entity.delete end - FF::Cmp::SingletonTitle[0].title_screen = false - FF::Stg.remove FF::Scn::TitleScreen + #FF::Cmp::SingletonTitle[0].title_screen = false + #FF::Stg.remove FF::Scn::TitleScreen - debug_arrow = FF::Cmp::SingletonDebugVectorArrow.new(length: 5) + debug_arrow = FF::Cmp::SingletonDebugVectorArrow[0] position = [ {x: 100, y: 100}, {x: 500, y: 500}, {x: 700, y: 200}, {x: 150, y: 250}, ] - position_range = (100..700).to_a + position_range = (500..1000).to_a sprite = FF::Cmp::Sprite.new sprite.props[:path] = 'sprites/background.png' @@ -28,9 +27,9 @@ FF::Sys.new('StartGame', priority: 50 ) do FF::Cmp::SingletonCamera[0], FF::Cmp::Boid.new(h: 1920 * 2, w: 1920 * 2) ) - #15.times do |pos| - # Factory::Osprey.new(x: position_range.sample, y: position_range.sample) - #end + 8.times do |pos| + Factory::SampleEnemy.new(x: position_range.sample, y: position_range.sample) + end sprite = FF::Cmp::Sprite.new sprite.props[:path] = [ @@ -40,10 +39,11 @@ FF::Sys.new('StartGame', priority: 50 ) do 'sprites/kenny/Ships/Grosbeak.png', ].sample FF::Ent.new( - FF::Cmp::Boid.new(x: position_range.sample, y: position_range.sample, vx: 25, vy: 25, w: 32, h: 32), + FF::Cmp::Boid.new(x: 0, y: 0, vx: 25, vy: 25, w: 32, h: 32), sprite, debug_arrow, FF::Cmp::SingletonCamera[0], + FF::Cmp::SingletonMoveCamera[0], FF::Cmp::BoidBounds.new, FF::Cmp::Follow.new(target: :mouse, strength: 0.007), FF::Cmp::SingletonPlayer[0], @@ -51,6 +51,9 @@ FF::Sys.new('StartGame', priority: 50 ) do FF::Cmp::Weapon.new, FF::Cmp::BoidMinimumSpeed.new(speed: 5), FF::Cmp::DecaySpeed.new(strength: 0.8), + FF::Cmp::Hp.new(health: 100), + FF::Cmp::CollisionDamage.new(damage: 100), + FF::Cmp::Hitcircle.new(r: 32), ) @@ -59,7 +62,6 @@ FF::Sys.new('StartGame', priority: 50 ) do FF::Scn::BoidRules, FF::Scn::Camera, FF::Scn::Cleanup, - FF::Scn::Debug, ) FF::Scn::Debug.add(FF::Sys::DebugRenderVectorArrow) diff --git a/app/systems/title_screen.rb b/app/systems/title_screen.rb deleted file mode 100644 index 3f16a26..0000000 --- a/app/systems/title_screen.rb +++ /dev/null @@ -1,26 +0,0 @@ -FF::Scn::TitleScreen.add( - FF::Sys.new('TitleScreen', priority: 50) do - FF::Cmp::SingletonTitle[0].entities.each do |entity| - next unless entity.components.key?(FF::Cmp::Button) - - btn = entity.components[FF::Cmp::Button][0] - sprite = entity.components[FF::Cmp::Sprite][0] - hitbox = entity.components[FF::Cmp::Hitbox][0] - mouse = $gtk.args.inputs.mouse - - if mouse.x > hitbox.x and mouse.x < hitbox.x + hitbox.w and mouse.y > hitbox.y and mouse.y < hitbox.y + hitbox.h - if $gtk.args.inputs.mouse.down - btn.clicked = true - sprite.props[:path] = btn.pressed_sprite_path - elsif $gtk.args.inputs.mouse.up and btn.clicked - btn.clicked = false - sprite.props[:path] = btn.unpressed_sprite_path - btn.action.call - end - else - btn.clicked = false - sprite.props[:path] = btn.unpressed_sprite_path - end - end - end -) diff --git a/app/systems/ui/button.rb b/app/systems/ui/button.rb new file mode 100644 index 0000000..5ec855b --- /dev/null +++ b/app/systems/ui/button.rb @@ -0,0 +1,26 @@ +FF::Scn::UI.add( + FF::Sys.new('ButtonHandler', priority: 50) do + FF::Cmp::Button.each do |button| + sprite = button.entities[0].components[FF::Cmp::Sprite][0] + hitbox = button.entities[0].components[FF::Cmp::Hitbox][0] + mouse = $gtk.args.inputs.mouse + + if button.clicked + sprite.props[:path] = button.pressed_sprite_path + else + sprite.props[:path] = button.unpressed_sprite_path + end + + if mouse.x > hitbox.x and mouse.x < hitbox.x + hitbox.w and mouse.y > hitbox.y and mouse.y < hitbox.y + hitbox.h + if mouse.down + button.clicked = true + elsif mouse.up and button.clicked + button.clicked = false + button.action.call + end + else + button.clicked = false + end + end + end +) diff --git a/app/systems/ui/return_to_menu.rb b/app/systems/ui/return_to_menu.rb new file mode 100644 index 0000000..8b6f0c0 --- /dev/null +++ b/app/systems/ui/return_to_menu.rb @@ -0,0 +1,13 @@ +FF::Sys.new('ReturnToMenu', priority: 200) do + FF::Ent.each do |entity| + entity.components.each do |manager, manager_array| + manager_array.reverse_each do |component| + next if component.respond_to?(:singleton) + component.delete + end + end + entity.delete + end + FF::Scn::BoidRules.add(FF::Sys::Follow, FF::Sys::RandomizeAI) + FF::Sys::InitTitleScreen.call +end diff --git a/app/tick.rb b/app/tick.rb index 20ff3e9..a48fce3 100644 --- a/app/tick.rb +++ b/app/tick.rb @@ -4,29 +4,8 @@ #@pause = false @camera = FF::Cmp::SingletonCamera[0] -@scatter = false -@target = true -@timer = 0 FF::Sys::InitTitleScreen.call def tick args - #puts @timer - @timer += 1 - if @timer >= 100 && !FF::Cmp::SingletonTitle[0].title_screen - @timer -= 100 - #puts "scatter: #{@scatter}" - #puts "target: #{@target}" - @scatter = !@scatter - if @scatter - FF::Sys::Scatter.call - elsif @target - @target = false - FF::Sys::Rejoin.call - else - @target = true - FF::Sys::TargetPlayer.call - end - end - args.outputs.background_color = [0,0,0] args.outputs.solids << [-10_000, -10_000, 20_000, 20_000, 223, 246, 245] diff --git a/sprites/title/gameover.png b/sprites/title/gameover.png Binary files differnew file mode 100644 index 0000000..30c5d7e --- /dev/null +++ b/sprites/title/gameover.png diff --git a/sprites/title/overlay.png b/sprites/title/overlay.png Binary files differnew file mode 100644 index 0000000..1d541b3 --- /dev/null +++ b/sprites/title/overlay.png diff --git a/sprites/title/return.png b/sprites/title/return.png Binary files differnew file mode 100644 index 0000000..7273e27 --- /dev/null +++ b/sprites/title/return.png diff --git a/sprites/title/return_pressed.png b/sprites/title/return_pressed.png Binary files differnew file mode 100644 index 0000000..8ddd92a --- /dev/null +++ b/sprites/title/return_pressed.png |
