Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Seinät

Sivun loppuun

Andu [03.04.2006 21:24:06]

#

Pitäisi saada niin, että pelini ukko ei menisi seinien läpi.
Ohjelmoin C(++):llaja SDL:llä.

Meitsi [03.04.2006 21:32:42]

#

Auttaisi, jos kertoisit hieman pelisi muusta toteutuksesta. Miten olet toteuttanut seinät tällähetkellä, millaisessa muodossa pelissäsi kerrot että jossainpäin on seinä? Onko pelisi kenties ylhäältäkuvattu vai isometrinen?

Yleisenä vinkkinä voidaan sanua, että tutkit pala palalta, osuuko ukko seinään. Tähän löytyy esim Blazen Codefaqsta vinkki VisualBasicille, joten sen voit helposti muuttaa c-tyyliseksi. Jos haluat optimoida törmäystarkistusta, laske ensin onko objekti tarpeeksi kaukana. Jos on, voit ohittaa törnäystarkistuksen. Jos jotain hienostuneempia tarkistuksia haluat, voit käyttää vaikka ukon ja seinän kuvien alpha-maskeja (jos niillä sellaiset ovat, ja onnistuu vain ylhäältäkuvatussa) törmäyksen tarkistamiseen pikselintarkasti. Tämä kyllä syö luultavasti aika reippaasti tehoja jos ei ole hyvin toteutettu, mutta ehdotinpahan vain.

Jaska [03.04.2006 22:50:03]

#

Toimisiko seuraava ratkaisu: Lasket ukon koordinaatit ennen ja jälkeen kuvitteellisen siirtymisen. Jos koordinaattien välinen jana leikkaa seinän, älä tee siirtymää, Jos ei leikkaa, siirry.

Triviaali ongelma kunhan tuntee topologiasta tutun reunanylityslauseen. Tai sitten ymmärsin tehtävän väärin.

Tzaeru [03.04.2006 23:21:23]

#

Itse ainakin (isometrinen) tein sillee, että kun pelimaailma on yhdessä taulukossa ja hahmo liikkuu ruudun kerrallaan, niin tyyliin tarkastetaan liikuttaessa, että millainen se seuraava ruutu on.. esim. jos ruutu on isompi kuin 10 (tarkastetaan taulukosta se kohta, jonka ruutu on kyseessä) on kyseessä seinä, jolloin ei liikuta :o

oonpa huono selittämään :)

Andu [04.04.2006 15:07:13]

#

Peli on sivulta kuvattu ja siinä on painovoima. Ensin esittelen seinät merkki taulukossa, jonka jälkeen tulostan sen while-silmukalla taulukon avulla.

Edit: Ongelma on oikeastaan, että en tiedä mikä on seinän nimi. Seuraava esimerkki voi selventää vähän:

//Koodini alussa:
SDL_Surface *seina;

//Jossain kohdassa koodia:
seina = SDL_LoadBMP("laatta.bmp");

//Jossain lopussa:
if ((ypos - 21) == seina)  //20 on ukon koko (en ole varma onko tuo sulkujuttu oikein)
{
    ypos++;
}

Tuo koodi antaa virheilmoituksen:
invalid operands of types `float' and `SDL_Surface*' to binary `operator=='

Eli mitä laittaisin tuohon if lauseeseen?

rndprogy [04.04.2006 15:52:52]

#

if ((ypos - 21) == seinanankoordinaatti)

Andu [04.04.2006 16:04:01]

#

Tarkoitatko, että laittaisin seinien koordinaatit tuohon. Eli noiden punaisten seinien tuossa kuvassa:
http://tinypic.com/view/?pic=sythl4
Mutta jos seiniä on myös muualla? Kuten seuraavassa kuvassa.
http://tinypic.com/view/?pic=sythk8

rndprogy [04.04.2006 16:11:05]

#

Käytä hyväksesi sitä taulukkoa johon olet laittanut seinädatan. Laitat vaikka ukon liikkumaan myös taulukon sisällä jolloin voidaan katsoa.

if ((ypos-21) == seina[(int)(ypos/seinanpaksuus_taijoku)])

En tiedä toimiiko tämä systeemissäsi (tai yhtään missään).

Metabolix [04.04.2006 16:40:09]

#

Suosittelisin tässä sitä perinteistä ratkaisua, että sammutat tietokoneen ja otat kynän ja paperin käteen. Sitten mietit, millaisessa muodossa tasoa pidät muistissa ja kuinka siitä selviävät seinien sijainnit. Sitten mietit, miten olisi helpointa tunnistaa, törmätäänkö seinään. Esimerkiksi jos maailma on tilepohjainen, kannattaa systeemi rakentaa niin, että tilen koko on 1x1, jolloin hahmon sijainnin kokonaislukuosa kertoo, minkä tilen alueella se on. Jos taso voi olla vapaamuotoisempi, tarvitaan astetta mutkikkaampaa matematiikkaa, ja kolmiulotteisessa pelissä mennäänkin jo paikoitellen lukion pitkän matematiikan oppialueen rajoilla.

Andu [05.04.2006 17:08:40]

#

Nyt se toimii. Mutta nyt on toinen ongelma. Miten ukon saa hyppäämään muuten kuin, että se ei vain ilmesty esim. 100 pikseliä ylemmäs, vaan se näkyy kun se menee ylös?

os [05.04.2006 17:57:58]

#

Ukkosi tarvitsee x- ja y-koordinaattien lisäksi myös x- ja y-nopeuden. Kun pelaaja haluaa liikuttaa ukkoa esimerkiksi vasemmalle nappia painamalla annat ukolle tietyn (negatiivisen) x-nopeuden ja oikealle liikutettaessa samansuuruisen positiivisen nopeuden. Kun pelaaja painaa hyppynappia, ukko saa vastaavasti jonkinsuuruisen y-nopeuden. Tämän lisäksi tarvitset painovoiman: vähennä ukon y-nopeudesta jokaisella framella jokin tietty arvo, "normaaliputoamiskiihtyvyys". Jokaisella framella ukko liikkuu x-suunnassa x-nopeuden verran ja y-suunnassa y-nopeuden verran. Kannattaa myös katsoa, että ukko voi hypätä vain, jos sen jalkojen alla on maata.

Ukosta kannattaa tehdä olio:

class Ukko {
  float x, y;
  float xnopeus, ynopeus;
  void siirra() { x+=xnopeus; y+=ynopeus; }
  void aseta_nopeus() {
    if("pelaaja painaa LEFT-nuolta") xnopeus = -0.1;
    if("pelaaja painaa RIGHT-nuolta") xnopeus = 0.1;
    if("pelaaja painaa hyppynappia" && "jalkojen alla on maata") ynopeus = 0.5;
    else ynopeus -= 0.02;
    if("jalkojen alla on maata" && ynopeus<0) ynopeus=0;
    if("pää osuu kattoon" && ynopeus>0) ynopeus=0;
    if("vasemmalla puolella on seinä" && xnopeus<0) xnopeus=0;
    if("oikealla puolella on seinä" && xnopeus>0) xnopeus=0;
  }
};

Joka framella sitten kutsutaan ensin aseta_nopeus- ja sitten siirra-funktiota.

Andu [05.04.2006 18:20:18]

#

Painovoima ja kaikki muu onkin jo valmiina, mutta kun hyppää, ukko vain ilmestyy 100 pikseliä ylemmäs. Ukon pitäisi mennä ylöspäin niin että se näkyy.

Metabolix [05.04.2006 18:46:50]

#

No samalla tavalla kuin painovoimassa, mutta toiseen suuntaan. Tietenkin siis aluksi nopeammin ja siitä hidastuen, kunnes alkaa pudota.

tn [05.04.2006 19:10:56]

#

Eli hyppyhetkellä vaan annat sille ukolle jonkin alkunopeuden ylöspäin, niin painovoima hoitaa loput ja lopulta ukko tipahtaa takaisin maanpinnalle.


Sivun alkuun

Vastaus

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

Tietoa sivustosta