require 'gosu' class Window < Gosu::Window def initialize super(300, 400, false) @player1 = Player.new(self) @asteroid = Asteroid.new(self) # Skapar ett nytt objekt av klassen Asteroid. @running = true # Denna nya variabel används för att kunna stoppa spelet när rymdskeppet träffas av asteroid. @font = Gosu::Font.new(self, Gosu::default_font_name, 20) # Anger vilket typsnitt som ska användas till text, nämligen det som är default i Gosu. @background_image = Gosu::Image.new(self, "space2.png", true) # Berättar vilken bakgrundsbild som ska användas. end def update if @running if button_down? Gosu::Button::KbLeft @player1.move_left end if button_down? Gosu::Button::KbRight @player1.move_right end if button_down? Gosu::Button::KbUp @player1.move_up end if button_down? Gosu::Button::KbDown @player1.move_down end @asteroid.update if @player1.hit_by? @asteroid # Kontrollerar om rymdskeppet träffats av asteroid. Själva metoden finns i Player-klassen. stop_game! # Stoppar spelet vid träff, metoden följer nedan. end end end def stop_game! @running = false end def draw @player1.draw @asteroid.draw @font.draw("Poäng: #{@asteroid.score}", 10, 10, 3, 1.0, 1.0, 0xff00ff00) # Skriver ut poängen i övre vänstra hörnet, med limegrön text. @background_image.draw(0, 0, 0) # Gör så att bakgrundsbilden visas. if @running == false @font.draw("Spelet är över!", 70, 170, 3, 1.5, 1.5, 0xffff0000) # Skrivs ut när spelet stoppats. end end end class Player def initialize(window) @window = window @icon = Gosu::Image.new(@window, "Starfighter.bmp", true) @x = 125 @y = 175 end def move_left @x = @x - 5 if @x < 0 @x = 0 end end def move_right @x = @x + 5 if @x > @window.width - 50 @x = @window.width - 50 end end def move_up @y = @y - 5 if @y < 0 @y = 0 end end def move_down @y = @y + 5 if @y > @window.height - 50 @y = @window.height - 50 end end def draw @icon.draw(@x, @y, 1) end def hit_by?(asteroid) Gosu::distance(@x, @y, asteroid.x, asteroid.y) < 50 # Jämför skeppets position med asteroidens, med hjälp av Gosu-metoden distance. end end class Asteroid attr_reader :x, :y, :score # De här variablerna ska kunna läsas från andra klasser. Det uppnås med metoden attr_reader. def initialize(window) @window = window @icon = Gosu::Image.new(@window, "asteroid.png", true) @x = rand(@window.width) # Asteroidens position i x-led slumpas fram. @y = 0 @score = 0 @speed = 3 # Asteroidens fart sätts inledningsvis till 3, kan ökas om man vill att spelet ska vara svårare redan från början. @asteroids = 0 end def update if @y > @window.height @x = rand(@window.width) @y = 0 @score += 10 # Betyder samma sak som @score = @score + 10. Det vill säga: varje gång asteroiden "runnit ut" ur fönstret ökas poängen med 10. @asteroids += 1 else @y += @speed end if @asteroids == 5 @speed += 1 # Var femte gång asteroiden passerar skruvas farten upp ett snäpp! @asteroids = 0 end end def draw @icon.draw(@x, @y, 2) end end window = Window.new window.show