Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Outo pelin kaatuminen

Sivun loppuun

DumTom [18.07.2012 15:58:38]

#

Viime vuonna aloittamani arkanoid klooni alkaa olla valmis mutta oireilee pahasti välillä.
Peli ja sisäänrakennettu editori ja muut valikot toimivat moitteetta mutta kun hiirellä sitten klikkaa quittia niin koko kone kaatuu ja ctrl+alt+delete on ainut vaihtoehto ja sielläkään ei hiiri toimi vaan ohjelma on pysäytettävä napeilla.

Tarkistin että surfacet ja äänet vapautetaan,poistin yhden muistinhallintajutun väliaikaisesti.

Pelissä luokat ja oliot ovat globaaleja.

En yksinkertaisesti tajua missä vika voisi olla?

Ja debuggia en osaa käyttää.

Löytyisikö vinkkejä?

Sisuaski [18.07.2012 16:37:34]

#

Vaikuttaisi todennäköiseltä että jonkun olion destruktorin kutsuminen saa aikaan kaatumisen. Kokeile kommentoida vaikka kaikki destruktorit pois ohjelmasta ja katso kaatuuko vieläkin. Jos ei niin kokeile lisätä ne yksi kerrallaan takaisin kunnes virhe löytyy.

Kutsutko SDL_Quittia ohjelman lopussa? Jos kutsut niin muista että se vapauttaa kaikki SDL_Surfacet automaattisesti, eli niiden käsin vapauttaminen sen jälkeen voi rikkoa asioita.

Metabolix [18.07.2012 16:39:15]

#

Sisuaski kirjoitti:

Kutsutko SDL_Quittia ohjelman lopussa? Jos kutsut niin muista että se vapauttaa kaikki SDL_Surfacet automaattisesti – –

Tämä ei edelleenkään pidä paikkaansa. SDL ei pidä kirjaa pinnoista. Kuka tahansa voi tarkistaa asian SDL:n lähdekoodista tai kokeilemalla. Ainoastaan näyttöpinta vapautetaan automaattisesti.

Toki pintojen vapauttaminen ennen SDL_Quit-kutsua olisi silti vähintäänkin loogista. Lisäksi kannattaa hankkiutua mahdollisuuksien mukaan eroon osoittimista (esim. SDL_Surfacelle voi tehdä yksinkertaisen apuluokan) ja pyrkiä välttämään myös globaaleja objekteja.

DumTom [18.07.2012 18:40:38]

#

Jos siis esittelen luokat mainissa ja luon oliot myös mainissa niin ilmeisesti sitten viittaamalla lähetettävä kaikki peliin ja pelissä edelleen muihin funktioihin?

Metabolix [18.07.2012 18:51:51]

#

Älä koskaan esittele luokkia funktioiden sisällä, ellei ole erittäin hyvää syytä. Siirrä vain olioiden määrittelyt ja luominen. Ja kyllä, sitten täytyy välittää tietoja parametreina, yleensä mieluiten viittauksina.

Kai olet laittanut kääntäjän asetuksista päälle standarditilan (GCC:llä esim. -std=c++98) ja tiukat varoitukset (-Wall -pedantic) sekä optimoinnin (esim. -O2) ja korjannut kaikki näin näkyville tulevat varoitukset?

Lisäys:

Globaalien objektien välttäminen ei ole tässä pelkästään periaatekysymys, vaan globaaleilla objekteilla voi myös olla omituisia riippuvuussuhteita, jotka lopuksi kaatavat ohjelman.

Muista, että kaikki tässä esitetyt asiat ovat arvauksia ja ideoita eivätkä välttämättä ratkaise ongelmaa. Sen sijaan debuggerilla asia olisi selvä luultavasti parissa minuutissa.

DumTom [18.07.2012 21:01:51]

#

kiitos metabolix,tuossa onkin työnsarkaa....

DumTom [20.07.2012 06:17:06]

#

Metabolix,entä jos lähetän koko ohjelman datoineen wettransfer.comilla sulle debuggatavaksi?
Eli tarviisiin sun mailiosotteen?????

Metabolix [20.07.2012 16:18:37]

#

Jos koodi kääntyy ilman varoituksia Linuxissa GCC:llä asetuksilla -std=c++98 -Wall -pedantic -O2 eikä sisällä yhtään globaalia oliota, voin ehkä vilkaista sitä. (Mailiosoitteen itsenäinen etsiminen kuuluu myös minimivaatimuksiin.) Jos taas et viitsi itse tehdä edes perusteiltaan kunnollista koodia, ihan periaatteesta en myöskään viitsi auttaa sen muiden vikojen etsimisessä. Muuten mennään tasolle "kippasin ruuveja ja muttereita peltitynnyriin, auttakaa tekemään näistä auto".

Jaska [20.07.2012 16:21:52]

#

Katso debuggerin ohjeet. Erään arvion mukaan isoissa projekteissa toisen koodin debuggaaminen vaatii noin puolen vuoden opettelun ennen kuin koodiin pystyy tekemään muutoksia. Varmaankaan debuggerin käytön opettelu ei vie puolta vuotta, joten saat kenties ongelman ratkottua nopeiten omin voimin.

Metabolix [20.07.2012 16:43:12]

#

Jaska, DumTomin projekti on tuskin lähelläkään Firefoxin kokoluokkaa. Luultavasti koodiin tutustuisi kohtuullisen hyvin tunnissa tai parissa (tosin koodi voi olla harvinaisen sotkuista, mikä vaikeuttaa perehtymistä), ja tällaisen kaatumisen selvittely ei varmaankaan edes vaatisi mitään oikeaa perehtymistä koodiin. Veikkaan, että ongelma selviäisi helposti alle 15 minuutissa.

DumTom [21.07.2012 05:49:33]

#

Okei. Päätin uhrata seuraavat kaksi kuukautta siihen että esittelen luokat globaalisti ja luon oliot mainissa ja yksi kerrallaan väännän koodin siten että data menee viitaten funktiosta toiseen. Aion saada tään toimimaan. Peli on todella hieno ja äänet maukkaat. Graafikko ja äänimies panosti paljon. Peli ei aivan valmis ole. Vielä puuttuu kaikenlaista härpäkettä ja n.30 lisäominaisuudesta 2-3 on koodaamatta. En viitsi niitä nyt tehdä kun ei tiedä milloin peli kaatuu ja milloin ei. Opettelen koodaamaan. Vaikka mua joskus ottaa päähän metabolixin tylyt sanat niin tässä asiassa olen kyllä saanut oikeaa oppia ja potkun perseelle että ei muita voi laittaa tekemään omia hommia. En ole koskaan viitannut mitään.
Eli jos olis esim funktio jossa viitataan niin esitelläänkö se tyyliin näin:

void MoveBalls(&BallData bd,&BrickData br);

Ainoa asia jota en nyt oivalla on tuo SDL_Surfacelle tehtävä tietorakenne?
Kuinka teen sen helpon apuluokan jotta pääsen osoittimista eroon?
Onko sama tehtävä äänille?

Se on kovaa hommaa taistella windows maailmaan kun roikuin dossin orjuudessa niin kauan. BlitzBasicilla tein 8 kk yhtä peliä ja siitä tuli hieno ja kaatumaton(käyttää direct X:ää). Kauhea kieli mutta opin kuinka windows piirtää ja kuinka windows soi.

Olen harkinnut seuraavaan pöytäkoneeseen linuxia sillä mulle rupee riittämään nää microsoftin typeryydet(uusin mesen versio on täysin buginen,windows 8 ei kuulemma tue kuin IE:tä ja niin edelleen). En ihan kokematon linuxissa ole mutta yleissivistykseen kuuluvat unix käskyt on mulle vielä hepreaa. Ja venäjällä rakennetaan linux pohjaisia ohjelmia valtiolle. Kun osaisi venäjää ja linuxia niin vain taivas olisi rajana jonkun tukihenkilön hommissa rajan takana.

Eksyin aiheesta mutta Metabolix,kunnioitan tietomäärääsi ja kärsivällisyyttäsi. Olenhan kysynyt mitä omituisempia juttuja ja esitellyt koodeja joita ei tajua kukaan....:)

Metabolix [21.07.2012 10:49:07]

#

Kaiken siirtäminen mainiin ei yleensä ole yhtään sen järkevämpi ratkaisu kuin globaalien käyttö. Olioiden pitää olla siellä, missä niitä tarvitaan. Esimerkiksi valikkoon liittyvien olioiden pitää olla Valikko-luokassa ja peliin liittyvien Peli-luokassa. Uuden pelin alkaessa pitää siis luoda uusi Peli-olio, joka itse sisältää kaiken peliin liittyvän tiedon eikä tarvitse mystisiä viittauksia ulkopuolisiin, erikseen alustettaviin palloihin ja tiiliin.

Pintojen (ja äänien) käsittelyä voi helpottaa monella tavalla. Yksi tapa on tallentaa ne keskitetysti vaikkapa std::map-tietorakenteeseen, josta ne on helppo hakea tarvittaessa ja lopuksi tuhota silmukassa.

DumTom [26.07.2012 17:27:53]

#

class AreaFigure
{
private:
short Tiles[11][15],Hits[11][15],Flash[11][15],Grenade[11][15];
short Hitted[11][15];
public:
void ClearArea(void);
void ResetGrenade(void);
void SetTile(short x,short y,short type,short osumat) {if (x>-1 && x<11 && y>-1 && y<15) {Tiles[x][y]=type;Hits[x][y]=osumat;}}
short GetTile(short x,short y) {if (x>-1 && x<11 && y>-1 && y<15) {return Tiles[x][y];}else return 0;}
void SetOsumat(short x,short y,short osumat) {Hits[x][y]=osumat;}
short GetOsumat(short x,short y) {return Hits[x][y];}
void DecOsumat(short x,short y) {Hits[x][y]--;}
void SetFlash(short x,short y,short f) {Flash[x][y]=f;}
short GetFlash(short x,short y) {return Flash[x][y];}
void SetGrenade(short x,short y,short f) {if (x>-1 && x<11 && y>-1 && y<15) Grenade[x][y]=f;}
short GetGrenade(short x,short y) {return Grenade[x][y];}

void DecFlash(short x,short y) {Flash[x][y]--;}
void ResetHits(void);
void SetHits(short x,short y,short osumat) {Hitted[x][y]=osumat;}
short GetHits(short x,short y) {return Hitted[x][y];}

};
void AreaFigure::ClearArea(void)
    {
    for (short y=0;y<15;y++)
        {
        for (short x=0;x<11;x++)
            {
            Tiles[x][y]=0;Hits[x][y]=0;Flash[x][y]=0;Hitted[x][y]=0;Grenade[x][y]=0;
            }
        }
    BasicSettings();
    }
void AreaFigure::ResetHits(void)
    {
    for (short y=0;y<15;y++)
        {
        for (short x=0;x<11;x++)
            {
            Hitted[x][y]=0;
            }
        }
    }
void AreaFigure::ResetGrenade(void)
{
  for (short y=0;y<15;y++)
        {
        for (short x=0;x<11;x++)
            {
            Grenade[x][y]=0;
            }
        }

}

AreaFigure *A=new AreaFigure;


class Player
{
private:
long SCORE,HIGHSCORE,NEXTEXTRALIFE;
long LOWESTSCORE;
short LEVEL,LIVES,LEFTRIGHT,OVET,LREHDOTUS,EXTRAMESSAGE;
unsigned char GAMEOVER;
short DEATH;
bool LETTER[6];
public:
long GetLowestScore(void) {return LOWESTSCORE;}

long GetScore(void) {return SCORE;}
long GetHighScore(void) {return HIGHSCORE;}
void ResetScore(void) {SCORE=0;}
void SetHighScore(long a) {HIGHSCORE=a;}
void SetLowestScore(long a) {LOWESTSCORE=a;}
void AddSCORE(long a) {SCORE+=a;}
void SetLives(short a) {LIVES=a;}
short GetLives(void) {return LIVES;}
void SetLeftRight(short a) {LEFTRIGHT=a;}
short GetLeftRight(void) {return LEFTRIGHT;}
void SetLeftRightEhdotus(short a) {LREHDOTUS=a;}
short GetLeftRightEhdotus(void) {return LREHDOTUS;}

void IncLives(void) {LIVES++;}
void DecLives(void) {if (LIVES>0) LIVES--;}
void SetGAMEOVER(unsigned char a) {GAMEOVER=a;}
unsigned char GetGAMEOVER(void) {return GAMEOVER;}
void SetDEATH(short a) {DEATH=a;}
short GetDEATH(void) {return DEATH;}
void IncDEATH(void) {DEATH++;}

void SetLEVEL(short a) {LEVEL=a;}
short GetLEVEL(void) {return LEVEL;}
void IncLevel(void) {LEVEL++;}
void DecLevel(void) {LEVEL--;}

void SetOVET(short a) {OVET=a;}
short GetOVET(void) {return OVET;}
void SetNEXTEXTRALIFE(long a) {NEXTEXTRALIFE=a;}
long GetNEXTEXTRALIFE(void) {return NEXTEXTRALIFE;}
void SetEXTRAMESSAGE(short a) {EXTRAMESSAGE=a;};
short GetEXTRAMESSAGE(void) {return EXTRAMESSAGE;}
void DecEXTRAMESSAGE(void) {if (EXTRAMESSAGE>0) EXTRAMESSAGE--;}
void ResetLetters(void) {for (short a=0;a<6;a++) LETTER[a]=false;}
void SetLetter(short a) {LETTER[a]=1;CheckEXTEND();}
bool GetLetter(short a) {return LETTER[a];}
};
Player *PL=new Player;



class GlobalData
{
private:
char Next,stard;
bool GRID;
short PalkkiFlashLeft;
short PalkkiFlashRight;
short PalkkiFlashUp,WallFlash;
short ALLPALIKAT,PALIKOITA,BALLS,RULLAT,EPALIKOITA,ZAPPALIKOITA,WALLSeconds,COUNTDOWN,COUNTREADY,PAUSED,BananaPALIKOITA,NEWBANANAPALIKKA;
short LEVELS;
float KIIHTYVYYS,KIIHTYY;
short WALL,Zap,STARSTOPPED,SHOWSLOW,SILVERHITS;
float SPEED,MAXSPEED,MINSPEED,STARTSPEED;
short START,PERCENT,SAMETIME,REUNA,BACKGROUND;
bool REGISTERED;
char REGISTERNAME[31];
//short vuoto;
public:
short GetFL(void) {return PalkkiFlashLeft;}
short GetFR(void) {return PalkkiFlashRight;}
short GetFU(void) {return PalkkiFlashUp;}
short GetFW(void) {return WallFlash;}
void DecFL(void) {if (PalkkiFlashLeft>0) PalkkiFlashLeft--;}
void DecFR(void) {if (PalkkiFlashRight>0) PalkkiFlashRight--;}
void DecFU(void) {if (PalkkiFlashUp>0) PalkkiFlashUp--;}
void DecFW(void) {if (WallFlash>0) WallFlash--;}
void SetFL(short a) {PalkkiFlashLeft=a;}
void SetFR(short a) {PalkkiFlashRight=a;}
void SetFU(short a) {PalkkiFlashUp=a;}
void SetFW(short a) {WallFlash=a;}
void SetBananaPALIKOITA(short a) {BananaPALIKOITA=a;}
short GetBananaPALIKOITA(void) {return BananaPALIKOITA;}
void SetNEWBananaPALIKKA(short a) {NEWBANANAPALIKKA=a;}
void IncNEWBananaPALIKKA(void){NEWBANANAPALIKKA++;}
void IncBananaPALIKOITA(void) {BananaPALIKOITA++;}
short GetNEWBananaPALIKKA(void) {return NEWBANANAPALIKKA;}
void SetPALIKOITA(short a) {PALIKOITA=a;}
short GetPALIKOITA(void) {return PALIKOITA;}
void DecPALIKOITA(void) {if (PALIKOITA>0) PALIKOITA--;}
void IncPALIKOITA(void) {PALIKOITA++;}
void IncAllPalikat(void) {ALLPALIKAT++;}
void DecAllPalikat(void) {if (ALLPALIKAT>0) ALLPALIKAT--;}

void SetEPALIKOITA(short a) {EPALIKOITA=a;}
short GetEPALIKOITA(void) {return EPALIKOITA;}
void SetAllPalikat(short a) {ALLPALIKAT=a;}
short GetAllPalikat(void) {return ALLPALIKAT;}
void DecEPALIKOITA(void) {if (EPALIKOITA>0) EPALIKOITA--;}
void IncEPALIKOITA(void) {EPALIKOITA++;}
void SetZapPALIKOITA(short a) {ZAPPALIKOITA=a;}
short GetZapPALIKOITA(void) {return ZAPPALIKOITA;}
void SetBALLS(short a) {BALLS=a;}
short GetBALLS(void) {return BALLS;}
void DecBALLS(void) {if (BALLS>0) BALLS--;}
void IncBALLS(void) {if (BALLS<50) BALLS++;}
void SetRULLAT(short a) {RULLAT=a;}
short GetRULLAT(void) {return RULLAT;}
void IncRULLAT(void) {if (RULLAT<10) RULLAT++;}
void DecRULLAT(void) {if (RULLAT>-1) RULLAT--;}
void Accelerate(void) {SPEED+=1.5;if (SPEED>MAXSPEED) {SPEED=MAXSPEED;if (COUNTDOWN==0) COUNTDOWN=1;}KIIHTYVYYS=0.0;}
//if (SPEED>MAXSPEED) SPEED=MAXSPEED;KIIHTYVYYS=0;}
void Slow(void) {SPEED-=1.0;if (SPEED<MINSPEED) SPEED=MINSPEED;KIIHTYVYYS=0;}
float GetSPEED(void) {return SPEED;}
void SetSPEED(float a) {SPEED=a;}
float GetMAXSPEED(void) {return MAXSPEED;}
void SetMAXSPEED(float a) {MAXSPEED=a;}
float GetMINSPEED(void) {return MINSPEED;}
void SetMINSPEED(float a) {MINSPEED=a;}
float GetSTARTSPEED(void) {return STARTSPEED;}
void SetSTARTSPEED(float a) {STARTSPEED=a;}
void SetSILVERHITS(short a) {SILVERHITS=a;}
short GetSILVERHITS(void) {return SILVERHITS;}
void SetPERCENT(short a) {PERCENT=a;}
short GetPERCENT(void) {return PERCENT;}
void SetSAMETIME(short a) {SAMETIME=a;}
short GetSAMETIME(void) {return SAMETIME;}
void SetBACKGROUND(short a) {BACKGROUND=a;}
short GetBACKGROUND(void) {return BACKGROUND;}
void SetREUNA(short a) {REUNA=a;}
short GetREUNA(void) {return REUNA;}

void IncAcc(float a) {KIIHTYVYYS+=a;if (KIIHTYVYYS>KIIHTYY) {SPEED+=0.5;if (SPEED>MAXSPEED) {SPEED=MAXSPEED;if (COUNTDOWN==0) COUNTDOWN=1;}KIIHTYVYYS=0.0;}}

void SetAcc(float a) {KIIHTYVYYS=a;}
float GetAcc(void) {return KIIHTYVYYS;}
void SetKIIHTYY(float a) {KIIHTYY=a;}
float GetKIIHTYY(void) {return KIIHTYY;}

void SetWALL(short a) {WALL=a;}
short GetWALL(void) {return WALL;}
void SetWALLSeconds(short a) {WALLSeconds=a;}
short GetWALLSeconds(void) {return WALLSeconds;}
void DecWALLSeconds(short a) {if (WALLSeconds>0) {WALLSeconds-=a;if (WALLSeconds<1) WALL=0;}}
void IncWALL(void) {WALL++; }
void SetZap(short a) {Zap=a;}
short GetZap(void) {return Zap;}
void SetPAUSED(short a) {PAUSED=a;}
short GetPAUSED(void) {return PAUSED;}

void SetNext(char a) {Next=a;}
char GetNext(void) {return Next;}
void SetStarDrop(char a) {stard=a;}
char GetStarDrop(void) {return stard;}
void IncZapPALIKOITA(void) {ZAPPALIKOITA++;}
void SetSTARMOVE(short a) {STARSTOPPED=a;}
short GetSTARMOVE(void) {return STARSTOPPED;}
void SetCOUNTDOWN(short a) {COUNTDOWN=a;}
void IncCOUNTDOWN(void) {if (COUNTDOWN>0) {COUNTDOWN++;if (COUNTDOWN==COUNTREADY) {SHOWSLOW=150;COUNTDOWN=0;SPEED-=3.0;if (SPEED<MINSPEED) SPEED=MINSPEED;KIIHTYVYYS=0;}}}
void SetCOUNTREADY(short a) {COUNTREADY=a;}
void SetSHOWSLOW(short a) {SHOWSLOW=a;}
short GetSHOWSLOW(void) {return SHOWSLOW;}
void DecSHOWSLOW(void) {if (PAUSED==0) SHOWSLOW--;}
void SetStartFlash(short a) {START=a;}
short GetStartFlash(void) {return START;}
void IncStartFlash(void) {if (START>0 && PAUSED==0) {START++;if (START>250) START=0;}}
void SetLevels(short a) {LEVELS=a;}
short GetLevels(void) {return LEVELS;}
void SetRegistered(bool a) {REGISTERED=a;}
bool GetRegistered(void) {return REGISTERED;}
void SetRegisterersName(const char *nimi) {strcpy(REGISTERNAME,nimi);}
const char* GetRegisterersName(void) {return REGISTERNAME;};
bool GetGRID(void) {return GRID;}
void SetGRID(bool a) {GRID=a;}
short RM[40];
};
GlobalData *G=new GlobalData;






class Ball
{
private:
float x,y;
short suunta,locked,fxero,xero,stopped,locktype,triotime,trio_on;
float ex,ey; // ennen törmäystä
float spd;
char on,SNDIV,Hitted;
char size;
bool friendmagnet;
public:
float GetX(void) {return x;}
float GetY(void) {return y;}
void SetX(float a) {x=a;}
void SetY(float a) {y=a;}
void DecX(short a) {x-=a;}
void IncX(short a) {x+=a;}
float GetEX(void) {return ex;}
float GetEY(void) {return ey;}
void SetEX(float a) {ex=a;}
void SetEY(float a) {ey=a;}
short GetSuunta(void) {return suunta;}
void SetSuunta(short a) {suunta=a;}
void SetNoDivide(char a) {SNDIV=a;}
char GetNoDivide(void) {return SNDIV;}
short GetLocked(void) {return locked;}
void SetLocked(short a) {locked=a;}
void DecLocked(void) {if (locked>0) locked--;if (locked==0) locktype=0;}
char GetOn(void) {return on;}
void SetOn(char a) {on=a;}
short GetXero(void) {return xero;}
void SetXero(short a) {xero=a;}



void SetStop(short a) {stopped=a;}
short GetStop(void) {return stopped;}
void SetHitted(char a) {Hitted=a;}
char GetHitted(void) {return Hitted;}

void SetLockType(short a) {locktype=a;}
short GetLockType(void) {return locktype;}

void SetTrioTime(short a) {triotime=a;}
short GetTrioTime(void) {return triotime;}

void SetTrio(short a) {trio_on=a;}
short GetTrio(void) {return trio_on;}
void IncTrioTime(void) {triotime+=1;}


short GetFXero(void) {return fxero;}
bool GetFRIENDKYYTI(void) {return friendmagnet;}
void SetFRIENDKYYTI(bool a) {friendmagnet=a;}
void SetFXero(short a) {fxero=a;}
char GetSize(void) {return size;}
void SetSize(char a) {size=a;} // 0=little 1=normal 2=big

};
//Ball B[50];
Ball *B=new Ball[50];

class Rulla
{
private:
char on,stop;
short x;
float y;
short spd;
unsigned char type;
public:
short GetX(void) {return x;}
float GetY(void) {return y;}
void SetX(short a) {x=a;}
short GetType(void) {return type;}
void SetType(short a) {type=a;}
void SetY(short a) {y=a;}
char GetOn(void) {return on;}
void SetOn(char a) {on=a;}

char GetStop(void) {return stop;}
void SetStop(char a) {stop=a;}

void IncY(void) {y+=spd;}
void SetSpd(float a) {spd=a;}
short GetSpd(void) {return spd;}
};
Rulla *R=new Rulla[10];

class Beam
{
private:
float x,y;
char on,stop;
public:
short GetOn(void) {return on;}
void SetOn(short a) {on=a;}
float GetX(void) {return x;}
float GetY(void) {return y;}
void SetX(float a) {x=a;}
void SetY(float a) {y=a;}
void Move(void) {y-=8;}
void SetStop(char a) {stop=a;}
char GetStop(void) {return stop;}
};
Beam *L=new Beam[300];

class Missile
{
private:
float x,y,kii;
char on,stop;
public:
short GetStop(void) {return stop;}
void SetStop(short a) {stop=a;}
short GetOn(void) {return on;}
void SetOn(short a) {on=a;}

short GetX(void) {return x;}
float GetY(void) {return y;}
void SetX(float a) {x=a;}
void SetY(float a) {y=a;}
void Move(void) {if (stop==0) {y-=kii;kii+=0.2;if (kii>5.5) kii=5.5;}}
float GetKii(void) {return kii;}
void SetKii(float a) {kii=a;}

};
Missile *MIS=new Missile[10];

class Murtuma_animaatio
{
private:
short x,y;
char on,animdir,type;
short count;
public:
void SetAnimDir(char a) {animdir=a;}
char GetAnimDir(void) {return animdir;}
char GetOn(void) {return on;}
void SetOn(char a) {on=a;}
short GetCount(void) {return count;}
void SetCount(short a) {count=a;}
short GetX(void) {return x;}
short GetY(void) {return y;}
void SetX(short a) {x=a;}
void SetY(short a) {y=a;}
void IncCount(void) {count++;if (count==8) {count=0;on=0;}}
void DecCount(void) {count--;if (count==-1) {count=0;on=0;}}
char GetType(void) {return type;}
void SetType(char a) {type=a;}

};
Murtuma_animaatio *MA=new Murtuma_animaatio[166];

class StarDrop
{
private:
short x,y,kuva,gx,gy;
char on,animdir,step;
public:
void SetAnimDir(char a) {animdir=a;}
char GetAnimDir(void) {return animdir;}
char GetOn(void) {return on;}
void SetOn(char a) {on=a;step=0;}
short GetX(void) {return x;}
short GetY(void) {return y;}
void SetX(short a) {x=a;}
void SetY(short a) {y=a;}
void SetKuva(short a) {kuva=a;}
short GetKuva(void) {return kuva;}
short GetGY(void) {return gy;}
void SetGY(short a) {gy=a;}
short GetGX(void) {return gx;}
void SetGX(short a) {gx=a;}
void IncGY(void) {if (on==1) gy+=5;}
void Animoi(void);

};
void StarDrop::Animoi(void)
{

step++;
if (step>2)
   {
   step=0;
   switch(animdir)
         {
         case 0:
         kuva--;
         if (kuva<0) kuva=35;
         break;
         case 1:
         kuva++;
         if (kuva>35) kuva=0;
         break;
         }
   }
}
StarDrop *SD=new StarDrop[18];

class Maila
{
private:
short x,y,leveys,hitted,Liima,hittype,fx,fy,fdir;
short fhitted;
char Magnet,Heavy,Fire,Laser,Aim,Missile,notnow,Triple,Grenade,Twin,Vittuilu,Kaveri;
bool LittleBall;
short Multi;
public:
short GetX(void) {return x;}
short GetY(void) {return y;}
void SetX(short a) {x=a;}
short GetFX(void) {return fx;}
short GetFY(void) {return fy;}
void SetFX(short a) {fx=a;}

short GetLeveys(void) {return leveys;}
void SetLeveys(short a) {leveys=a;}

void SetY(short a) {y=a;}
void SetFY(short a) {fy=a;}
short GetHit(void) {return hitted;}
short GetFriendHit(void) {return fhitted;}
short GetHitType(void) {return hittype;}
void SetHit(short a,short b) {hitted=a;hittype=b;}
void SetFriendHit(short a,short b) {fhitted=a;}
void DecHit(void) {hitted--;}
void DecFriendHit(void) {fhitted--;}
void IncMissile(void) {Missile++;}
void DecMissile(void) {if (Missile>0) Missile--;}
short GetMissile(void) {return Missile;}
void SetMissile(short a) {Missile=a;}


char GetMagnet(void) {return Magnet;}
void SetMagnet(char a) {Magnet=a;}
char GetHeavy(void) {return Heavy;}
void SetHeavy(char a) {Heavy=a;}
void SetFire(char a) {Fire=a;}
char GetFire(void)  {return Fire;}
void SetTwin(char a) {Twin=a;}
char GetTwin(void)  {return Twin;}

void SetMulti(short a) {Multi=a;}
short GetMulti(void) {return Multi;}
void SetLaser(char a) {Laser=a;}
char GetLaser(void) {return Laser;}
char GetAim(void) {return Aim;}
void SetAim(char a) {Aim=a;}
char GetNotnow(void) {return notnow;}
void SetNotnow(char a) {notnow=a;}
void SetTriple(char a) {Triple=a;}
char GetTriple(void) {return Triple;}
void SetGrenade(short a) {Grenade=a;}
short GetGrenade(void) {return Grenade;}
void SetLiima(short a) {Liima=a;}
short GetLiima(void) {return Liima;}
void DecLiima(void) {if (Liima>0) Liima--;}
short GetFriend(void) {return Kaveri;}
void SetFriend(short a) {Kaveri=a;}
short GetFriendDir(void) {return fdir;}
void SetFriendDir(short a) {fdir=a;}

void IncX(short a);
void IncY(short a);
void IncFX(short a);
void SetLittleBall(bool a) {LittleBall=a;}
bool GetLittleBall(void) {return LittleBall;}

};
void Maila::IncX(short a)
{
x+=a;
if (x<224) x=224;
if ((Twin==0 || Twin==2) && x>768-leveys) x=768-leveys;
if (Twin==1 && x>768-(64+32+64)) x=768-(64+32+64);
}
void Maila::IncFX(short a)
{
fx+=a;
if (fx<224) {fx=224;fdir=1;}
if (Twin==0 && fx>768-leveys) {fx=768-leveys;fdir=0;}
if (Twin==1 && fx>768-(64+32+64)) {fx=768-(64+32+64);fdir=0;}
}

void Maila::IncY(short a)
{
y+=a;
if (y>611) y=611;
}
Maila *M=new Maila;

Tietorakenteet on tuossa. Pahalta näyttää. Taidan koodata koko pelin uudestaan?

User137 [26.07.2012 17:46:00]

#

void IncLives(void) {LIVES++;}
void DecLives(void) {if (LIVES>0) LIVES--;}

En tiedä olenko ainut, mutta tuollaset "setterit" menee vähän yli. Yksinkertaistaa ohjelmaa jos käyttää julkisia muuttujia luokassa. Eri asia jos sulla on enemmän operaatioita niissä funktioissa, esim jotain lukualueen tarkistuksia, tai muuta virheenkäsittelyä.

Krist [08.08.2012 22:33:42]

#

hirveesti ei oo mitään muistinvarauksia yms noissa tietorakenteissa, sen lisäksi mitä tässä jo on todettu et globaaleja muuttujia ei pitäis käyttää (no kyllä niitä voi käyttää, mut tässä tapauksessa oli kyllä enemmän haittaa kuin hyötyä).

Luulen että ongelmasi on jossain siellä grafiikka kirjaston kutsuissa tai muissa resurssin varauksissa / vapautuksissa.

Mitä käytät? SDL? OpenGL? DirectX?

varsinkin koodi joka käsittelee pelin päättymistä (minkä yhteydessä kaatuminen tapahtuu) olisi varmaan enemmän hyödyllinen kuin kyseiset tietorakenteet.

lapm [09.08.2012 07:21:56]

#

DumTom kirjoitti:

Tietorakenteet on tuossa. Pahalta näyttää. Taidan koodata koko pelin uudestaan?

Älä koodaa uudelleen, mieluummin jatka sen virheen etsimistä. Tässä sinulla on nyt loistava tilaisuus toimia salapoliisina ja selvitellä ohjelmasi toimintaa ja miks se toimi virheellisesti rajatussa tilanteessa (pelistä poistuminen).

Ainakin itse tunnun oppivan tekemistäni virheistä enemmän, kuin muuten.

DumTom [19.08.2012 15:21:49]

#

Voisko noi suuret globaalit taulukot haitata asiaa?
Pitäiskö ne sulloa luokkaan?

short BRICKX[800][600],BRICKY[800][600],BRICKGX[800][600],BRICKGY[800][600],BRICKTYPE[800][600];
SDL_TimerID g_TimerID;
bool g_bFlag=false;
//timer callback
Uint32 FOSDL_TimerCallback(Uint32 interval, void *param);
bool GameOn=false,GameAsk=false,Editor_On=false,Test_On=false,GameOrTest=false,MenuOn=true;
bool OriginalMyGame=false;
short CORNER=0;
short MOUX,MOUY,MOUL,MOUR;//KOHTA=0,PKOHTA;
short ULOSKAYNTI,NEXTLEVEL;
float SIN[360],COS[360],SIN_50[360],COS_50[360],SIN_corner[360],COS_corner[360];
float PSIN[70][360];
float PCOS[70][360];
short K_46[40];
short K_26[20];
short Where=-1;
char Hit=0,Left_Button_Ready=0,Right_Button_Ready=0;
short PAUSETIME=0,SOUND_VOLUME=5,HITSOUND=-1;
short PAUSEBUTTON;
short TILETYPE=1;

DumTom [19.08.2012 17:40:34]

#

Nää isoimmat laitoin uuteen luokkaan privaattialueelle ja pistin ohjelman käyttämään metodeja. Ei auttanut. Aloitin jo funktio funktiolta kirjaamaan ylös mitä 11:sta tietorakenteesta mikäkin funktio tarvitsee...

Epäselvää mulle on vähän että jos viittaan esim ton Ball jutun joka on taulukko niin miten menetellään?

Eli joku tietoviisas vois laittaa olioiden viittaukset ja vastaanotot tänne????

short BRICKX[800][600],BRICKY[800][600],BRICKGX[800][600],BRICKGY[800][600],BRICKTYPE[800][600];

User137 [19.08.2012 23:04:38]

#

Noin isoja taulukoita ei sais määritellä koodissa, vaan varata dynaamisesti. Joku calloc(), malloc() tvs. Eli teet niistä 1-ulotteisia taulukoita.
Koko = 800*600*sizeof(short)
Taulukon indeksi paikassa (X, Y) = Y*Leveys + X

Toiseks BRICKX,BRICKY,BRICKGX,BRICKGY voit poistaa kokonaan. Vievät vaan muistia eikä niitä tarvitse mihinkään.

Metabolix [19.08.2012 23:28:33]

#

Kyllä staattisesti (globaalisti tai funktioissa static-sanalla) voi varata isojakin taulukoita, ja ainakaan taulukon siirto luokan sisään ei muuta tilannetta. Muutenkaan liian suuret muuttujat eivät voi mitenkään aiheuttaa kaatumista vasta ohjelman lopussa, vaan ohjelma kaatuisi silloin jo alussa tai viimeistään muuttujien käytön aikaan.

Tuo on kyllä ihan ihmeellistä sähellystä vieläkin, lätkit vain foorumin täyteen epäolennaista koodia ja esität järjenvastaisia teorioita. Oletko edes selvittänyt, missä kohti ohjelma jumittuu? Se on helppoa ilman debuggeriakin: lisää vain ohjelmaan joka puolelle tulostusrivejä ja katso, mitkä rivit tulostuvat ja mitkä eivät.

fprintf(stderr, "%s, rivi %d\n", __FILE__, __LINE__);

User137 [20.08.2012 06:47:33]

#

Nuo taulukot ottaa 800*600*2*5 = 4.8 miljoonaa tavua (pino-muistia? En edes tiedä tarkalleen.). Ellei C ole tässä jotenkin erityinen, niin ainakin pascal:ssa tätä varten pitää jossain vaiheessa alkaa antamaan kääntäjälle optioita jossa muistia kasvatetaan.

Metabolix [20.08.2012 15:56:55]

#

User137 kirjoitti:

Nuo taulukot ottaa 800*600*2*5 = 4.8 miljoonaa tavua

Eli alle 5 megatavua, nykykoneelle pieni määrä.

User137 kirjoitti:

pino-muistia? En edes tiedä tarkalleen.

Pinomuistia käytetään funktioiden sisäisille muuttujille ja parametreille. Globaalit muuttujat ovat muualla.

User137 kirjoitti:

Ellei C ole tässä jotenkin erityinen, niin ainakin pascal:ssa tätä varten pitää jossain vaiheessa alkaa antamaan kääntäjälle optioita jossa muistia kasvatetaan.

Asia ei ole kiinni kielestä vaan enintään käyttöjärjestelmästä. DOS-aikaan toki muistia saattoi käyttää monella tavalla ja tarvittaessa piti vaihtaa reaalitilasta suojattuun tilaan. Nykyään ei pitäisi olla mitään ongelmia. Testasin vielä FPC:llä Linuxissa gigan taulukolla, ja hyvin toimi.

DumTom [20.08.2012 16:37:04]

#

Metabolix,auta mua tossa toisessa topicissa.
Sain jo kaksi oliota toimimaan viittaamalla läpi pelin mutta kaatuu silti silloin tällöin.

jlaire [20.08.2012 18:44:11]

#

User137 kirjoitti:

pino-muistia? En edes tiedä tarkalleen.

Kiinnostuin, googletin, säästän muilta vaivaa: http://stackoverflow.com/a/1171517.


Sivun alkuun

Vastaus

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

Tietoa sivustosta