Tasohyppelypeli 7: bittikarttatiedostojen lataaminen ja spritejen piirtäminen
- Ladataan spritearkki (eli sprite sheet) bmp-tiedostona, joka sisältää neljä erilaista seinäpalasta, grafiikan kahdelle erilaiselle piikkiansalle sekä kerättävälle timantille.
- Jaetaan ladattu arkki yksittäisiin spriteihin.
- Muutetaan map-taulukon alkioita vastaamaan spritearkin lohkoja, jotta kullekin alkiolle valitaan piirrettäväksi oikea lohko.
- Muutetaan kentänpiirtämisfunktiota niin, että aiempien neliöiden sijaan piirretään spritearkin spritet.
Spritearkki
Tässä käyttämämme spritearkki, jonka spritet on toteuttanut PiiXL (ks. https://piiixl.itch.io/platformer ja https://piiixl.itch.io/textures). Arkki luetaan vasemmalta oikealle ja ylhäältä alas, eli vasemman yläkulman sprite saa map-taulukon alkioarvon 1, oikean yläkulman 2, jne.
Eli:
- kiinteä seinä piirretään alkioarvoilla 1–4
- piikkiansat piirretään alkioarvoilla 5–6
- kerättävät timantit piirretään alkioarvolla 7.
Huomaa oikean alakulman sprite, joka esittää hahmoa. Tätä spriteä ei ole tarkoitus piirtää pelissä, vaan sitä hyödynnetään myöhemmin kenttäeditorissa, jossa määritetään pelaajan aloitussijainti alkioarvolla 8.
Main.h
Koska spritearkki on jaettu kahdeksaan spriteen, lisää main.h-otsikkotiedostoon vakio NUM_MAP_SPRITES ja anna sille arvo 8.
Ja jälleen seuraa mälsää kartan muokkausta. Erityisesti seinätiilien (spritearkin alkiot 1–4) kanssa saa olla tarkkana, että kuhunkin ruutuun valitaan piirrettäväksi spritearkista oikea tiili.
Päivitä map-taulukkoa siis seuraavalla tavalla:
- vaihda arvot 2 arvoihin 5 ja 6;
- 5 on siis lattialla seisovia piikkiansoja varten ja 6 katosta roikkuvia
- vaihda arvot 3 arvoihin 7
- vaihda osa arvoista 1 arvoihin 2, 3 tai 4;
- jos kuvitellaan kolmen tiilin korkuinen palkki, niin:
- arvoa 1 käytetään sen yläosassa
- arvoa 2 käytetään sen keskiosassa
- arvoa 3 käytetään sen alaosassa.
Ai että, miten sekavaa! Olemme koko ajan lähempänä sitä hetkeä, kun kenttien piirtämiseksi otetaan käyttöön jokin editori.
Lisää BITMAP-muuttujat *mapSpriteSheet ja *mapSprites[NUM_MAP_SPRITES].
*mapSpriteSheet on siis koko spritearkin bittikartta, kun taas *sprites[NUM_MAP_SPRITES] sisältää spritearkista poimitut yksittäiset spritet.
Main.c
Koska laitoimme map-taulukkomuuttujan alkioarvot uuteen uskoon, myös muuta koodia pitää muuttaa, jotta seinät, piikkiansat ja esineet käsitellään oikein.
Tee siis main.c-lähdekooditiedoston GetPositions-funktiomäärittelyyn seuraava muutos, jossa nollataan laskuri aina kun map-taulukkomuuttujan alkioarvon tyyppi vaihtuu joksikin toiseksi. Eli:
- kasvatetaan laskuria kun mapArrayIndex-muuttujan arvo on 1–4 eli seinätiilet
- kun saavutetaan mapArrayIndex-muuttujan arvo 5 eli ensimmäinen piikkiansa (mapArrayIndex == 5), nollataan laskuri (count = 0)
- kun saavutetaan mapArray-muuttujan arvo on 7 eli kerättävä esine, nollaus tehdään taas.
Näin kaikki kolme erilaista spritetyyppiä kerätään omiksi sarjoikseen eikä niitä sekoiteta toisiinsa.
Tee sitten seuraava muutos DrawGame-funktiomäärittelyyn, jossa GetPositions-funktiokutsuilla haetaan sijainti map-taulukon alkioarvoille 1–7 sekä piirretään ne ruudulle DrawMap-funktiokutsuilla, joissa on nyt vain yksi parametri aiemman kahden sijaan.
Muuta sitten GetItems-funktiomäärittelyn currentMap[i][j]-tarkistuksen arvoksi 7 aiemman 3:n sijaan. Eli aina, kun currentMap-taulukosta löytyy alkioarvo 7, lisätään se kentästä löytyvien esineiden yhteismäärään.
Tee sama muutos myös CollectItems-funktiomäärittelyn Collided-tarkistukseen. Eli aina, kun pelaajahahmo törmää currentMap-taulukkomuuttujan alkioarvoon 7, kerätään pelaajan taskuun esine ja poistetaan se kentästä.
Näin on tehty kaikki muutokset, jotka liittyvät kentän päivitettyihin alkioarvoihin.
Spritejen lataaminen bittikarttatiedostosta
Lisää main.c-lähdekooditiedostoon määrittely LoadMapSprites-funktiolle, jossa:
- ladataan load_bitmap-funktiokutsulla tiles.bmp-bittikarttatiedosto mapSpriteSheet-muuttujan arvoksi
- tarkistetaan, onnistuiko bittikarttatiedoston lataaminen; jos ei, tulostetaan virheilmoitus allegro_message-funktiokutsulla
- luetaan mapSpriteSheet-muuttujaan ladatun bittikarttatiedoston sarakkeet (cols) ja rivit (rows) ja kerrotaan ne yhteen, jotta saadaan selville, kuinka paljon niitä on yhteensä (total)
- lopuksi käydään mapSpriteSheet-muuttuja läpi ja "kerätään" sen yksittäiset bittikartat sprites[]-taulukkomuuttujan alkioarvoiksi create_sub_bitmap-funktiokutsun avulla.
Lisää sitten LoadMapSprites-funktiokutsu SetupProgram-funktiomäärittelyyn.
Lisää vielä Terminate-funktiomäärittelyyn mapSprites- ja mapSpriteSheet-bittikarttamuuttujien vapauttaminen muistista destroy_bitmap-funktiokutsun avulla.
Ja näin on spriten lataaminen toteutettu!
Spritejen piirtäminen
Tee DrawMap-funktiomäärittelyyn seuraava muutos, jossa aiempien rectfill-funktiokutsuilla piirrettyjen neliöiden sijaan piirretään nyt bittikarttaspritet funktiokutsulla draw_sprite.
Poista myös funktiomäärittelyn jälkimmäinen parametri int paletteIndex niin, että jäljelle jää vain int mapArrayIndex.
Ja näin. Suoraan sanottuna: vau. Aika huikea parannus aiempaan.
Huomaa myös tummempi taustan väri sekä timanttien väritykseen sopiva HUD.
Kommentit
Lähetä kommentti