http://www.gamedev.net/community/forums/topic.
Osaisiko joku selittää millä periaatteella (ihan yksinkertaisesti) tehdään kosketuksien havaitsemista (vai onko se törmäyksien?) 2D:tä ohjelmoidessa?
Just näin. Tossa on tommonen hakupalkki vieressä joka antaa sanalla törmäys yhteensä 40 tulosta. Sieltä kuule löytyy kaipaamasi aivan varmasti.
Edit: okei, tuli vähän tyly vastaus, onhan sitä itsekin joskus tommosia mietitty :) Eli tarkistat niitä kordinaatteja..
Onkohan semmoinen viisas tapa määrittää objektissa vaikka
4 törmäyspistettä, ja sitten tarkastaa aina jokaista törmäyspistettä vastaava koordinaatti kartasta, jossa
jokainen pikseli on boolean arvolla määritetty pääseekö läpi vai eikö pääse?
Eli nuo törmäyspisteet kappaleille voisivat olla:
kappaleen x kordinaatti.
kappaleen y kordinaatti.
kappaleen x kordinaatti + leveys
kappaleen y kordinaatti + korkeus
Sitten kannattaa pitää niiden kappaleiden johon törmätään kordinaatteja taulukossa:
Dim KordinaatitX(1 to 10) As Long, KordinaatitY(1 to 10) As Long
Tämän jälkeen kannattaa tarkistukseen käyttää esimerkiksi For- silmukkaa, jolloin saadaan tarkistettua jokainen kappale nopeasti, eikä koodirivejä tule miljoonia.
For i = 1 To 10 If pelaaja.x < kordinaatitx(i) And pelaaja.x + pelaaja.leveys > kordinaatitx(i) Then If pelaaja.x > kordinaatitx(i) And pelaaja.x - pelaaja.leveys < kordinaatitx(i) Then If pelaaja.y < kordinaatity(i) And pelaaja.y + pelaaja.korkeus > kordinaatity(i) Then If pelaaja.y > kordinaatity(i) And pelaaja.y - pelaaja.korkeus < kordinaatity(i) Then 'mitä tapahtuukaan kun törmäys sattuu End If End If End If End If Next
Huom! Äskeinen koodinpätkä oli sitten heitetty hatusta, virheet ovat mahdollisia.
Tuo taitaa toimia vain suorakulmaisilla kappaleilla.
Tähän ongelmaan voisi hyödyntää myös täällä koodivinkeissä olevaa "Leikkaavatko kaksi janaa?"-pätkää.
Oletan että sulla on kenttä taulukossa eli teet sen tileillä. Sillon tää on kohtuullisen helppoa.
vanha_x=ukko.x vanha_y=ukko.y ' tässä kohdassa liikutat vaan ei mitään vertailuja vanha_y = Int((ukko.y) / 32) ' 32 on tilen koko vanha_x = Int((ukko.x) / 32) ' ... sama vika if kentta(vanha_x,vanha_y)=1 then ' oletan että 1 on kentässä vaikkapa vesi ukko.x=vanha_x ukko.y=vanha_y end if ' ja toi ei hypytä sitä ukkoa toisin kuin monet luulee
Tarkistuksen voi tehdä monella tavalla. Kaikkein helpoin on ympyrä, koska silloin voi vain laskea pelaajien etäisyyden toisistaan pythagoraan lauseella ja jos se on liian pieni, voi siirtää pelaajaa sopivan määrän takaisin päin. Palikkatarkistus (ainakin tuo Kaviaarin tyylinen) aika turha, jos peli on reaaliaikainen (koska silloin tuskin liikutaan tile kerrallaan), mutta helppo sekin, jos palikka on aina tuossa samassa asennossa (eli tasohyppelyyn kelpaa hyvin). Homma vaikeutuukin sitten heti, jos palikka pitää kääntää kulmittain.
Kun yrität toteuttaa noita ja tulee ongelmia, älä aloita pyytämällä täältä apua. Nouse pois koneen äärestä, ota kynä, viivain ja paperia, mene pöydän ääreen ja piirrä kuva, josta näet, mitä asioita ja etäisyyksiä tiedät (eli voit laskea) ja mitä pitää selvittää, jotta saat selville, mikä törmää mihin ja mitä asialle pitäisi tehdä. Se on oikea tapa, siitä oppii. Trigonometria ja pythagoraan lause on syytä osata. Jos niitä ei ole vielä missään opetettu, opettele itse, eivät ne niin vaikeita ole.
Tuolla GameDevin foorumilla on näköjään esitetty pari hyvää tapaa (vaikkakin aika mielenkiintoisia paikoin). Jonkinlainen graafinen tarkistus (eli katsotaan, menevätkö pikselit päällekkäin) on ihan kätevä, jos haluat oikeasti eri muotoja. Isommissa esineissä voi olla myös kätevää rajata hahmo viivoilla ja laskea niiden leikkauspisteitä.
Hyödyllisiä ohjeita löytyy GameDevin artikkeleista kohdassa Collision Detection.
Metabolix kirjoitti:
Hyödyllisiä ohjeita löytyy GameDevin artikkeleista kohdassa Collision Detection.
Katoppa mitä kirjootin ihan esimmäiseksi tähän aiheeseen.
Hmm :/ Metabolix hyvä, tuota tarkastusta voi käyttää kyllä ihan liikuttaessa muutenkin kuin harppomalla tile kerrallaan, joskaan olet oikeassa jos systeemi pyöritetään omituiseen asentoon ei tuo tapa sitten enää pädekkään, vaan ukkeli lipuu tilejen päälle, tietty voihan senkin korjata mutta se olisi sitten jo aika säätämistä.
Yksi nakkihelppo tapa on tietty tehdä mustavalkokartta johon merkataan mustalla kaikki romu joiden läpi ei mennä, ja aina kun ollaan liikuttu tarkistaa ollaanko mustan päällä mustavalkokartassa, jos ollaan niin paltaan takaisin edelliseen koordinaattiin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.