Tähän tarkoitukseen paras/yleisin tapa?
Kielenä siis c++.
Luonko jättimäisen taulukon?
esim.
int map = new int[2048*2048];
Taulukkoonhan jotakin voisi tosiaan tallentaa. Riippunee siitä mitä int-muuttujiin tallennat.
Toinen keino on tehdä kuva johon maalataan maskivärillä aukkoja sitten kun ammuskellaan.
Int-vie muistia 16 bittiä eli 2 tavua, jolloin 2048*2048*2 = 8 Mt. Tämä tuskin on mikään ongelma.
Jos toteutan taulukkona, niin mites mapin piirto olisi hyvä tehdä?
Käytän siis opengl:ää.
Pikseli pikseliltä, vai jotenkin muuten?
x = ... y = ... // Jos karttatyyppejä on alle 255, char riittää unsigned char map = new char[x * y]; // Karttatyypit vaikka tähän static enum{ // ÄÄkköset voi sitten poistaa muuttujanimistä KARTTA_TYHJÄ, KARTTA_MAAPALA, KARTTA_RUSKEA_MAAPALA }; // Voi olla ettei koordinaatteja lasketa ihan näin, tarkista itse x(unsigned int i){ return i%y; } y(unsigned int i){ return (unsigned)i/x; } piirrä_pikseli(unsigned char laatu, unsigned int x, unsigned int y){ int väri; switch(laatu){ case KARTTA_MAAPALA: // Tämä on maapalan värikoodi väri = 1337; break; case KARTTA_RUSKEA_MAAPALA: // Tämä on ruskean koodi väri = 12345; break; default: väri = 0; break; } // Tämä on joku opengl-funktio piirrä_tietyn_värinen_juttu(väri, x, y); } funktio_josta_kutsut(){ for(unsigned int i = 0; i < sizeof(map); i++){ piirrä_pikseli(map[i], x(i), y(i)); } }
Tuon jo ymmärsin, ja olen sillä tasolla, että osaan kyllä piirtää pikseleitä, mutta pointtini oli, että onko tuota järkevämpiä tapoja?
Int on kyllä melkein kaikilla nykysysteemeillä 32-bittinen, jolloin se vie neljä tavua.
Taikaviitta kirjoitti:
Tuon jo ymmärsin, ja olen sillä tasolla, että osaan kyllä piirtää pikseleitä, mutta pointtini oli, että onko tuota järkevämpiä tapoja?
Minusta paras idea olisi monta pientä tekstuuria. Jos mm. kenttään tulevat reijät tapahtuvat vain pienellä alueella, ei ole mitään järkeä pitää yhtä isoa tekstuuria.
Toisaalta taas, kun kerran suurin osa kentästä pysyy muuttumattomana tiettynä hetkenä, on myös turhan raskasta piirtää koko ruutu pikseli kerrallaan ilman näyttistukea.
Ehkä 4x4-32x32 tekstuuria per alue joka ruudulla näkyy voisi olla ihan järkevä.
Jep tuo toimii, monta pientä tekstuuria kattamaan koko kenttä. Voit esim antaa joka ruudulle ns "flagin" joka muuttuu true:ksi aina kun tekstuuri siinä kohtaa muuttuu. Sitten render silmukan alussa päivittää niitä vaikka puolet tekstuureista joka toisella tai vielä useamman framen välein. Fysiikka tapahtuu kuitenkin niissä datatauluissa itsessään, pelaaja voi saada muutaman sadasosasekunnin viiveellä hyvin tapahtumista selvää.
Ja tietty ei liian pieniä tekstuureja saa olla, muuten glBindtexture-kutsujen määrä hidastaa piirtoa liikaa. Käytin itse kai 64x64 tai 128x128, kartat oli jotain 2000x1500 luokkaa (rgba tavuja, taustaa varten pitää olla alpha, ja sen avulla saa törmäykset tasaisemmaksi kun kulmat pyöristyy).
Mites jos haluan opengl:llä vaikka (64x64) tasaisen mustasta tekstuurista yhden pisteen alphakanavoitua?
Miten onnistuu?
Taikaviitta kirjoitti:
Mites jos haluan opengl:llä vaikka (64x64) tasaisen mustasta tekstuurista yhden pisteen alphakanavoitua?
Miten onnistuu?
Piirrä taustavärin värinen piste tekstuurin päälle.
Tasaisen musta tekstuuri (oletetaan että tyyppi on GL_UNSIGNED_BYTE ja GL_RGBA) sisältää pikseleitä:
rgba(0,0,0,255)
Täysin läpinäkyvä pikseli syntyy kun muutetaan vain tuo viimeinen arvo nollaksi. Jos se taas on jotain väliltä 1-254 niin se on osittain läpinäkyvä.
no siis kannattaa käyttää tuossa maskikuvaa (tekstuuria) johon reijät piirretään.
http://nehe.gamedev.net/data/lessons/lesson.asp?
tuossa on tuollainen hassu tutoriaali miten maskaus toimii
Pystyykö tuolla tekniikalla piirtämään mitään maaston taakse vai joutuuko turvautumaan multiteksturointiin?
Tuon etu on kenties nopeus kun ruutu päivitetään, mutta jos käyttää vain yhtä alpha-tekstuuria niin voi käyttää tuttuja efektejä kuten mutapommeja ja veren sekoittumista maastoon... mikä ei tietysti olisi mahdotonta maskinkaan kanssa, mutta joutuisi tekemisiin pikselikartan kanssa jokatapauksessa.
ite varmaan tekisin sen sdl:llä seuraavasti:
1. piirrä kartan kuvaan läpinäkyväksi määritellyllä värillä pommin tuhoama alue.
2. blittaa näytölle taustakuva(esim. pilvet yms.)
3. blittaa reitetty kartan kuva näytölle.
4. blittaa pelihahmot näytölle(esim. madot)
5. blittaa efektit näytölle
jne
toi varmaan onnistuu muullakin kirjastolla kuin sdl:llä mut tolleen sen tekisin, saa vapaasti olla erimieltä :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.