Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL: Erilliset objektit

erakko- [23.09.2008 10:14:24]

#

Olen miettinyt, että miten tehdään erillisiä objekteja jotka liikkuvat eri suuntiin ja häviävät sitten jos nille tapahtuu jotain. Otetaan esimerkiksi vaikka aseen ammukset.

Olen toteuttanut nykyään tälläiset objektit vain piirtämällä kuvan pinnalle. Tiedän miten olio luodaan classin avulla, mutta en ole sitä oikein käyttänyt missään mitä olen tehnyt. Luulisin että tässä pitää tehdä jotain sen kanssa.

Kiitos!

DumTom [27.09.2008 02:23:41]

#

Vaikka seuraavanlainen pätkä.
Ei tartte classia välttämättä.
Tietty jos käyttää classia ja metodeita niin bugiriski vähenee.

// struktuuri globaalille alueelle
struct Panos
{
float x,y;
float suunta; // 0-2*PII
unsigned char color; // yli 256 värin grafiikkatilassa tietty short tai int
char onko_olemassa;
};
Panos P[150];

void AlustaPanokset(void)
{
for (short t=0;t<150;t++) P[t].onko_olemassa=0;
}

void Controls(void)
{
static char liipasin_ylhaalla=0;
// ALKUUN MUU OHJAILU
if (firebutton==0) liipasin_ylhaalla=1;
if (firebutton==1 && liipasin_ylhaalla==1)
   {
   liipasin_ylhaalla=0;
   AddBullet(x,y,dir,color);
   }
}
void AddBullet(short x,short y,float dir,unsigned char color)
{
short b=-1;
for (short t=0;t<150;t++)
    {
    if (P[t].onko_olemassa==0) {b=t;break;}
    }
if (b>-1)
   {
   P[b].onko_olemassa=1;
   P[b].x=x;P[b].y=y;P[b].color=color;P[b].suunta=dir;
   }
}
void MoveBullets(void)
{
short nopeus=3;
for (short t=0;t<150;t++)
    {
    if (P[t].onko_olemassa==1)
       {
       float s=P[b].suunta;
       P[b].x+=cos(s)*nopeus;
       P[b].y+=sin(s)*nopeus;
       // TÖRMÄYSTARKISTUKSET
       // MUISTA! kun ammus osuu niin onko_olemassa flag taas nollaksi
       }
    }
}
void DrawBullets(void)
{
for (short t=0;t<150;t++)
    {
    if (P[t].onko_olemassa==1)
       {
       short px=(short)P[t].x;
       short py=(short)P[t].y;
       // TÄHÄN PIIRTO
       }
    }
}

erakko- [30.09.2008 12:18:18]

#

Sain tehtyä "hit the ball" tyylisessä pelissä erilliset objektit toimimaan. Koodi on vähän poimittuna tälläinen:

int gId = 1

Globaali muuttuja johon tallennetaan pallojen lukumäärä.

class Pallo
{
         public:
                int x;
                int y;
		int id;
                int hspeed;
                int vspeed;
                void DrawBall();
                void Move();
                void CheckCollision();
};

Classi pallolle, siellä muutama muuttuja ja funktio jotka piirtävät pallon, liikuttavat sitä ja tarkistavat törmäyksen.

for(int i = 0; i < gId; i++)
{
        pallo[i].DrawBall();
	pallo[i].Move();
	pallo[i].CheckCollision();
}

Aluksi on luotu Pallo tyyppinen taulukko, jolle luodaan 0-indeksiin ensimmäinen pallo, ja tuo CheckCollision tarkistaa jos palloa on painettu. Se luo sitten uuden pallon taulukkoon, ja indeksi on gId+1. Tämä for taas käy läpi koko taulukon (gId:n huomioiden) ja piirtää ja hoitaa kaiken tarvittavan.

Homma toimii mutta top-down shooterissa ei saata toimia kunnolla.

Koitan kyllä tuota DumTomin tapaa, vaikuttaa ihan järkevältä.

os [30.09.2008 22:40:57]

#

Mitäpä, jos palaisit hieman tutkimaan ohjelmoinnin perusteita, avainsanana "tietorakenteet". Ongelmasi ei liity "classeihin", SDL:llään tai kehittämääsi pelityyppiin. Myöskään DumTomin koodissa ei ole paljoa sellaista, josta kannattaisi tässä yhteydessä ottaa mallia (ei millään pahalla).

Omassa koodissasi olet aivan oikeilla jäljillä. Peliobjektia kannattaa kuvata C++:ssa oliolla, jotka tallennetaan jonkinlaiseen listaan. Joka framella objekteja liikutetaan ja ne piirretään. Vakiokokoisten taulukoiden sijaan kannattaa opetella käyttämään järkevämpiä tietorakenteita, kuten listoja ja vektoreita. Huomioi myös, että peliobjektia kuvaavaan olioon kannattaa tallentaa ainoastaan ne ominaisuudet, jotka kuvaavat objektien "vapausasteita", (esim. paikka, nopeus, jäljellä oleva polttoaine yms.) eikä esimerkiksi objektin kuvadataa, joka on yleensä useammalle objektille yhteistä.

erakko- [30.09.2008 23:26:05]

#

Juu, olen lukemassa "C++ ja olio-ohjelmointi" kirjaa, ja olen juuri näissä listoissa ja vektoreissa (+ muita STL juttuja). Katsotaanpa sitten uudelleen kun olen tuon taas lukaissut...

DumTom [01.10.2008 00:25:17]

#

Listat vaan sattuu olemaan hitaampia kuin vakiokokoiset taulukot...
Mutta jos on myllyssä tehoja niin eikun vaan.
Koodaustapoja on lukemattomia.No tää nyt oli vaan tällänen yöllinen heitto.:)

koo [01.10.2008 22:35:44]

#

DumTom kirjoitti:

Listat vaan sattuu olemaan hitaampia kuin vakiokokoiset taulukot...

Mistä näin yleispätevä totuus löytyy? Lista on kumminkin aika näppärä, kun pitää lisätä alkioita rakenteen alkuun tai loppuun, tai poistaa alkioita alusta, lopusta tai keskeltä. Vakiokokoiset taulukot taas ovat - öh - vakiokokoisia, eivätkä hirveästi elä tilanteen mukaan. Taulukoilla hyvä ominaisuus on periaatteessa sama hakuaika mille tahansa alkiolle.

DumTom kirjoitti:

Mutta jos on myllyssä tehoja niin eikun vaan.

Jos tällä tehokysymyksellä on tosiaan väliä, kannattaisi kyllä tehdä mittauksia eikä mutu-arvauksia. Varsinkin, kun esimerkiksi standardikirjaston vehkeitä käyttämällä voi kokeilla sekä listaa että taulukkoa tai vaikka vakiokokoista taulukkoa ihan paria koodiriviä muuttamalla.

DumTom kirjoitti:

Koodaustapoja on lukemattomia.No tää nyt oli vaan tällänen yöllinen heitto.:)

Jaha.

Vastaus

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

Tietoa sivustosta