ASABeta3s/ASpacyAdventure.rb

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