Eli olen tekemässä pientä adom ja nethac tyylistä peliä.
Nyt sain toimimaan ukkelin liikutuksen ja äärireunojen törmäystarkistukset. Ongelmaksi tuli kuitenkin pienten esteiden törmäystarkistukset, sillä niitä esteitä tulee PAAALJON. Eli miten olisi järkevää tehdä usean esteen törmäystarkistus?
No vaikka niin että se tarkistaa aina onko edessä jokin tietty merkki.
Miten sen voi tehdä? Eli miten voi tarkistaa, että onko ukon edessä jotain?
Sinulla täytyy esimerkiksi olla taulukossa eri kohdissa olevat esteet. Kun ukko meinaa liikkua tiettyyn suuntaan, tarkista, onko tulevan paikan kohdalla estettä. Jos on, älä liikutakaan ukkoa mihinkään.
Eli siis tähänkö tyyliinkö:
... char esteet[5][5]; esteet[1][1] = '#'; ... if(esteet[y][x-1] == '#') x += 1 ...
eli tarkastaako tää nyt että jos kohdassa x - 1 on # merkki, niin ei liikuta?
Mulla se vähän bugas. Se tarkisti aina yhen merkin ja sitte toisen tarkistuksen se heitti väärään paikkaan :(
Siis tee vaikka niin, että jos esim. ollaan likkumassa ylöspäin, katsotaan onko esteet[y-1][x] tyhjä, jos on niin liikutaan, muutoin ei liikuta.
Katsot, mihin suuntaan pelaaja yrittää liikkua. Sitten lisäät suunnan mukaisesti jotain x:lle ja/tai y:lle ja testaat. Jos törmäys löytyi, ei siirretä pelaajan hahmoa yritettyyn suuntaan. Jos ei, siirretään.
int pelaajaX = 5, pelaajaY = 5; char esteet[10][10]; esteet[5][6] = '#'; char chKey = 0; int tempPelaajaX = 0, tempPelaajaY = 0; while(chKey = getch() && chKey != 'q') { tempPelaajaX = pelaajaX; tempPelaajaY = pelaajaY; // Tee oma funktio, joka testaa, haluaako pelaaja liikuttaa ukkoaan. if(MovementKey(chKey) == true) { // Testataan, mihin suuntaan pelaaja haluaa. if(chKey == KEY_DOWN) { tempPelaajaY += 1; // Jos este löytyi, ei liikuteta pelaajaa mihinkään. Lisätään siis tempPelaajaY kohtaan takaisin Pelaajan omaan y-arvoon. if(esteet[tempPelaajaX][tempPelaajaY] == '#') { // Liikkuminen ei sovi uuteen paikkaan. tempPelaajaY = pelaajaY; } } else if(chKey == KEY_DOWN) { // JNE. Sama homma kuin ylemmässä. } // Asetetaan uudet (tai vanhat) XY arvot pelaajalle. pelaajaX = tempPelaajaX; pelaajaY = tempPelaajaY; } }
Ihan päästä heitettyä jutskua. Toivottavasti tajuat idean. Tämä on sitten vain se, miten minä sen tekisin. Toivottavasti virheitä ei ole. Ja tietysti vähän soveltamalla saa hirviöille omansa...
Nyt tuo tarkistaa, onko tyypin vasemmalla puolella este, ja jos on, se siirtää tyyppiä yhden oikealle. Siis ei hyvä. Tarkista se niin, että kun käyttäjä painaa ylös, tarkistat, onko yläpuolella (x, y-1) este ('#') ja jos on, et liiku.
edit: Aina joku ehtii ensin :)
Lisäksi vielä suosittelisin jo noin alkuvaiheessa, että lataisit maailman tiedostosta, koska ison pelit tasoja et todellakaan halua naputella lähdekoodiin tuolla este[2][2] = '#'
-systeemillä. Tason latauksesta löytyy keskustelu vaikka tästä: https://www.ohjelmointiputka.net/keskustelu/7212-pikkupelin-kentät
voisit toteutttaa tuon törmäämisen esim tarkistamalla onko edessä, jonkun tietyn värinen pixeli. Esim sinulla on kaksi eri kuvaa. Toisessa sinulla on varsinainen kartta, jonka haluat pelaajan näkevän. Toinen on muuten samanlainen kuin ensimmäinen mutta siinä kaikki esteet on väritetty tietyllä värillä esim lilalla ja muu on tyhjää. Sitten pelissä tarkistat onko 2. kuvassa pelaajan edessä se lila pixeli vai ei, mutta piirrät sille 1. kuvalle. Esim lierox on toteutettu tällä tavoin.
PS. Toivottavasti ymmärsit
Kiitti!
Muuten, tämä on tullut mieleen jo jokin aika sitten, mutta voisiko jooku tehdä tuosta oppaan? Silloin ei kenenkään tarvitsisi kysellä sitä täällä... Tai ainakin koodivinkin
Koipio-ohjelma kirjoitti:
Muuten, tämä on tullut mieleen jo jokin aika sitten, mutta voisiko jooku tehdä tuosta oppaan? Silloin ei kenenkään tarvitsisi kysellä sitä täällä... Tai ainakin koodivinkin
Surullista, kun ihmiset eivät keksi itse noinkin yksinkertaista juttua :(
Eikö olekin... Mutta minäpä en olekaan ihminen :D Tottakai, kyllähän sen itse koodaaminen olisi paljon opettavampaa, mutta kovin moni ihminen(joihin minä siis en lukeudu kun en ole ihminen, muuten kyllä) kysyy tuota.
No, eipä tuota minun vielä kannata miettiä, kun hädin tuskin osaan renderoida ikkunan (DOS:n voisi tehdä, mutta olen päättänyt, että opettelen Win32 APIn käyttöä). Tuo muuten taitaa olla yleisin kysymys ohjelmointi aiheisilla sivustoilla...
Minusta tuo on niin yksinkertainen asia, että mahtaako sitä kysyvä henkilö (a) miettiä sitä tosissaan itse ja (b, jos edellisen vastaus oli kyllä) olla oikein sopiva henkilö koodaamaan? Jos ei osaa ratkaista näin pientä pulmaa itse, niin miten mahtavat isommat sitten onnistua? Kyllä nyt oman järjen pitäisi sanoa, että törmäystarkistus toimii niin, että tarkistetaan, törmätäänkö johonkin, ja jos törmätään, ei liikuta, tai vaihtoehtoisesti, jos törmättiin jo, palataan takaisin. Ja luonnollisesti tämä kaikki kannattaa tehdä syötteen lukemisen ja asioiden piirtämisen välissä. Hieman ymmärrystä perusasioihin pitäisi löytyä aloittelijaltakin. Jostakin kumman syystä kuitenkin olen nähnyt monen laisia ... mielenkiintoisia ... viritelmiä, joissa ei ole kerta kaikkiaan mitään järkeä. Mielikuvitus on hyvä asia, jos sillä saa aikaan muutakin kuin mahdottomuuksia.
Oikeastaan minä ainakin osasin tuon periaatteessa, mutta en tiennyt, että miten se systeemi toimi taulukoilla, jonka kyllä olisin tajunnut jos en olisi näin laiska. Siis kyllä kaikki tajuaa, että törmäystarkistus toimii niin, että jos edessä on este, niin ei liikuta, mutta ongelma on useimmiten taulukointi joka tuntuu useasta vaikealta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.