require 'gosu' require 'logger' module ZOrder Background, Stars, Player, UI = *0..3 end class GameWindow < Gosu::Window def initialize puts "Have you read the License Agreement?" puts "" puts "Fullscreen? (Y/N):" @fullscreensel = gets.chomp! if @fullscreensel == "Y" then @fullscreen = true else @fullscreen = false end super(1920, 1080, @fullscreen, update_interval=15) puts "Resolution: #{Gosu::screen_width}x#{Gosu::screen_height}" self.caption = "ASpacyAdventure #{@game_version}" #Different kinds of Asteroids and backgrounds are here randomly choosen @asteroid_available = ["data/asteroids/voilett.png", "data/asteroids/rot.png", "data/asteroids/green.png", "data/asteroids/blau.png", "data/asteroids/yellow.png", "data/asteroids/pink.png", "data/asteroids/orange.png"] @asteroid_colour = @asteroid_available[rand(@asteroid_available.size)] @backgrounds = ["data/background.jpg", "data/background2.jpg", "data/background3.jpg", "data/background4.jpg"] @background = @backgrounds[rand(@backgrounds.size)] @planet2 = Planet.new(self) @planet2.warp(500, 500) @spacestation = SpaceStation.new(self) @spacestation.warp(rand(1920 - 128), rand(1080 - 128)) @game_version = "Beta v.3" @meteors_available = ["data/meteors/Asteroid1.png","data/meteors/Asteroid2.png","data/meteors/Asteroid3.png","data/meteors/Asteroid4.png","data/meteors/Asteroid5.png","data/meteors/Asteroid6.png", "data/meteors/Asteroid8.png"] @meteor_colour = @meteors_available[rand(@meteors_available.size)] @background_image = Gosu::Image.new(self, @background, true) @gameover = Gosu::Image.new(self, "data/gameover.png", true) @explosion = Gosu::Image.new(self, "data/explosion.png", false) @soundtrack = Gosu::Sample.new("data/eaten.wav") @explosion = Gosu::Image.new(self, "data/explosion.png", false) @select = Gosu::Image.new(self, "data/menu.png", true) @store = Gosu::Image.new(self, "data/store.png", true) @huge_planet = Gosu::Image.new(self, "data/huge_planet.png", true) @pause = Gosu::Image.new(self, "data/pause.png", true) @space = Gosu::Image.new(self, "data/space.png", true) @song = Gosu::Song.new(self, "data/song.ogg") @song.play #@speed_upgrade = Gosu::Image::load_tiles("self", "data/speed_upgrade.png", 32, 32, false) @one = 1 @two = 5 @three = 1 @four = 0 @five = 0 @six = 0 @menu_lives = 1000000 puts "1 or 2 Players?" @players = gets.chomp.to_i puts "Difficulty:" puts "easy, medium, hard, hell" diff = gets.chomp! @player = Player.new(self) @player.warp(500, 500) <<<<<<< HEAD @player.force_field_activate(true) ======= @player.force_field_activate(false) >>>>>>> 679c86a6bc05332c9d73dc1b22d5419f13c645e2 @player2 = Player2.new(self) @star_anim = Gosu::Image::load_tiles(self, "data/star.png", 32, 32, false) @stars = Array.new @bullet_enemy = Bullet3.new(self) @bullet_enemy.warp(250, 250) @asteroid_anim = Gosu::Image::load_tiles(self, @meteor_colour, 32, 32, false) @asteroids = Array.new @live_anim = Gosu::Image::load_tiles(self, "data/live.png", 32, 32, false) @playerlives = Array.new @bomb_anim = Gosu::Image::load_tiles(self, @asteroid_colour, 64, 64, false) @bombs = Array.new @megalive_anim = Gosu::Image::load_tiles(self, "data/mega_live.png", 64, 64, false) @mega_lives = Array.new @enemy = Enemy.new(self) @enemy.warp(250, 250) @enemy2 = Enemy2.new(self) @enemy2.warp(500, 200) @playerlife = 0 @time = Time.now @number = rand(100000) @number2 = rand(100000) @debugfile = File.new("logfiles/#{@time.day}-#{@time.month}-#{@time.year}(#{@time.hour}_#{@time.min}_#{@time.sec}).log", "w+") @debugfile.puts("Game Version: #{@game_version}") @highscore = File.new("highscores/#{@number}.highscorespace", "w+") @blackhole = Gosu::Image::load_tiles(self, "data/blackhole.png", 100, 100, false) @blackholes = Array.new @bullet = Bullet.new(self) @bullet.warp(500, 500) @bullet_gone = false @bullet_amount = 0 @bullet2 = Bullet.new(self) @bullet2.warp(250, 250) @bullet_enemy2 = Bullet5.new(self) @bullet_enemy2.warp(500, 200) @bullet_planet = Bullet4.new(self) @planet = Planet.new(self) @font = Gosu::Font.new(self, Gosu::default_font_name, 20) @liveupgrade = 0 def movement(entity, bullet) if rand(100000) > 100 then entity.accelerate bullet.accelerate end if rand(100000) < 10000 then entity.turn_left bullet.turn_left end if rand(100000) < 1000 then bullet.shoot end if rand(500) < 10 then bullet.warp(entity.x, entity.y) end end end def needs_cursor? true end def button_down(id) if id == Gosu::KbP or id == Gosu::GpButton7 then @paused = !@paused @four = 5 @debugfile.puts("Game Paused") @song.pause end return if @paused if id == Gosu::KbP or id == Gosu::GpButton7 and @four == 5 then @four = 0 end if id == Gosu::KbP or id == Gosu::GpButton7 and @song.paused? == true then @song.play end if id == Gosu::KbEscape then @debugfile.puts("Game closed by user") close end end def update return if @paused #puts "X: #{mouse_x}" #puts "Y: #{mouse_y}" if button_down? Gosu::MsLeft then if Gosu::distance(mouse_x, mouse_y, @planet2.x, @planet2.y) < 64 then @five = 1 #@one = 0 end end if button_down? Gosu::MsRight then if Gosu::distance(mouse_x, mouse_y, @planet2.x, @planet2.y) < 64 then @five = 0 end end if button_down? Gosu::KbU or button_down? Gosu::GpButton6 and @six == 0 then @six = 5 end if button_down? Gosu::Kb1 and @six == 5 then @six = 0 @enemy = Enemy.new(self) end if button_down? Gosu::KbA or button_down? Gosu::GpLeft then @player.turn_left @bullet.turn_left end if button_down? Gosu::KbD or button_down? Gosu::GpRight then @player.turn_right @bullet.turn_right end if button_down? Gosu::GpButton0 or button_down? Gosu::KbW then @player.accelerate @bullet.accelerate end if button_down? Gosu::KbS or button_down? Gosu::GpDown then @player.backwards @bullet.backwards end if button_down? Gosu::KbDown or button_down? Gosu::KbF then @player2.backwards @bullet2.backwards end if button_down? Gosu::KbSpace or button_down? Gosu::GpButton5 then @bullet.shoot @bullet.draw @bullet.warp(@player.x, @player.y) @bullet_amount = (@bullet_amount + 1) end if button_down? Gosu::KbRightShift then 76.times do |x| @bullet2.shoot end @bullet2.warp(@player2.x, @player2.y) end if @players == 2 then if button_down? Gosu::KbUp then @player2.accelerate @bullet2.accelerate end if button_down? Gosu::KbLeft then @player2.turn_right @bullet2.turn_left end if button_down? Gosu::KbRight then @player2.turn_left @bullet2.turn_right end if button_down? Gosu::GpButton0 then close end end if button_down? Gosu::KbR then @bullet.warp(@player.x, @player.y) end if button_down? Gosu::KbLeftShift or button_down? Gosu::GpButton4 then @bullet.accelerate @player.accelerate @bullet.accelerate @player.accelerate end #if button_down? Gosu::Kb1 then # @stars.push(Star.new(@star_anim)) #end #if button_down? Gosu::Kb2 then # @asteroids.push(Asteroid.new(@asteroid_anim)) #end #if button_down? Gosu::Kb3 then # @bombs.push(Bomb.new(@bomb_anim)) #end #if button_down? Gosu::Kb4 then # @playerlives.push(Live.new(@live_anim)) #end #if button_down? Gosu::Kb7 then # @planets.push(Planet.new(@planet_anim)) #end #if button_down? Gosu::Kb8 then # @mega_lives.push(MegaLive.new(@megalive_anim)) #end #if button_down? Gosu::Kb6 then # @enemy.accelerate #end if button_down? Gosu::KbRightControl then @player2.warp(@player2.x, @player2.y) @bullet2.warp(@player2.x, @player2.y) end if button_down? Gosu::KbF then @player.warp(mouse_x, mouse_y) @bullet.warp(mouse_x, mouse_y) end if button_down? Gosu::MsRight then @player.turn_left @bullet.turn_left end if button_down? Gosu::MsLeft then if mouse_y >= 700 && mouse_y <= 778 && mouse_x >= 150 && mouse_x <= 310 && @two == 5 then @two -= 5 @menu_lives = 10 @three = 0 end if mouse_y >= 705 && mouse_y <= 775 && mouse_x >= 1685 && mouse_x <= 1807 && @two == 5 then close end if mouse_y >= 350 && mouse_y <= 423 && mouse_x >= 261 && mouse_x <= 560 && @three == 5 then if @liveupgrade + @player.score >= 30 then @liveupgrade -= 30 @playerlife += 10 @three = 0 end else @three = 0 end end # if button_down? Gosu::Kb5 then # @blackholes.push(Blackhole.new(@blackhole)) # end if button_down? Gosu::MsLeft then @explosion.draw(mouse_x, mouse_y, 0) end if button_down? Gosu::KbM then @two = 5 end if button_down? Gosu::KbH then @highscore.puts(@player.score + @playeren + @bullet.score) end @playerscore1 = @player.score if button_down? Gosu::KbF1 then if @liveupgrade + @player.score >= 30 then @liveupgrade -= 30 @playerlife += 10 end end if button_down? Gosu::KbQ then @planet2.warp(@player.x, @player.y) end if button_down? Gosu::KbE then @bullet.warp(@enemy.x, @enemy.y) end if button_down? Gosu::KbO then @bullet.warp(@enemy2.x, @enemy2.y) @enemy2.accelerate end if Gosu::distance(@player.x, @player.y, @spacestation.x, @spacestation.y) < 128 then @player.add_live(0.0033) if button_down? Gosu::KbB or button_down? Gosu::GpButton3 then @three = 5 end if button_down? Gosu::GpButton4 and @three == 5 then @three = 0 end end @player.move @bullet_enemy2.move @planet2.move @enemy2.move @bullet.move @bullet2.move @player2.move @enemy.move @bullet_enemy.move @bullet.shoot @bullet2.shoot @planet.move @bullet_planet.move @player.force_field if @bullet.lives_hit + @enemy.lives > 1 then @enemy.collect_stars(@stars) @enemy.collect_lives(@playerlives) @bullet_enemy.collect_player(@player) @enemy.collect_asteroids(@asteroids) @enemy.flyinto_blackhole(@blackholes) @player.collect_megalive(@mega_lives) end #Bullets abillity to fly into blackholes. Default = disabled #@bullet.flyinto_blackhole(@blackholes) #@bullet2.flyinto_blackhole if @three == 0 then @bullet.collect_player2(@player2) @bullet.shoot_enemy2(@enemy2) @bullet_enemy2.collect_player(@player) @bullet.shoot_planet(@planet) @player.flyinto_blackhole(@blackholes) @bullet.collect_player(@enemy) @bullet2.collect_player(@player) @player.collect_asteroids(@asteroids) @player.collect_bombs(@bombs) @player.collect_lives(@playerlives) @player2.collect_asteroids(@asteroids) @player2.collect_lives(@playerlives) @player.collect_stars(@stars) @bullet.collect_stars(@stars) @bullet.collect_asteroids(@asteroids) @player2.collect_stars(@stars) @bullet2.collect_stars(@stars) @bullet2.collect_asteroids(@asteroids) @player2.collect_bombs(@bombs) @planet.collect_player(@player) @bullet_planet.collect_player(@player) @scorecom = (@player.score + @player2.score) end if @scorecom == 500 then close end movement(@planet2, @bullet2) if rand(100000) > 100 then @enemy.accelerate @bullet_enemy.accelerate end if rand(100000) < 10000 then @enemy.turn_left @bullet_enemy.turn_left end if rand(100000) > 1000 then @bullet_enemy.shoot end if rand(500) < 10 then @bullet_enemy.warp(@enemy.x, @enemy.y) end #@enemy.follow(@player, 2.5) if rand(100000) > 100 then @planet.accelerate @bullet_planet.backwards end if rand(100000) < 10000 then @planet.turn_left @bullet_planet.turn_right end if rand(100000) > 1000 then @bullet_planet.shoot end if rand(500) < 10 then @bullet_planet.warp(@planet.x, @planet.y) end if rand(100000) > 100 then @enemy2.accelerate @bullet_enemy2.accelerate end if rand(100000) < 10000 then @enemy2.turn_right @bullet_enemy2.turn_right end if rand(100000) > 1000 then @bullet_enemy2.shoot end if rand(500) < 10 then @bullet_enemy2.warp(@enemy2.x, @enemy2.y) end end def draw @background_image.draw(0, 0, @one) @select.draw(0,0,@two) @store.draw(0, 0, @three) @pause.draw(0, 0, @four) @huge_planet.draw(0, 0, @five) @space.draw(0, 0, @six) if @player.force_field_activated == true then @player.draw_force_field end @player2_life = @bullet.lives_hit2 @planet2.draw @player_life = @bullet_enemy.lives + @bullet2.lives_hit if @players == 2 and @player2_life + @player2.lives > 1 then @player2.draw @bullet2.draw end #if @player_life + @player.lives + @playerlife + @planet.lives_hit + @bullet_planet.lives => 10 then @player.draw #end #if @player_life + @player.lives + @playerlife + @planet.lives_hit + @bullet_planet.lives < 10 then #@player.draw_damaged #end @bullet.draw if @bullet.lives_hit + @enemy.lives > 1 then @enemy.draw @bullet_enemy.draw end if @enemy2.lives + @bullet.lives_hit4 > 1 then @enemy2.draw @bullet_enemy2.draw end @blackholes.each {|blackhole| blackhole.draw} @stars.each { |star| star.draw} @asteroids.each {|asteroid| asteroid.draw} @bombs.each {|bomb| bomb.draw} @playerlives.each {|live| live.draw} @mega_lives.each {|live| live.draw} @planet.draw @bullet_planet.draw @spacestation.draw if rand(100000) < 1000 && @playerlives.size <= 4 then @playerlives.push(Live.new(@live_anim)) @stars.push(Star.new(@star_anim)) end if rand(100000) < 500 then @blackholes.push(Blackhole.new(@blackhole)) end if rand(100000) < 800 then @asteroids.push(Asteroid.new(@asteroid_anim)) end if rand(100000) < 700 && @bombs.size <= 4 then @bombs.push(Bomb.new(@bomb_anim)) end if @stars.size < 20 then @stars.push(Star.new(@star_anim)) end if (@player.score + @player2.score) == 30 and rand(100000) < 10000 then 1.times do @asteroids.push(Asteroid.new(@asteroid_anim)) end end @player_life = @bullet_enemy.lives + @bullet2.lives_hit if @player_life + @player.lives + @playerlife + @planet.lives_hit + @bullet_planet.lives + @bullet_enemy2.lives + @menu_lives < 1 then @gameover.draw(1, 2, 4) @debugfile.puts("Player Died") end @playeren = 0 if @bullet.lives_hit + @enemy.lives == 1 then @playeren = @player.score + @enemy.score end @timeplayed = Gosu::milliseconds @timeplayedsecs = @timeplayed / 1000 if @timeplayed == 1000 then @timeplayed -= @timeplayed end @enemyx = @enemy.y - 10 @playerx = @player.x - 10 @playerscore = @player.score + @playeren #This is what is written into the log files. @debugfile.puts("---------") @debugfile.puts("Computer Time: #{Time.now}") @debugfile.puts("Time Played: #{@timeplayedsecs} Seconds #{@timeplayed} milliseconds") @debugfile.puts("Complete Stars: #{@player.score + @playeren + @bullet.score + @liveupgrade}") @debugfile.puts("Player collected Stars: #{@playerscore}") @debugfile.puts("Player Flew into Blackhole: #{@player.blackhole}") @debugfile.puts("Bullet collected Stars: #{@bullet.score}") @debugfile.puts("Enemies collected Stars: #{@enemy.score}") @debugfile.puts("Player Lives: #{@player_life + @player.lives + @playerlife + @planet.lives_hit + @bullet_planet.lives}") @debugfile.puts("Enemy Lives: #{@player_life + @player.lives + @planet.lives_hit + @bullet_planet.lives}") @debugfile.puts("Player X: #{@player.x}; Player Y: #{@player.y}") if @enemy2.lives + @bullet.lives_hit4 > 1 then @debugfile.puts("Enemy 2 Lives: #{@enemy2.lives + @bullet.lives_hit4}") end @debugfile.puts("Boss Lives: #{@planet.lives + @bullet.lives_hit3}") if @players == 2 then @debugfile.puts("Player2 Lives: #{@player2_life + @player2.lives}") end @debugfile.puts("Enemy Lives: #{@bullet.lives_hit}") @debugfile.puts("Resolution: #{Gosu::screen_width}x#{Gosu::screen_height}") @debugfile.puts("Fullscreen: #{@fullscreen}") @debugfile.puts("FPS: #{Gosu::fps}") @debugfile.puts("Update Interval: #{update_interval}") @debugfile.puts("") @font.draw("Player Score: #{@playerscore + @liveupgrade}", 10, 10, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("Bullet Score: #{@bullet.score}", 10, 30, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("Player 2 Score: #{@player2.score}", 10, 50, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("Player 2 Bullet Score: #{@bullet2.score}", 10, 70, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("Lives: #{@player_life + @player.lives + @playerlife + @planet.lives_hit + @bullet_planet.lives + @bullet_enemy2.lives + @menu_lives}", @playerx, @player.y, ZOrder::UI, 1.0, 1.0, 0xffffff00) if @player2_life + @player2.lives > 1 && @players == 2 then @font.draw("Player 2 Lives: #{@player2_life + @player2.lives}", @player2.x, @player2.y, ZOrder::UI, 1.0, 1.0, 0xffffff00) end @font.draw("Mouse X: #{mouse_x} Mouse Y: #{mouse_y}", 10, 160, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("FPS #{Gosu::fps}", 10, 180, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("Player 1 X: #{@player.x} Player 1 Y: #{@player.y}", 10, 200, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("Player 2 X: #{@player2.x} Player 2 Y: #{@player2.y}", 10, 220, ZOrder::UI, 1.0, 1.0, 0xffffff00) if @bullet.lives_hit + @enemy.lives > 1 then @font.draw("#{@bullet.lives_hit + @enemy.lives}; Score: #{@enemy.score}", @enemy.x, @enemyx, ZOrder::UI, 1.0, 1.0, 0xffffff00) end @font.draw("Debug Lives: #{@playerlife}", 10, 260, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("Lives: #{@enemy2.lives + @bullet.lives_hit4}", @enemy2.x, @enemy2.y, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("Lives: #{@planet.lives + @bullet.lives_hit3}", @planet.x, @planet.y, ZOrder::UI, 1.0, 1.0, 0xffffff00) @font.draw("Game Version: #{@game_version}", 10, 1020, ZOrder::UI, 1.0, 1.0, 0xffffff00) if @player.score == 10 then @font.draw("You've collected 10 Stars with your ship", 550, 350, ZOrder::UI, 1.0, 1.0, 0xffffff00) end if @bullet.score == 5 then @font.draw("You've shot 5 Stars with your cannon", 550, 350, ZOrder::UI, 1.0, 1.0, 0xffffff00) end end end class Player attr_reader :score, :x, :y, :lives def initialize(window) @image = Gosu::Image.new(window, "data/Player.png", false) @image_damaged = Gosu::Image.new(window, "data/PlayerDamaged.png", false) @force_field_image = Gosu::Image.new(window, "data/force_field1.png", false) @explosion = Gosu::Image.new(window, "data/explosion.png", false) @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @heart = Gosu::Sample.new(window, "data/heart_got.wav") @explosion = Gosu::Image.new(window, "data/explosion.png", false) @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @bomb_explode = Gosu::Sample.new(window, "data/bomb_explode.wav") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives = 10 @blackhole = 0 @force_field = false end def x @x end def y @y end def angle @angle end def explode @explosion.draw_rot(@x, @y, 1, @angle) end def warp(x, y) @x, @y = x, y end def turn_left @angle -= 4.5 end def turn_right @angle += 4.5 end def down @score = 0 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) @a = @vel_y @b = @vel_x end def backwards @vel_x += Gosu::offset_x(@angle, 0.5) @vel_y += Gosu::offset_y(@angle, 0.5) end def move @x += @vel_x @y += @vel_y @x %= 1920 @y %= 1080 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @image.draw_rot(@x, @y, 1, @angle) end def draw_damaged @image_damaged.draw_rot(@x, @y, 1, @angle) end def force_field #@force_field = true if @force_field == true then @live = @lives @lives += 100000000000 end #if @force_field == false then # @lives = 10 # @force_field_image.draw_rot(@x, @y, 1, @angle) #end end def force_field_activate(bool) @force_field = bool end def Score @score end def Lives @lives end def force_field_activated @force_field end def draw_force_field @force_field_image.draw_rot(@x, @y, 1, @angle) end def add_live(amount) @lives += amount end def blackhole @blackhole end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play true else false end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @score -= 1 @lives -= 1 @asteroid_explode.play true else false end end def collect_bombs(bomb) if bomb.reject! {|bomb| Gosu::distance(@x, @y, bomb.x, bomb.y) < 65 } then @score -= 3 @lives -= 4 @bomb_explode.play true else false end end def collect_lives(live) if live.reject! {|live| Gosu::distance(@x, @y, live.x, live.y) < 35 } then @lives += 1 @heart.play true else false end end def flyinto_blackhole(blackhole) @randx = rand(1920) @randy = rand(1080) if blackhole.reject! {|blackhole| Gosu::distance(@x, @y, blackhole.x, blackhole.y) < 35 } then warp(@randx, @randy) @blackhole += 1 true else false end end def collect_megalive(live) if live.reject! {|live| Gosu::distance(@x, @y, live.x, live.y) < 50 } then @lives += 10 end end end class Player2 attr_reader :score, :x, :y, :lives def initialize(window) @player2 = Gosu::Image.new(window, "data/player2.png", false) @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @heart = Gosu::Sample.new(window, "data/heart_got.wav") @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @bomb_explode = Gosu::Sample.new(window, "data/bomb_explode.wav") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives = 10 end def x @x end def y @y end def warp(x, y) @x, @y = x, y end def turn_left @angle += 4.5 end def turn_right @angle -= 4.5 end def down @score = 0 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) @a = @vel_y @b = @vel_x end def backwards @vel_x += Gosu::offset_x(@angle, 0.5) @vel_y += Gosu::offset_y(@angle, 0.5) @a = @vel_y @b = @vel_x end def move @x += @vel_x @y += @vel_y @x %= 1920 @y %= 1080 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @player2.draw_rot(@x, @y, 1, @angle) end def Score @score end def lives @lives end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play true else false end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @score -= 1 @lives -= 1 @asteroid_explode.play true else false end end def collect_bombs(bomb) if bomb.reject! {|bomb| Gosu::distance(@x, @y, bomb.x, bomb.y) < 35 } then @score -= 3 @lives -= 4 @bomb_explode.play true else false end end def collect_lives(live) if live.reject! {|live| Gosu::distance(@x, @y, live.x, live.y) < 35 } then @lives += 1 @heart.play true else false end end end class Bullet attr_reader :score, :lives_hit, :lives_hit2 def initialize(window) @bullets = Gosu::Image.new(window, "data/bullet.png", false) @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @explosion = Gosu::Image.new(window, "data/explosion.png") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives_hit = 10 @lives_hit2 = 0 @lives_hit3 = 0 @lives_hit4 = 0 end def warp(x, y) @x, @y = x, y end def turn_left @angle -= 4.5 end def turn_right @angle += 4.5 end def down @score = @a end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) end def backwards @vel_x += Gosu::offset_x(@angle, 0.5) @vel_y += Gosu::offset_y(@angle, 0.5) end def shoot @vel_x -= Gosu::offset_x(@angle, 1.6) @vel_y -= Gosu::offset_y(@angle, 1.6) end def explode @explosion.draw_rot(@x, @y, 1, @angle) end def move @x += @vel_x @y += @vel_y @x %= 1000000 @y %= 2000000 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @bullets.draw_rot(@x, @y, 1, @angle) end def Score @score end def Lives @lives_hit end def Lives2 @lives_hit2 end def lives_hit3 @lives_hit3 end def lives_hit4 @lives_hit4 end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play @explode true else false end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @asteroid_explode.play true else false end end def collect_player(player) if Gosu::distance(@x, @y, player.x, player.y) < 35 then @asteroid_explode.play @explosion.draw(@x, @y, 1) @lives_hit -= 1 true else false end end def collect_player2(enemy) if Gosu::distance(@x, @y, enemy.x, enemy.y) < 35 then @asteroid_explode.play @lives_hit2 -= 1 true else false end end def flyinto_blackhole(blackhole) @randx = rand(1920) @randy = rand(1080) if blackhole.reject! {|blackhole| Gosu::distance(@x, @y, blackhole.x, blackhole.y) < 35 } then warp(@randx, @randy) true else false end end def shoot_planet(planet) if Gosu::distance(@x, @y, planet.x, planet.y) < 40 then @asteroid_explode.play @lives_hit3 -= 0.2 end end def shoot_enemy2(enemy) if Gosu::distance(@x, @y, enemy.x, enemy.y) < 35 then @asteroid_explode.play @lives_hit4 -= 0.5 end end end class Bullet2 attr_reader :score, :lives_hit def initialize(window) @bullets = Gosu::Image.new(window, "data/bullet.png", false) @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives_hit = 0 end def warp(x, y) @x, @y = x, y end def turn_left @angle += 4.5 end def turn_right @angle -= 4.5 end def down @score = @a end def accelerate @vel_x += Gosu::offset_x(@angle, 0.5) @vel_y += Gosu::offset_y(@angle, 0.5) end def backwards @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) end def shoot @vel_x -= Gosu::offset_x(@angle, 0.75) @vel_y -= Gosu::offset_y(@angle, 0.75) end def move @x += @vel_x @y += @vel_y @x %= 1000000 @y %= 2000000 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @bullets.draw_rot(@x, @y, 1, @angle) end def Score @score end def Lives @lives_hit end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play true else end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @asteroid_explode.play true else false end end def collect_player(player) if Gosu::distance(@x, @y, player.x, player.y) < 35 then @asteroid_explode.play @lives_hit -= 1 true else false end end end class Enemy attr_reader :score, :lives def initialize(window) @enemy = Gosu::Image.new(window, "data/enemy.png", false) @heart = Gosu::Sample.new(window, "data/heart_got.wav") @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives = 2 end def x @x end def y @y end def warp(x, y) @x, @y = x, y end def turn_left @angle -= 4.5 end def turn_right @angle += 4.5 end def down @score = @a end def follow(entity, speed) if @x < entity.x then @angle = entity.angle end if @x > entity.x then @angle = entity.angle end if @y < entity.y then @y += speed end if @y > entity.y then @y -= speed end end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.25) @vel_y -= Gosu::offset_y(@angle, 0.25) end def backwards @vel_x += Gosu::offset_x(@angle, 0.5) @vel_y += Gosu::offset_y(@angle, 0.5) end def shoot @vel_x -= Gosu::offset_x(@angle, 0.75) @vel_y -= Gosu::offset_y(@angle, 0.75) end def move @x += @vel_x @y += @vel_y @x %= 1920 @y %= 1080 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @enemy.draw_rot(@x, @y, 1, @angle) end def Score @score end def Lives @lives end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play true else false end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @asteroid_explode.play true else false end end def collect_lives(live) if live.reject! {|live| Gosu::distance(@x, @y, live.x, live.y) < 35 } then @lives += 1 @heart.play true else false end end def flyinto_blackhole(blackhole) @randx = rand(1920) @randy = rand(1080) if blackhole.reject! {|blackhole| Gosu::distance(@x, @y, blackhole.x, blackhole.y) < 35 } then warp(@randx, @randy) true else false end end end class Enemy2 attr_reader :score, :lives def initialize(window) @enemy = Gosu::Image.new(window, "data/enemy2.png", false) @heart = Gosu::Sample.new(window, "data/heart_got.wav") @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives = 10 end def x @x end def y @y end def warp(x, y) @x, @y = x, y end def turn_left @angle -= 4.5 end def turn_right @angle += 4.5 end def down @score = @a end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.25) @vel_y -= Gosu::offset_y(@angle, 0.25) end def backwards @vel_x += Gosu::offset_x(@angle, 0.5) @vel_y += Gosu::offset_y(@angle, 0.5) end def shoot @vel_x -= Gosu::offset_x(@angle, 0.75) @vel_y -= Gosu::offset_y(@angle, 0.75) end def move @x += @vel_x @y += @vel_y @x %= 1920 @y %= 1080 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @enemy.draw_rot(@x, @y, 1, @angle) end def Score @score end def Lives @lives end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play true else false end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @asteroid_explode.play true else false end end def collect_lives(live) if live.reject! {|live| Gosu::distance(@x, @y, live.x, live.y) < 35 } then @lives += 1 @heart.play true else false end end def flyinto_blackhole(blackhole) @randx = rand(1920) @randy = rand(1080) if blackhole.reject! {|blackhole| Gosu::distance(@x, @y, blackhole.x, blackhole.y) < 35 } then warp(@randx, @randy) true else false end end end class Bullet3 attr_reader :score, :lives def initialize(window) @bullets = Gosu::Image.new(window, "data/bullet2.png", false) @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @explosion = Gosu::Image.new(window, "data/explosion.png") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives = 0 @lives2 = 0 end def warp(x, y) @x, @y = x, y end def turn_left @angle -= 4.5 end def turn_right @angle += 4.5 end def down @score = @a end def Lives @lives end def lives2 @lives2 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.25) @vel_y -= Gosu::offset_y(@angle, 0.25) end def backwards @vel_x += Gosu::offset_x(@angle, 0.5) @vel_y += Gosu::offset_y(@angle, 0.5) end def shoot @vel_x -= Gosu::offset_x(@angle, 0.75) @vel_y -= Gosu::offset_y(@angle, 0.75) end def move @x += @vel_x @y += @vel_y @x %= 1920 @y %= 1080 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @bullets.draw_rot(@x, @y, 1, @angle) end def Score @score end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play true else false end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @asteroid_explode.play true else false end end def collect_player(player) if Gosu::distance(@x, @y, player.x, player.y) < 35 then @asteroid_explode.play @lives -= 1 true else false end end def collect_enemy(enemy) if Gosu::distance(@x, @y, enemy.x, enemy.y) < 35 then end end end class Bullet4 attr_reader :score, :lives def initialize(window) @bullets = Gosu::Image.new(window, "data/bullet_planet.png", false) @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @explosion = Gosu::Image.new(window, "data/explosion.png") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives = 0 @lives2 = 0 end def warp(x, y) @x, @y = x, y end def turn_left @angle -= 4.5 end def turn_right @angle += 4.5 end def down @score = @a end def Lives @lives end def lives2 @lives2 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.2) @vel_y -= Gosu::offset_y(@angle, 0.2) end def backwards @vel_x += Gosu::offset_x(@angle, 0.2) @vel_y += Gosu::offset_y(@angle, 0.2) end def shoot @vel_x += Gosu::offset_x(@angle, 0.75) @vel_y += Gosu::offset_y(@angle, 0.75) end def move @x += @vel_x @y += @vel_y @x %= 1920 @y %= 1080 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @bullets.draw_rot(@x, @y, 1, @angle) end def Score @score end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play true else false end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @asteroid_explode.play true else false end end def collect_player(player) if Gosu::distance(@x, @y, player.x, player.y) < 35 then @asteroid_explode.play @lives -= 1 true else false end end def collect_enemy(enemy) if Gosu::distance(@x, @y, enemy.x, enemy.y) < 35 then end end end class Bullet5 attr_reader :score, :lives def initialize(window) @bullets = Gosu::Image.new(window, "data/rocket.png", false) @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @explosion = Gosu::Image.new(window, "data/explosion.png") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives = 0 @lives2 = 0 end def warp(x, y) @x, @y = x, y end def turn_left @angle -= 4.5 end def turn_right @angle += 4.5 end def down @score = @a end def lives @lives end def lives2 @lives2 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.2) @vel_y -= Gosu::offset_y(@angle, 0.2) end def backwards @vel_x += Gosu::offset_x(@angle, 0.2) @vel_y += Gosu::offset_y(@angle, 0.2) end def shoot @vel_x -= Gosu::offset_x(@angle, 0.75) @vel_y -= Gosu::offset_y(@angle, 0.75) end def move @x += @vel_x @y += @vel_y @x %= 1920 @y %= 1080 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @bullets.draw_rot(@x, @y, 1, @angle) end def Score @score end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play true else false end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @asteroid_explode.play true else false end end def collect_player(player) if Gosu::distance(@x, @y, player.x, player.y) < 35 then @asteroid_explode.play @lives -= 1 true else false end end def collect_enemy(enemy) if Gosu::distance(@x, @y, enemy.x, enemy.y) < 35 then end end end class Asteroid attr_reader :x, :y def initialize(animation) @x = @y = @vel_x = @vel_y = @angle = 1.0 @animation = animation @color = Gosu::Color.new(0xff000000) @color.red = rand(256 - 40) + 40 @color.green = rand(256 - 40) + 40 @color.blue = rand(256 - 40) + 40 @x = rand * 1920 @y = rand * 1080 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) end def draw img = @animation[Gosu::milliseconds / 100 % @animation.size]; img.draw(@x - img.width / 2.0, @y - img.height / 2.0, ZOrder::Stars, 1, 1) end end class Star attr_reader :x, :y def initialize(animation) @x = @y = @vel_x = @vel_y = @angle = 1.0 @animation = animation @color = Gosu::Color.new(0xff234000) @color.red = rand(256 - 40) + 40 @color.green = rand(256 - 40) + 40 @color.blue = rand(256 - 40) + 40 @x = rand * 1920 @y = rand * 1080 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) end def draw img = @animation[Gosu::milliseconds / 100 % @animation.size]; img.draw(@x - img.width / 2.0, @y - img.height / 2.0, ZOrder::Stars, 1, 1, @color, :add) end end class Bomb attr_reader :x, :y def initialize(animation) @x = @y = @vel_x = @vel_y = @angle = 1.0 @animation = animation @color = Gosu::Color.new(0xff234000) @color.red = rand(256 - 40) + 40 @color.green = rand(256 - 40) + 40 @color.blue = rand(256 - 40) + 40 @x = rand * 1920 @y = rand * 1080 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) end def size end def draw img = @animation[Gosu::milliseconds / 100 % @animation.size]; img.draw(@x - img.width / 2.0, @y - img.height / 2.0, ZOrder::Stars, 1, 1) end end class Live attr_reader :x, :y def initialize(animation) @x = @y = @vel_x = @vel_y = @angle = 1.0 @animation = animation @color = Gosu::Color.new(0xff234000) @color.red = rand(256 - 40) + 40 @color.green = rand(256 - 40) + 40 @color.blue = rand(256 - 40) + 40 @x = rand * 1920 @y = rand * 1080 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) end def size end def draw img = @animation[Gosu::milliseconds / 100 % @animation.size]; img.draw(@x - img.width / 2.0, @y - img.height / 2.0, ZOrder::Stars, 1, 1) end end class MegaLive attr_reader :x, :y def initialize(animation) @x = @y = @vel_x = @vel_y = @angle = 1.0 @animation = animation @color = Gosu::Color.new(0xff234000) @color.red = rand(256 - 40) + 40 @color.green = rand(256 - 40) + 40 @color.blue = rand(256 - 40) + 40 @x = rand * 1920 @y = rand * 1080 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) end def size end def draw img = @animation[Gosu::milliseconds / 100 % @animation.size]; img.draw(@x - img.width / 2.0, @y - img.height / 2.0, ZOrder::Stars, 1, 1) end end class Blackhole attr_reader :x, :y def initialize(animation) @x = @y = @vel_x = @vel_y = @angle = 1.0 @animation = animation @color = Gosu::Color.new(0xff234000) @color.red = rand(256 - 40) + 40 @color.green = rand(256 - 40) + 40 @color.blue = rand(256 - 40) + 40 @x = rand * 1920 @y = rand * 1080 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) end def size end def draw img = @animation[Gosu::milliseconds / 100 % @animation.size]; img.draw(@x - img.width / 2.0, @y - img.height / 2.0, ZOrder::Stars, 1, 1) end end class SpeedUpgrade attr_reader :x, :y def initialize(animation) @x = @y = @vel_x = @vel_y = @angle = 1.0 @animation = animation @color = Gosu::Color.new(0xff234000) @color.red = rand(256 - 40) + 40 @color.green = rand(256 - 40) + 40 @color.blue = rand(256 - 40) + 40 @x = rand * 1920 @y = rand * 1080 end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.5) @vel_y -= Gosu::offset_y(@angle, 0.5) end def size end def draw img = @animation[Gosu::milliseconds / 100 % @animation.size]; img.draw(@x - img.width / 2.0, @y - img.height / 2.0, ZOrder::Stars, 1, 1) end end class SpaceStation attr_reader :score, :lives def initialize(window) @image = Gosu::Image.new(window, "data/spacestation.png", false) @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives = 2 end def x @x end def y @y end def warp(x, y) @x, @y = x, y end def turn_left @angle -= 4.5 end def turn_right @angle += 4.5 end def down @score = @a end def accelerate @vel_x -= Gosu::offset_x(@angle, 0.25) @vel_y -= Gosu::offset_y(@angle, 0.25) end def backwards @vel_x += Gosu::offset_x(@angle, 0.5) @vel_y += Gosu::offset_y(@angle, 0.5) end def shoot @vel_x -= Gosu::offset_x(@angle, 0.75) @vel_y -= Gosu::offset_y(@angle, 0.75) end def move @x += @vel_x @y += @vel_y @x %= 1920 @y %= 1080 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @image.draw_rot(@x, @y, 1, @angle) end def Score @score end def Lives @lives end end class Planet attr_reader :score, :lives_hit def initialize(window) #Here, all the different planet types are defined @planet_types = ["data/planets/planet.png", "data/planets/planet2.png", "data/planets/planet3.png", "data/planets/planet4.png", "data/planets/planet5.png"] @planet_type = @planet_types[rand(@planet_types.size)] @planet = Gosu::Image.new(window, @planet_type, false) @star_eaten = Gosu::Sample.new(window, "data/eaten.wav") @asteroid_explode = Gosu::Sample.new(window, "data/asteroid_explode.wav") @x = @y = @vel_x = @vel_y = @angle = 1.0 @score = 0 @lives_hit = 0 @lives = 15 end def x @x end def y @y end def warp(x, y) @x, @y = x, y end def turn_left @angle += 4.5 end def turn_right @angle -= 4.5 end def down @score = @a end def accelerate @vel_x += Gosu::offset_x(@angle, 0.2) @vel_y += Gosu::offset_y(@angle, 0.2) end def shoot @vel_x -= Gosu::offset_x(@angle, 0.75) @vel_y -= Gosu::offset_y(@angle, 0.75) end def move @x += @vel_x @y += @vel_y @x %= 1920 @y %= 1080 @vel_x *= 0.95 @vel_y *= 0.95 end def draw @planet.draw_rot(@x, @y, 1, @angle) end def Score @score end def lives @lives end def collect_stars(star) if star.reject! {|star| Gosu::distance(@x, @y, star.x, star.y) < 35} then @score += 1 @star_eaten.play true else end end def collect_asteroids(asteroid) if asteroid.reject! {|asteroid| Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 35 } then @asteroid_explode.play true else false end end def collect_player(player) if Gosu::distance(@x, @y, player.x, player.y) < 70 then @asteroid_explode.play @lives_hit -= 1 true else false end end def movetest(test) @vel_x += test.x @vel_y += test.y end end window = GameWindow.new window.show