Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Törmäys SDL:llä

omcesa [04.10.2013 21:45:06]

#

Olen saanut osittain putkan oppaan avulla kasaan ohjelman, jossa voi liikuttaa neliöä. Ikkunan ulkopuolelle liikkuminen ei onnistu, sen onnistuin vielä itse ohjelmoimaan.

Mutta, nyt minulla on pelissä kaksi liikutetavaa neliötä, miten saan niille törmäystarkisustuksen aikaan? Googlea olen aikas paljon käyttänyt, mutta ratkaisua ei löydy. Jos joku nyt viitisisi kasata minulle selkeän ja kattavan ohjeen tähän, olisin todella kiitollinen. En näet ole mikään guru SDL:n kanssa.

Tzaeru [07.10.2013 16:58:31]

#

Yksinkertaiseen 2D-avaruudessa tapahtuvaan törmäystarkistuksen ei ole mitään syytä tai tarvetta käyttää mitään SDL:n ominaisuuksia - eikä kyllä oikein monimutkaisempiinkaan törmäystarkistuksiin.

"Suorassa" olevien neliöiden tapauksessa mahdollisen törmäyksen tarkistus on melko suoraviivaista (heh!). Voit vaikkapa tarkistaa, onko neliön sijainti +/- sen leveys/korkeus toisen neliön sijainnin +/- sen leveyden/korkeuden sisällä. Toisinsanoen sanoen riittää, kun katsot, onko yksikään neliön sivuista toisen neliön sivujen sisällä.

Jos nyt kuitenkin oletetaan SDL käyttöön, voisi törmäystarkistus olla tämäntyylinen (pseudokoodisti):

bool TarkistaTormays(SDL_Rect *A, SDL_Rect *B)
{
  int VasenSivu_A = A.x
  int OikeaSivu_A = A.x + A.w

  int YlaSivu_A = A.y
  int AlaSivu_A = A.y + A.h

  /** Samanlaiset muuttujat B:lle **/

  // Tarkistetaan onko A:n ylä/alasivu B:n ylä/alasivun ulkopuolella
  if (YlaSivu_A >= AlaSivu_B && Ylasivu_B >= AlaSivu_A)
    // Jos oli, törmäystä ei voi tapahtua
    return false

  // Tähän sama vasemmalle ja oikealle sivulle.
  [...]

  // Jos A:n sivut eivät olleet B:n sivujen ulkopuolella, törmäys on tapahtunut.
  return true
}

(PS. googlesta löytyi paljon hyviä vastauksia ja valmiita koodiesimerkkejä sekä englanniksi (hakusanana "SDL collision check") että suomeksi (hakusanana "SDL törmäystarkistus"). Hauskasti suomenkielisistä tuloksista iso osa osoitti ohjelmointiputkaan.)

omcesa [09.10.2013 11:50:23]

#

Kiitoskiitoskiitos todella paljon, pienen sovelluksen avulla onnistuin ratkaisemaan minua todella pitkään vaivannenn ongelman. :)

omcesa [09.10.2013 14:16:55]

#

Tai sitten en... -_-

Metabolix [09.10.2013 15:09:22]

#

Laatikot eivät törmää, jos yksi laatikko (A) on kokonaan toisen laatikon (B) vasemmalla puolella (A.x + A.w <= B.x), oikealla puolella (A.x >= B.x + B.w) tai ylä- tai alapuolella (A.y + A.h <= B.y || A.y >= B.y + B.h). Muuten laatikot törmäävät.

Tzaerun koodissa taitaa olla virheellinen &&-operaattori, kun pitäisi olla ||-operaattori.

Tzaeru [09.10.2013 16:09:59]

#

Hupsista keikkaa. Näin sitä käy, kun sokkona ja nopeasti ulkomuistista heittää. ;)

Vastaus

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

Tietoa sivustosta