Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Törmäystarkistukset järkevästi

Sivun loppuun

Jyri [16.12.2004 15:43:02]

#

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?

rndprogy [16.12.2004 15:55:58]

#

No vaikka niin että se tarkistaa aina onko edessä jokin tietty merkki.

Jyri [16.12.2004 16:28:08]

#

Miten sen voi tehdä? Eli miten voi tarkistaa, että onko ukon edessä jotain?

Antti Laaksonen [16.12.2004 17:37:41]

#

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.

Jyri [16.12.2004 20:51:07]

#

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 :(

Heikki [16.12.2004 21:23:02]

#

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.

Aruviel [16.12.2004 21:23:55]

#

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...

Metabolix [16.12.2004 21:28:20]

#

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

samlui [17.12.2004 11:13:07]

#

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

Jyri [17.12.2004 16:00:56]

#

Kiitti!

Koipio-ohjelma [17.12.2004 17:54:11]

#

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

arcatan [17.12.2004 19:24:11]

#

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 :(

Koipio-ohjelma [17.12.2004 23:26:56]

#

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...

Metabolix [18.12.2004 00:35:03]

#

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.

Jyri [18.12.2004 09:54:26]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta