1996 lines
45 KiB
Ruby
1996 lines
45 KiB
Ruby
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
|