Tasohyppelypeli 3: Kuolema!
Elämä on lyhyt, etenkin pelihahmoilla. Tässä osassa koodataankin pelaajan kuoleminen, joka voi tapahtua kahdella tavalla: osumalla punaiseen tiileen tai putoamalla kentästä pois. Tällöin tulostetaan ruutuun teksti pelaajan kuolemisesta ja annetaan vaihtoehdoiksi joko aloittaa peli uudestaan painamalla Enteriä tai poistumalla päävalikkoon painamalla Esciä.
Teknisesti kuolemisen koodaaminen on aika yksinkertaista, kiitos hyvin tehtyjen kentän alkioiden keräämisen sekä törmäystunnistamisen aiemmassa osassa. Määritetään kenttään vain "vihollisten" paikat alkion arvolla 2, kerätään niiden sijainnit ja katsotaan osuuko pelaaja niihin; jos osuu, asetetaan muuttuja player.isDead todeksi, jolloin pelaaja todetaan kuolleeksi. Kuolema koittaa myös siinä tilanteessa, jos pelaajan pystysijainti on suurempi tai yhtä suuri kuin ruudun alareunan pystysijainti.
Vihollisten piirtäminen
Lisää main.h-otsikkotiedostoon vakio COLOR_ENEMY ja määritä se vaikkapa punaiseksi, kuten alla. Tämä tekee vihollistiilistä punaisia.
Muuta main.h-otsikkotiedostoon rakennettua map-kenttää niin, että osa alkioista saa arvon 2. Huomaa myös alareunan muutokset, joissa arvoja 1 on muutettu 0:ksi, mikä poistaa osan lattiasta.
Lisää sitten main.c-lähdekooditiedostoon DrawMap-funktiokutsu parametreilla 2 ja COLOR_ENEMY, jolloin punainen vihollistiili piirretään niihin kohtiin, joissa kentän alkiolla on arvo 2.
Ja näin kentässä on ilkeän näköisiä punaisia neliöitä – jotka ovat kuitenkin vielä aivan vaarattomia.
Vihollistiiliin törmääminen
Lisää main.h-otsikkotiedostoon seuraavat vakiot TEXT_DEATH_01 ja TEXT_DEATH_02 ja anna niiden arvoiksi tekstit, jotka tulostetaan ruudulle pelaajahahmon kuoltua.
Lisää Player-tietueeseen jäsen isDead, jolla selvitetään, onko pelaajahahmo elossa vai kuollut.
Lisää myös Tile-tietuemuuttuja enemyPositions[MAP_WIDTH * MAP_HEIGHT], jota käytetään kentän vihollistiilien sijaintien selvittämiseen.
Lisää kokonaislukumuuttuja numEnemyPositions, johon tallennetaan kentän vihollistiilien määrä.
Lisää myös KillPlayer-funktion esittely.
Siinä kaikki main.h-otsikkotiedostoon tehtävät lisäykset ja muutokset tällä kertaa. Seuraavaksi siirrytään main.c-lähdekooditiedoston pariin.
Lisää main.c-lähdekooditiedostoon KillPlayer-funktion määrittely, jossa ainoastaan katsotaan, osuuko pelaaja vihollistiileen (Collided(&player, enemyPositions, numEnemyPositions, 0, 0) tai onko pelaajan pystysijainti suurempi tai yhtä suuri kuin ruudun alareunan sijainti (player.y >= 240). Jos jompikumpi näistä toteutuu, asetetaan muuttuja player.isDead todeksi (player.isDead = 1).
Lisää main-funktion while-silmukkaan:
- tarkistus, onko pelaaja elossa vai kuollut (if (!player.isDead));
- jos player.isDead-muuttujan arvo on epätosi, eli pelaaja ei ole kuollut, sallitaan MovePlayer-funktion kutsuminen
- KillPlayer-funktion kutsu.
Muuta MovePlayer-funktion tarkistusta nuolinäppäimen alas osalta niin, että poistetaan pelaajan pystysijainnin tarkistaminen, mikä sallii pelaajan pääsemisen ruudun alapuolelle.
Lisää SetupGame-funktion määrittelyyn player.isDead-muuttujan arvon asettaminen epätodeksi (player.isDead = 0); pelaaja on siis elossa kun peli alkaa.
Lisää DrawGame-funktioon seuraavat lauseet:
- selvitetään kaikkien vihollistiilien sijainti ja niiden määrä (GetPositions(2, enemyPositions, &numEnemyPositions))
- tarkistetaan, onko pelaaja kuollut vai elossa (if (player.isDead));
- jos pelaaja on kuollut, tulostetaan ruutuun vakioihin TEXT_DEATH_01 ja TEXT_DEATH_02 määritetyt tekstit funktiokutsuilla textout_centre_ex
- jos pelaaja on elossa, piirretään pelaaja funktiokutsulla DrawPlayer.
Lisää MenuKeyInput-funktion Enter-näppäimen tarkistukseen lisätarkistus, jossa katsotaan, onko ohjelman aktiivinen tila pelitila ja että onko pelaaja kuollut (else if (activeGameState == GAME && player.isDead)); jos kumpikin toteutuu, sallitaan häivytykset (allowFadeOut = 1 ja allowFadeIn = 1) ja pelin alustaminen (setupGameDone = 0).
Nyt punaiset neliöt sekä näyttävät vaarallisilta että ovat sitä, sillä pienikin kosketus niihin tekee pelaajahahmosta selvää. Lisäksi kentän alapuolella odottaa vaarallinen rotko.
Kommentit
Lähetä kommentti