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ä?
"2d vector reflection"
Tuolla kai pientä apua:
http://www.gamedev.net/community/forums/topic.
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?
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.
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.
Tuo mikon systeemi toimii hienosti, pitää tosiaan vain muistaa se että pelaaja voi törmätä kahteen seinään samanaikaisesti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.