Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: 3D törmäystarkistus ja reagointi

mylvari [15.02.2009 12:20:06]

#

Olen tekemässä peliä jossa on tarkoitus mennä sokkelon läpi paikasta A paikkaan B.
Ongelmaksi muodostui törmäystarkistus, tai ei niinkään itse tarkistus vaan se mitä pitäisi tehdä kun törmäys on havaittu.

Kenttä koostuu 1 ja 0 merkeistä jotka sitten renderöidään seinänä/ei seinänä.
Törmäyksen sattuessa olisi helppoa vain palauttaa viimeiset koordinaatit joilla törmäystä ei tapahtunut, mutta silloin pelaaja aina "jämähtää" kiinni seinään.
Miten olisi siis paras ja helpoin tapa saada pelaaja menemään pitkin seiniä?

User137 [15.02.2009 12:40:57]

#

"2d vector reflection"

Tuolla kai pientä apua:
http://www.gamedev.net/community/forums/topic.asp?topic_id=165537

Toisinsanoen sun pitäis peilata liikevektori seinän normaalivektorin toiselle puolelle. Siinä pitää ottaa vaan huomioon sitten miten syvälle se pelaaja olis menny ja siirtää sitä sen verran eteenpäin. Toinen ongelma tulee jos se siirto meneekin jo toisen seinän sisään.

Anna vähän lisätietoa kentästä, esim miten isoja nämä 1 tai 0 ruudut/pikselit on pelaajaan nähden?

os [15.02.2009 17:07:51]

#

Miten pelaaja liikkuminen toimii? Liikkuuko pelaaja aina vakionopeudella, jos esimerkiksi jokin nappula on pohjassa vai onko pelissä enemmän fysiikkaa?

Helpoin tapa on tehdä jotakin nopeuden seinän normaalin suuntaiselle komponentille, jos pelaaja menisi seuraavalla askeleella seinän sisään ja liikuttaa pelaajaa vasta, kun nopeus on sellainen, että seuraava askel ei vie pelaajaa minkään seinän sisälle. Tarkistuksia voi tosiaan joutua tekemään useamman, ettei pelaaja sujahda erilaisista nurkista läpi.

Itse suosittelisin peilaamisen sijaan normaalikomponentin nollaamista, jonka seurauksena pelaaja liukuu kivasti pitkin seiniä.

while (1)
{
     uusi_paikka = nykyinen_paikka + nopeus * dt; // dt = aika-askel
     if ( seinän_sisällä(uusi_paikka) )
     {
        törmäysnormaali = hae_seinän_normaali(uusi_paikka, nopeus);
        nopeus = nopeus + pistetulo(törmäysnormaali, nopeus); // nollaus
     }
     else break;
}
nykyinen_paikka = uusi_paikka;

Edellisessä (pseudo)koodissa oletetaan selkeyden vuoksi, että lähtöpiste ei ole seinän sisällä.

Käytännössä palikkatilanteessa normaalit ovat x-, y- tai z-akselien suuntaisia ja oikean suunnan voi päätellä nopeuden ja paikan koordinaateista.

mikkop92 [16.02.2009 19:02:41]

#

Tarkista erikseen x ja y koordinaattien kohdalla tapahtuisiko törmäystä jos pelaajaa siirretään vain kyseisellä akselilla. Jos törmäys tapahtuisi, ei siirretä kyseisellä akselilla. Jos ei törmää, siirretään.

Tällä tavalla pelaaja liukuu seinää vasten, mutta framea kohden liikuttavan matkan tulee olla tarpeeksi lyhyt.

mylvari [18.02.2009 18:16:11]

#

Tuo mikon systeemi toimii hienosti, pitää tosiaan vain muistaa se että pelaaja voi törmätä kahteen seinään samanaikaisesti.

Vastaus

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

Tietoa sivustosta