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.
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.)
Kiitoskiitoskiitos todella paljon, pienen sovelluksen avulla onnistuin ratkaisemaan minua todella pitkään vaivannenn ongelman. :)
Tai sitten en... -_-
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.
Hupsista keikkaa. Näin sitä käy, kun sokkona ja nopeasti ulkomuistista heittää. ;)
Aihe on jo aika vanha, joten et voi enää vastata siihen.