Terve kaikki,
Eli olen väsäämässä 2D peliin perus Box Collision tunnistusta.
Perusperiaatteiltaan ko. tunnistus on yksinkertainen, mutta törmäsin erääseen ongelmaan.
Eli tarkistan if -lauseillani onko ko. objektin sivut Left, Right, Top ja Bottom törmänneet toisen objektin sivujen kanssa. Ongelmia ilmenee kuitenkin siinä, että kun esim. objektin Top -sivu törmää toisen objektin Bottomin kanssa törmää myös Left ja Right sivut.
Tässä hyvin havainnollistava kuva. :)
http://oi42.tinypic.com/11v4emb.jpg
- Kiitos
No kerrohan nyt vähän niistä ongelmistasi.
Eli ongelmahan on toi että periaateessahan tuossa tuo vihreä objekti voisi liikkua vasemmalle sekä oikealle, mutta koska koordinaatit mätsäävät myös left ja rightin kanssa niin tuloksena on, että käyttäjä voi liikuttaa objektia vain alas.
Onnistuisiko niin että tarkistaa onko objektin left sama kuin toisen objektin right, right sama kuin left, top sama kuin bottom ja bottom sama kuin top?
Eli kun liikuteltavan top = paikallaan olevan bottom, se on törmännyt. Mutta kuitenkin right ei täsmää leftiin eikä toisinpäin?
Tajusinkohan edes itsekään..
En aivan ymmärtänyt? :)
Edit1:
Eli tarkennuksena vielä, että tarkoitan left ja right törmäyksellä laatikon left ja right sivuja.
Kun yritetään liikkua, tarkistetaan:
-Onko liikuteltavan Top sama kuin paikallaan olevan Bottom
-> Jos on, ei saa liikkua ylöspäin
-Onko liikuteltavan Bottom sama kuin paikallaan olevan Top
->Jos on, ei saa liikkua alaspäin
-Onko liikuteltavan Left sama kuin paikallaan olevan Right
->Jos on, ei saa liikkua vasemmalle
-Onko liikuteltavan Right sama kuin paikallaan olevan Left
->Jos on, ei saa liikkua oikealle
Koska aina jos törmätään esimerkiksi liikkumattoman laatikon oikeaan reunaan, on törmääjänä pakko olla vasen reuna. Ei siis tarkasteta että osuuko vaikka alareuna oikeaan reunaan.
Hmm, siis koordinaatti tasolla mietittynä ei ohjelma sinänsä tiedä mikä on bottom top jne jne. Vaan miten ne mätsäävät väleillä.
Tässä tarkistus metodini. Törmäys ilmaistaan tavun biteillä 0 - 3.
Bitti
0 - Left
1 - Top
2 - Bottom
3 - Right
...
Yksi tapa on, että liikutaan pois törmäysalueelta ennen piirtoa. Eli jos saat tiedon törmäyksestä esimerkiksi ylöspäin niin liikutat koordinaatti kerrallaan objectia alaspäin niin pitkään ettei kyseinen törmäys ole enää voimassa. Vasta sen jälkeen piirrät muuttuneen tilanteen.
Hmm, mielestäni kokeilin tuota aikasemmin ja jäin siihen käsitykseen ettei toiminut. Mutta tosiaan kokeilin nytten ehdotuksestasi johtuen uudelleen ja näyttäisi tuolla siirolla sitten kuitenkin toimivan? :)
Eli näillä näppäimillä näyttäisi ongelma ratkenneen.
Suuret kiitokset kaikille vastanneille.
Eikös törmäys ole mahdollista vain yhdestä suunnasta kerrallaan. Jos ollaan kiinni Bottonissa ei muita suuntia tarvitse edes tarkistaa.
Periaatteessa yks sivu per objekti kyllä, mutta mistä tiedät, että juuri Bottom on se ns. "oikea" törmäys?
No esim. siitä että left ja right ei oo reunassa vaan "sisällä"
Ei sitä edes tarvitse tietää, jos siirryt aina vain takaisin tulosuuntaan.
Tänää pääsin todelliseen läpi murtoon törmäyksentunnistukseni kanssa. :)
Ratkaisuksi koitui loppujen lopuksi penetration depth -arvojen huomioon ottaminen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.