Permalänk

c++ SDL runtime errors

Hej jag får skumma runtime errors med mitt första försök till Pong i SDL. Har googlat runt lite på anledningar men hittar inte mycket. Så det får bli ytterligare en tråd.

Just nu är alla Runtime errors borta men "Paddlarna" visas inte på skärmen. Tänkte fråga om någon vet något.

Vet att jag programmerat på Svengelska men ni får leva med det hehe....

Här är main.cpp

#include <iostream> #include <SDL.h> #include <SDL_ttf.h> #include <SDL_Image.h> #include "paddle.h" #define FPS 30 using namespace std; SDL_Surface * screen; SDL_Event event; Uint32 start; bool keys[256]; bool fullscreen = false; bool running = true; bool init(); int main(int argc,char** argv) { if((!init())){SDL_Quit(); return 0;} paddle paddle1(1); paddle paddle2(2); while(running) { start = SDL_GetTicks(); while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: running = false; break; case SDL_KEYUP: keys[event.key.keysym.sym] = false; break; case SDL_KEYDOWN: if(event.key.keysym.sym == SDLK_f){fullscreen = (!fullscreen);} if(event.key.keysym.sym == SDLK_ESCAPE){running = false; break;} keys[event.key.keysym.sym] = true; break; } } if(keys[SDLK_w]){cout << "W IS DOWN" << endl; paddle1.Up();} else if(keys[SDLK_s]){cout << "S IS DOWN" << endl; paddle1.Down();} if(keys[SDLK_UP]){cout << "ARROWUP IS DOWN" << endl;paddle2.Up();} else if(keys[SDLK_DOWN]){cout << "ARROWDOWN IS DOWN" << endl; paddle2.Down();} if(fullscreen){screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);}else{screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF);} SDL_FillRect(screen,NULL,NULL); paddle1.Blit(); paddle2.Blit(); SDL_Flip(screen); if(1000/FPS > SDL_GetTicks() - start){SDL_Delay(1000/FPS - (SDL_GetTicks() - start));} } SDL_Quit(); return 0; } bool init(){ if(SDL_Init(SDL_INIT_EVERYTHING) == -1){ std::cout << "Could not initialize sdl" << std::endl; return false; } std::cout << "SDL initilized" << std::endl; screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF); if(screen == NULL){ std::cout << "Could not setup screen" << std::endl; return false; } std::cout << "Screen is setup" << std::endl; if(TTF_Init() == -1){ std::cout << "Could not initialize ttf" << std::endl; return false; } std::cout << "TTF initilized" << std::endl; SDL_WM_SetCaption("Pong",NULL); return true; }

Här är paddle.h

#pragma once #include <iostream> #include <SDL.h> #include <SDL_ttf.h> #include <SDL_Image.h> #include "global_functions.h" class paddle { public: paddle(short nr); ~paddle(void); void Up(); void Down(); void Blit(); private: int YVel; SDL_Surface * image; SDL_Rect box; };

Här är paddle.cpp

#include "paddle.h" paddle::paddle(short nr) { global_functions f; image = f.Load_Image("paddle.jpg"); image->refcount++; YVel = 5; box.w = image->w; box.h = image->h; box.y = SDL_GetVideoSurface()->h/2 - box.h/2; switch(nr) { case 1: box.x = 0; break; case 2: box.x = SDL_GetVideoSurface()->w - box.w; break; } } void paddle::Up() { box.y-=YVel; } void paddle::Down() { box.y+=YVel; } void paddle::Blit() { SDL_BlitSurface(image,NULL,SDL_GetVideoSurface(),&box); } paddle::~paddle(void) { SDL_FreeSurface(image); }

Visa signatur

| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |

Permalänk
Medlem

Hm skulle satsa på att felet ligger vid

PaddelIMG = functions.Load_Image("paddle.jpg");

körde det med vanlig SDL funktionen för att ladda bilder.
och då vissa den min bild iallafall.

PaddelIMG = IMG_Load("bar2.bmp");

sen bör du VERKLIGEN kolla igenom att dina Switchcase satser är korrekta för nu ser dom väldigt konstiga ut.

Visa signatur

orka

Permalänk
Skrivet av miffo:

Hm skulle satsa på att felet ligger vid

PaddelIMG = functions.Load_Image("paddle.jpg");

körde det med vanlig SDL funktionen för att ladda bilder.
och då vissa den min bild iallafall.

PaddelIMG = IMG_Load("bar2.bmp");

sen bör du VERKLIGEN kolla igenom att dina Switchcase satser är korrekta för nu ser dom väldigt konstiga ut.

Oj, glömde skicka med Load_Image, det är en funktion jag skrev själv, Den ser ut såhär

SDL_Surface * global_functions::Load_Image(std::string filename){ image = IMG_Load(filename.c_str()); if(image != NULL){ Optimized_Image = SDL_DisplayFormat(image); } else{ std::cout << "Image could not be loaded" << std::endl; } return Optimized_Image; }

Jag får inte upp Image could not be loaded på consolen så det kan inte vara det
kan tillägga att jag kopierade denna från ett annat projekt och där funkade allt utmärkt!

Visa signatur

| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |

Permalänk
Medlem
Skrivet av stoffe1100:

Oj, glömde skicka med Load_Image, det är en funktion jag skrev själv, Den ser ut såhär

SDL_Surface * global_functions::Load_Image(std::string filename){ image = IMG_Load(filename.c_str()); if(image != NULL){ Optimized_Image = SDL_DisplayFormat(image); } else{ std::cout << "Image could not be loaded" << std::endl; } return Optimized_Image; }

Jag får inte upp Image could not be loaded på consolen så det kan inte vara det
kan tillägga att jag kopierade denna från ett annat projekt och där funkade allt utmärkt!

Okej, för jag copy&paste koden och körde det, och fick bilden att vissas.
Och jag ser inget fel på den där koden.

Testa att köra med en absolut sökväg till filen se om det funkar bättre då.
vet att jag haft problem med relative sökvägar när jag startar program i VS.

Visa signatur

orka

Permalänk
Skrivet av miffo:

Okej, för jag copy&paste koden och körde det, och fick bilden att vissas.
Och jag ser inget fel på den där koden.

Testa att köra med en absolut sökväg till filen se om det funkar bättre då.
vet att jag haft problem med relative sökvägar när jag startar program i VS.

Bara så att jag fattar rätt, Med absolut sökväg menar du ungefär Dokument/visual studio2010/projekts/pong
?

Visa signatur

| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |

Permalänk
Medlem
Skrivet av stoffe1100:

Bara så att jag fattar rätt, Med absolut sökväg menar du ungefär Dokument/visual studio2010/projekts/pong
?

"c:\\etz\\pong\\alal.jpg"

Visa signatur

orka

Permalänk
Skrivet av miffo:

"c:\\etz\\pong\\alal.jpg"

Hej ledsen för mitt sena svar men blev sur efter extremt lång tid framför datorn utan framgång men idag har jag skrivit om hela koden och det visas fortfarande ingen bild. Uppdaterar första inlägget med den helt omskrivna koden (Troligtvis ser den för det mesta likadan ut)

Den här gången har jag 2 skumma problem, För det första fryser programmet helt när jag startar det, för det andra så får jag runtime errors direkt om jag använder FreeSurface(IMG) i funktionen LoadBMP

EDIT: Nu försvann problemet med FreeSurface(IMG), SDL förvirrar mig, (Troligtvis jag som klantar mig)

Visa signatur

| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |

Permalänk
Medlem
Skrivet av stoffe1100:

Hej ledsen för mitt sena svar men blev sur efter extremt lång tid framför datorn utan framgång men idag har jag skrivit om hela koden och det visas fortfarande ingen bild. Uppdaterar första inlägget med den helt omskrivna koden (Troligtvis ser den för det mesta likadan ut)

Den här gången har jag 2 skumma problem, För det första fryser programmet helt när jag startar det, för det andra så får jag runtime errors direkt om jag använder FreeSurface(IMG) i funktionen LoadBMP

EDIT: Nu försvann problemet med FreeSurface(IMG), SDL förvirrar mig, (Troligtvis jag som klantar mig)

du använder dig av freesurface men räknar du någonsin upp refcount ?

SDL_Surface pekare1, pekare2; pekare1 = IMG_Load("lala.bmp"); pekare2 = pekare1; SDL_FreeSurface(pekare1);

I ovanstånde kommer pekare 2 aldrig att fungera eftersom jag inte räkna upp refcount mellan freesurface. Så freesurface kommer tar bort surfacen,
och pekare2 kommer peka på skräp.

SDL_Surface pekare1, pekare2; pekare1 = IMG_Load("lala.bmp"); pekare2 = pekare1; pekare2->refcount++; SDL_FreeSurface(pekare1);

I det här exemplet räknar jag upp refcount. så när freesurface blir anropad kollar den hur många som refererar till objektet, det är 2 st nu. då drar en bort en och tar inte bort surfacen. nu fungerar pekare2 men inte pekare1.

kan inte svära att det är ditt problem bara men läs

paddle::paddle(SDL_Surface * IMG, int nr) { vel = 5; image = IMG; switch(nr) { case 1: box.x = 0; break; case 2: box.x = 800 - image->w; break; } box.y = 600/2 - box.h/2; box.w = image->w; box.h = image->h; SDL_FreeSurface(IMG); }

Visa signatur

orka

Permalänk
Skrivet av miffo:

du använder dig av freesurface men räknar du någonsin upp refcount ?

SDL_Surface pekare1, pekare2; pekare1 = IMG_Load("lala.bmp"); pekare2 = pekare1; SDL_FreeSurface(pekare1);

I ovanstånde kommer pekare 2 aldrig att fungera eftersom jag inte räkna upp refcount mellan freesurface. Så freesurface kommer tar bort surfacen,
och pekare2 kommer peka på skräp.

SDL_Surface pekare1, pekare2; pekare1 = IMG_Load("lala.bmp"); pekare2 = pekare1; pekare2->refcount++; SDL_FreeSurface(pekare1);

I det här exemplet räknar jag upp refcount. så när freesurface blir anropad kollar den hur många som refererar till objektet, det är 2 st nu. då drar en bort en och tar inte bort surfacen. nu fungerar pekare2 men inte pekare1.

kan inte svära att det är ditt problem bara men läs

paddle::paddle(SDL_Surface * IMG, int nr) { vel = 5; image = IMG; switch(nr) { case 1: box.x = 0; break; case 2: box.x = 800 - image->w; break; } box.y = 600/2 - box.h/2; box.w = image->w; box.h = image->h; SDL_FreeSurface(IMG); }

Jag känner mig äckligt tjatig, Jag har lärt mig c++ helt på egen hand och har därför missat mycket av det grundläggande antar jag... Letar ständigt efter tutorials och försöker repetera men man missar alltid något. Jag sökte runt lite på refcount, Hittar mest bara trådar om folk som har problem med refcount och inte om vad det är. Om du har tid och lust orkar du förklara för mig vad det är?

EDIT: Antar att jag bör bara läsa på mer om pekare och hur SDL_Surface sparas kanske?

Visa signatur

| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |

Permalänk
Medlem

Inget fel att lära sig på egenhand.
Anledningen SDL ser ur som det gör är för att det i huvudask är C och inte C++ så dom använder structar istället för klasser.
Refcount används för att ser hur många som pekar på structen, så att den inte städar bort structen medans annat pekar på den.
Dock så är det upp till programmeraren att lägga till på refcount, Detta sker inte automatisk.

om du vill läsa på om SDL finns det en API beskrivning på http://www.libsdl.org/cgi/docwiki.cgi/SDL_API
och för bara hur c++ fungerar är väll http://www.cplusplus.com/doc/tutorial/ en bra läsning.

Visa signatur

orka

Permalänk
Skrivet av miffo:

Inget fel att lära sig på egenhand.
Anledningen SDL ser ur som det gör är för att det i huvudask är C och inte C++ så dom använder structar istället för klasser.
Refcount används för att ser hur många som pekar på structen, så att den inte städar bort structen medans annat pekar på den.
Dock så är det upp till programmeraren att lägga till på refcount, Detta sker inte automatisk.

om du vill läsa på om SDL finns det en API beskrivning på http://www.libsdl.org/cgi/docwiki.cgi/SDL_API
och för bara hur c++ fungerar är väll http://www.cplusplus.com/doc/tutorial/ en bra läsning.

Du nämnde något om att Refcount även gör så att föregående pekare som pekat på strukturen pekar på skräp efter refcount på en annan? Kan man inte få två olika att peka på samma eller, Jag är lite förvirrad ännu.

Vänta nu, Tror jag fattade det, Du har räddat ytterligare en av mina trådar. Du är min hjälte

Bara en tillägsfråga för att kolla så att jag förstår allt. Om jag hade skrivit pekare1->refcount++ så hade väl det gjort exakt samma sak som
pekare2->refcount++ eftersom de pekar på samma struktur

För övrigt så låg och läste halva natten igår på mobilen på cplusplus.com om pekare ,hehe. Men måste missat den sidan om SDL api. Ska nog ta en paus med att programmera och börja läsa i några dagar. Ser bra ut, Tack så mycket

Visa signatur

| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |

Permalänk
Medlem
Skrivet av stoffe1100:

Du nämnde något om att Refcount även gör så att föregående pekare som pekat på strukturen pekar på skräp efter refcount på en annan? Kan man inte få två olika att peka på samma eller, Jag är lite förvirrad ännu.

Vänta nu, Tror jag fattade det, Du har räddat ytterligare en av mina trådar. Du är min hjälte

Bara en tillägsfråga för att kolla så att jag förstår allt. Om jag hade skrivit pekare1->refcount++ så hade väl det gjort exakt samma sak som
pekare2->refcount++ eftersom de pekar på samma struktur

För övrigt så låg och läste halva natten igår på mobilen på cplusplus.com om pekare ,hehe. Men måste missat den sidan om SDL api. Ska nog ta en paus med att programmera och börja läsa i några dagar. Ser bra ut, Tack så mycket

Nää glömmer du att räkna upp refcount och sen kör freesurface så kommer freesurface ta bort all data.
Har du däremot räknat upp refcount kommer freesurface bara räkna ner refcount.

paddle::paddle(SDL_Surface * IMG, int nr) { vel = 5; image = IMG; switch(nr) { case 1: box.x = 0; break; case 2: box.x = 800 - image->w; break; } box.y = 600/2 - box.h/2; box.w = image->w; box.h = image->h; SDL_FreeSurface(IMG); }

I den koden så anger du att klasses pekare ska peka på samma som parametern.
Sen på slutet tar du freesurface på den utan att räknat upp refcount därför får du fel.
Eftersom refcount default är 1 så räknar freesurface ner den till 0, ser att den är 0 och börjar sedan frigöra allt minne som surfacen hanterar.

Visa signatur

orka

Permalänk
Skrivet av miffo:

Nää glömmer du att räkna upp refcount och sen kör freesurface så kommer freesurface ta bort all data.
Har du däremot räknat upp refcount kommer freesurface bara räkna ner refcount.

paddle::paddle(SDL_Surface * IMG, int nr) { vel = 5; image = IMG; switch(nr) { case 1: box.x = 0; break; case 2: box.x = 800 - image->w; break; } box.y = 600/2 - box.h/2; box.w = image->w; box.h = image->h; SDL_FreeSurface(IMG); }

I den koden så anger du att klasses pekare ska peka på samma som parametern.
Sen på slutet tar du freesurface på den utan att räknat upp refcount därför får du fel.
Eftersom refcount default är 1 så räknar freesurface ner den till 0, ser att den är 0 och börjar sedan frigöra allt minne som surfacen hanterar.

Hmm, Tror jag är med nu.

Skulle man inte kunna sätta som en regel för sig själv när man programmerar i SDL att om man har följande rad:
SDL_Surface * srf1 = SDL_Surface * srf2 (du fattar)

Så ska den även ha en motsvarande srf1->refcount++?

Visa signatur

| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |

Permalänk
Skrivet av miffo:

Nää glömmer du att räkna upp refcount och sen kör freesurface så kommer freesurface ta bort all data.
Har du däremot räknat upp refcount kommer freesurface bara räkna ner refcount.

paddle::paddle(SDL_Surface * IMG, int nr) { vel = 5; image = IMG; switch(nr) { case 1: box.x = 0; break; case 2: box.x = 800 - image->w; break; } box.y = 600/2 - box.h/2; box.w = image->w; box.h = image->h; SDL_FreeSurface(IMG); }

I den koden så anger du att klasses pekare ska peka på samma som parametern.
Sen på slutet tar du freesurface på den utan att räknat upp refcount därför får du fel.
Eftersom refcount default är 1 så räknar freesurface ner den till 0, ser att den är 0 och börjar sedan frigöra allt minne som surfacen hanterar.

Tjenare, Nu har jag gjort om mitt pong grundligt och allting går mycket finare nu Nu är problemet att det funkar inte att hålla ner knappar. förstår inte varför. Blir ett knapptryck och sen ingenting mer. Har ju faktiskt gjort en bool array för att kolla det, Uppdaterar koden i första inlägget nu så kanske du kan kolla lite på det.

EDIT: Märkte även att när jag startar fullscreen börjar allt flimmra. Hur kan detta ske?

Visa signatur

| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa |