Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: 2D kosketuksen havaitseminen

Sivun loppuun

Lumi-ukkeli [21.02.2005 21:48:52]

#

http://www.gamedev.net/community/forums/topic.asp?topic_id=166407

Osaisiko joku selittää millä periaatteella (ihan yksinkertaisesti) tehdään kosketuksien havaitsemista (vai onko se törmäyksien?) 2D:tä ohjelmoidessa?

tuomas [21.02.2005 21:53:45]

#

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

Lumi-ukkeli [22.02.2005 08:32:34]

#

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?

tuomas [22.02.2005 21:22:29]

#

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.

Lumi-ukkeli [23.02.2005 07:45:38]

#

Tuo taitaa toimia vain suorakulmaisilla kappaleilla.

mikeful [23.02.2005 08:15:54]

#

Tähän ongelmaan voisi hyödyntää myös täällä koodivinkeissä olevaa "Leikkaavatko kaksi janaa?"-pätkää.

kaviaari [23.02.2005 08:24:35]

#

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

Metabolix [23.02.2005 13:39:47]

#

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.

Lumi-ukkeli [23.02.2005 15:07:11]

#

Metabolix kirjoitti:

Hyödyllisiä ohjeita löytyy GameDevin artikkeleista kohdassa Collision Detection.

Katoppa mitä kirjootin ihan esimmäiseksi tähän aiheeseen.

kaviaari [24.02.2005 07:33:56]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta