Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Worms-tyylinen mappi

Sivun loppuun

Taikaviitta [29.08.2008 19:12:03]

#

Tähän tarkoitukseen paras/yleisin tapa?
Kielenä siis c++.

Luonko jättimäisen taulukon?
esim.

int map = new int[2048*2048];

ville-v [29.08.2008 19:24:51]

#

Taulukkoonhan jotakin voisi tosiaan tallentaa. Riippunee siitä mitä int-muuttujiin tallennat.

temu92 [29.08.2008 20:25:19]

#

Toinen keino on tehdä kuva johon maalataan maskivärillä aukkoja sitten kun ammuskellaan.

petrinm [29.08.2008 20:31:02]

#

Int-vie muistia 16 bittiä eli 2 tavua, jolloin 2048*2048*2 = 8 Mt. Tämä tuskin on mikään ongelma.

Taikaviitta [29.08.2008 20:31:57]

#

Jos toteutan taulukkona, niin mites mapin piirto olisi hyvä tehdä?

Käytän siis opengl:ää.

Pikseli pikseliltä, vai jotenkin muuten?

ville-v [29.08.2008 20:44:46]

#

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));
}
}

Taikaviitta [29.08.2008 21:01:00]

#

Tuon jo ymmärsin, ja olen sillä tasolla, että osaan kyllä piirtää pikseleitä, mutta pointtini oli, että onko tuota järkevämpiä tapoja?

Laitinen [29.08.2008 23:30:10]

#

Int on kyllä melkein kaikilla nykysysteemeillä 32-bittinen, jolloin se vie neljä tavua.

Tzaeru [29.08.2008 23:39:15]

#

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

User137 [30.08.2008 01:04:56]

#

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

Taikaviitta [30.08.2008 09:57:35]

#

Mites jos haluan opengl:llä vaikka (64x64) tasaisen mustasta tekstuurista yhden pisteen alphakanavoitua?

Miten onnistuu?

ville-v [30.08.2008 10:47:29]

#

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.

User137 [30.08.2008 19:26:01]

#

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

pulis [19.09.2008 20:15:33]

#

no siis kannattaa käyttää tuossa maskikuvaa (tekstuuria) johon reijät piirretään.
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=20
tuossa on tuollainen hassu tutoriaali miten maskaus toimii

User137 [20.09.2008 09:12:39]

#

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.

ByteMan [20.09.2008 12:01:58]

#

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ä :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta