Koda spel i Ruby

Lektion 2: Något att spela med

Okej, så vi har ett spelfönster. Inte illa! Men för att det ska bli ett spel måste det finnas lite grejor inuti fönstret också. Till att börja med behöver vi något att spela med, alltså något som spelaren kan flytta runt därinne i fönstret. Och eftersom det här ska bli ett rymdspel så skulle det väl passa bra med ett rymdskepp?

För att kunna skapa ett rymdskepp måste vi skriva ytterligare en klass. Jag tycker att vi kallar den för Hero, som betyder "hjälte". Så direkt efter Window-klassen skriver vi:


class Hero
  def initialize(window)
    @window = window
  end
end
      

Du kanske tycker att det ser konstigt ut med alla window. Men de behövs för att rymdskeppet ska veta var det hör hemma – i vårt spelfönster.

Nu behöver vi en bild på rymdskeppet också. Eller, som det också kallas, en ikon. Här nedanför ligger en bild som du kan använda. Det är bara att högerklicka på bilden och spara den på datorn. Låt den behålla namnet "spaceship.png". Flytta den sedan till den mapp där du sparade ditt program.

När bilden är på plats i rätt mapp ska vi lägga till en rad i Hero-klassen, så att datorn vet vilken bild som ska användas:


class Hero
  def initialize(window)
    @window = window
    @icon = Gosu::Image.new(@window, "spaceship.png", true)
  end
end
      

Sedan ska vi ge rymdskeppet en startposition. Som du kanske minns är spelfönstret 640 pixlar brett och 480 pixlar högt. Även positioner mäts i pixlar, och man börjar räkna från övre vänstra hörnet.

Det här blir lättare att begripa om man provar sig fram. Låt oss lägga till ytterligare en metod i Hero-klassen, som heter draw ("rita"):


class Hero
  def initialize(window)
    @window = window
    @icon = Gosu::Image.new(@window, "spaceship.png", true)
  end
  
  def draw
    @icon.draw(0, 0, 2)
  end
end
      

Koden i draw-metoden säger att rymdskeppet ska ha positionen 0 pixlar i sidled och 0 pixlar i höjdled. Den sista siffran, tvåan, kan du bortse från tills vidare.

För att rymdskeppet ska visas i fönstret måste vi göra ett par ändringar i Window-klassen också:


class Window < Gosu::Window
  def initialize
    super(640, 480, false)
    @hero = Hero.new(self)
  end
  
  def update
  end
  
  def draw
    @hero.draw
  end
end	  
	  

I metoden initialize lägger vi till en rad som får datorn att skapa ett nytt rymdskepp, enligt beskrivningen i klassen Hero. Och i draw-metoden gör vi så att skeppet ritas ut i fönstret.

Om du nu sparar programmet och provkör det så lär det fönster som visas se ut på det här viset:

Men vi vill kanske att rymdskeppet ska ritas lite längre till höger, och lite längre ner i fönstret. Vi ändrar i Hero-klassens draw-metod:


class Hero
  def initialize(window)
    @window = window
    @icon = Gosu::Image.new(@window, "spaceship.png", true)
  end
  
  def draw
    @icon.draw(100, 215, 2)
  end
end
      

Nu ska bilden av rymdskeppet ritas 100 pixlar till höger, och 215 pixlar ner i fönstret. Kör programmet igen. Det ser bättre ut, inte sant? Testa gärna att flytta rymdskeppet till andra positioner. Och varför inte prova att ändra storleken på spelfönstret när du ändå är igång?

Det program som vi har skrivit så här långt ska nu se ut så här:


require 'gosu'

class Window < Gosu::Window
  def initialize
    super(640, 480, false)
    @hero = Hero.new(self)
  end
  
  def update
  end
  
  def draw
    @hero.draw
  end
end

class Hero
  def initialize(window)
    @window = window
    @icon = Gosu::Image.new(@window, "spaceship.png", true)
  end
  
  def draw
    @icon.draw(100, 215, 2)
  end
end

window = Window.new
window.show
      

Det här börjar faktiskt likna ett riktigt spel! Fast visst vore det roligare om vi kunde styra rymdskeppet också? Det ska vi ordna i nästa lektion!