SuomiGameHUB

Maailma tarvitsee pelejä

SDL2 Ikkuna

Ikkunan luonti SDL:llä on prosessi, joka koostuu useasta vaiheesta. Löydät koko koodin sivun alalaidasta.

Ensimmäinen askel on luoda ikkuna käyttäen SDL_CreateWindow-funktiota. Tämä funktio vaatii useita parametreja, jotka määrittelevät ikkunan ominaisuudet ja käyttäytymisen. Aloitetaan antamalla ikkunalle nimi, esimerkiksi ”SGH SDL Esimerkki”. Tämä nimi näkyy ikkunan otsikkopalkissa ja auttaa käyttäjää tunnistamaan sovelluksen.

Seuraavaksi määritellään ikkunan sijainti ja koko käyttämällä x- ja y-koordinaatteja sekä leveyttä (width, W) ja korkeutta (height, H). Esimerkiksi koordinaatit 0, 0 asettavat ikkunan näytön vasempaan yläkulmaan. Leveyden ja korkeuden määrittelyssä voidaan käyttää arvoja kuten 1280 ja 720, mikä luo 16:9 kuvasuhteen ikkunan. Nämä arvot määrittävät, kuinka suuri ikkuna on ja missä se sijaitsee näytöllä.

Lisäksi ikkunan luonnissa voidaan käyttää erilaisia lippuja (flags), jotka määrittelevät ikkunan lisäominaisuuksia. Yksinkertaisuuden vuoksi voimme käyttää tässä esimerkissä vain SDL_WINDOW_SHOWN-lippua, joka tekee ikkunasta näkyvän heti luomisen jälkeen. SDL:n dokumentaatio tarjoaa tarkempaa tietoa eri lipuista ja niiden käytöstä.

Kun ikkuna on luotu, siirrytään luomaan pinta (surface), jolle grafiikka piirretään. Tämä tehdään SDL_GetWindowSurface-funktiolla, joka palauttaa ikkunaan liittyvän piirtoalueen (surface). Tämän funktion argumenttina käytetään aikaisemmin luodun ikkunan osoitinta. Tämä pinta toimii piirtopohjana, jolle voidaan piirtää erilaisia graafisia elementtejä.

Käytetään pinnalle piirtämiseen SDL_FillRect-funktiota. Tämä funktio täyttää määritellyn suorakulmion (rectangle) valitulla värillä pinnalla. Funktio tarvitsee useita parametreja: ensimmäisenä pinnan (surface), jolle piirretään. Tämän jälkeen määritellään piirrettävä suorakulmio. SDL käyttää erilaisia geometrisia muotoja, kuten suorakulmioita (rectangles), piirustuskohteiden määrittelyyn. Tässä yhteydessä suorakulmion voi asettaa NULL-arvoon, mikäli halutaan piirtää koko pinnalle.

Värien määrittely SDL_FillRect-funktiossa tapahtuu käyttämällä SDL_MapRGB-funktiota, joka muuntaa punaisen, vihreän ja sinisen väriarvot pikselin väriarvoksi. Tämä funktio vaatii pikseliformaatin, joka voidaan hakea aiemmin luodulta pinnalta. Väriarvot annetaan yleensä heksadesimaalikoodina, esimerkiksi valkoisen värin koodi on 0xFFFFFF, tai tässä tapauksessa, kun jokainen kanava (RGB) annetaan omana parametrinaan, 0xFF, 0xFF, 0xFF.

Kun piirustus pinnalle on valmis, pinta on päivitettävä, jotta muutokset tulevat näkyviin ikkunassa. Tämä tehdään SDL_UpdateWindowSurface-funktiolla, jolle annetaan argumenttina ikkunan osoitin.

Kun olemme varanneet tilaa SDL-ikkunalle, on tärkeää muistaa tuhota se asianmukaisesti ohjelman suorituksen päättyessä. Tämä varmistaa, ettei järjestelmään jää ylimääräisiä resursseja käyttämättömänä, mikä on keskeistä ohjelmoinnissa ja resurssienhallinnassa. Ikkunan tuhoaminen tehdään käyttämällä SDL_DestroyWindow-funktiota, joka vapauttaa kaikki ikkunaan liittyvät resurssit. Tämä on välttämätöntä ohjelman asianmukaisen sulkeutumisen kannalta.

Koodin kääntäminen ja suorittaminen tuo esiin yhden yleisen ongelman: ohjelman odotettua toimintaa ei tapahdu. Tässä tapauksessa virheviesti viittaa puuttuvaan SDL2.dll-tiedostoon. Tämä johtuu siitä, että SDL-kirjaston dynaaminen linkkikirjasto (DLL) puuttuu. Ongelman ratkaisemiseksi tulee kopioida SDL2.dll-tiedosto projektin suoritettavan tiedoston (.exe) kanssa samaan hakemistoon. Tämä varmistaa, että ohjelma löytää tarvittavat kirjastot suoritettavaksi.

Lisäksi, kun käytämme Visual Studiota, tiedostorakenteen ymmärtäminen on tärkeää. Käännetty ohjelma sijaitsee tyypillisesti Debug– tai Release-hakemistossa projektin juurikansiossa. DLL-tiedostot, kuten SDL2.dll, tulee sijoittaa tähän hakemistoon, jotta ohjelma voi käyttää niitä suorituksen aikana.

Kun ohjelma on käynnistetty ja ikkuna luotu, käyttäjä voi huomata, että ikkuna sulkeutuu välittömästi. Tämä johtuu siitä, että ohjelma ei odota käyttäjän syötettä tai muita tapahtumia. Ratkaisuna tähän ongelmaan on toteuttaa tapahtumasilmukka (event loop), joka odottaa käyttäjän toimia, kuten ikkunan sulkemista. SDL käyttää tapahtumajonoa (event queue), joka käsittelee erilaisia käyttäjän toimia, kuten hiiren klikkauksia tai näppäimistön painalluksia.

Tapahtumankäsittelyn toteuttamiseksi luodaan SDL_Event-tyyppinen muuttuja, joka tallentaa tapahtumatietoja. Käytämme boolean-muuttujaa (esim. quit), jonka alkuperäinen arvo on false. Tämä muuttuja toimii silmukan jatkamisen ehtona. Pääsilmukassa (while) tarkistetaan, onko quit-muuttujan arvo edelleen false. Jos on, silmukka jatkaa toimintaansa. Sisäisessä silmukassa käytetään SDL_PollEvent-funktiota tarkistamaan, onko tapahtumajonossa käsittelemättömiä tapahtumia. Jos jonosta löytyy SDL_QUIT-tapahtuma, esimerkiksi käyttäjän sulkiessa ikkunan, asetetaan quit-muuttujan arvoksi true, mikä lopettaa pääsilmukan toiminnan ja ohjelma pääsee etenemään sulkeutumisvaiheeseen.

Lopuksi ohjelmaan lisätään return 0;-rivi, joka ilmoittaa ohjelman päättymisestä onnistuneesti. Tämä on standardi tapa int-tyyppisessä main-funktiossa ilmaista, että ohjelma suoritettiin ilman virheitä. Huomaa myös, että SDL2:ssa main-funktion täytyy olla nimenomaan formaatissa: int main(int argc, char* argv[]).

#include <SDL.h>

int main(int argc, char* argv[])
{
  SDL_Window* window = NULL;
  SDL_Surface* screenSurface = NULL;
  window = SDL_CreateWindow("SGH SDL Esimerkki", 0, 0, 1280, 720, SDL_WINDOW_SHOWN);
  screenSurface = SDL_GetWindowSurface(window);
  SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF));
  SDL_UpdateWindowSurface(window);

  SDL_Event e;
  bool quit = false;

  while (quit == false)
  {
    while (SDL_PollEvent(&e))
    {
      if (e.type == SDL_QUIT) quit = true;
    }
  }

  SDL_DestroyWindow(window);
  SDL_Quit();

  return 0;
}

Edellinen osa: Oma pelimoottori SDL2:n avulla