Permalänk

c++ SDL problem

Hej!
Jag har ett problem med min kod. Av någon anledning hoppar den ur while loopen av en anledning som jag inte tycks finna. Tänkte fråga om ni vet hur man löser det

Vet att koden inte är särskilt objekt orienterad men syftet var inte att skriva ett helt program utan bara lite tester. I detta fallet har jag försökt göra en class som heter NewButton som skapar en knapp på skärmen beroende på vilka parametrar man skickar med.

Den hoppar alltså ur While loopen i main.cpp

För övrigt är jag extremt ny med SDL så ge mig gärna lite konstruktiv kritik om ni vill

Tack i förhand!

EDIT: Koden har nu fixats till lite. Knappen dyker upp på skärmen men när jag trycker på den händer absolut ingenting. Så nu behöver jag hjälp med detta med.

Här är main.cpp

#include <sdl.h> #include <string> #include "NewButton.h" SDL_Event event; bool running = true; SDL_Surface * screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF); int main(int argc, char * args[]){ SDL_Surface * Image = SDL_LoadBMP("TestKnapp.BMP"); Image = SDL_DisplayFormat(Image); NewButton Avsluta(400,300,100,50,Image,screen); while(running){ if(SDL_PollEvent(&event)){ if(event.type == SDL_QUIT){running = false; break;} if(event.type == SDL_KEYDOWN){ if(event.key.keysym.sym == SDLK_ESCAPE){running = false; break;} } if(Avsluta.CheckEvents(event)){ running = false; break; } } Avsluta.DrawToScreen(); SDL_Flip(screen); } return 0; }

Här är NewButton.h

#ifndef newbutton #define newbutton #include <SDL.h> #include <string> using namespace std; class NewButton { public: NewButton(int x,int y, int w, int h,SDL_Surface * Image,SDL_Surface * screen); void DrawToScreen(); bool CheckEvents(SDL_Event &event); //returner true om knappen tryckts ner med vänster musknapp private: SDL_Surface * LocalScreen; SDL_Surface * ButtonImage; SDL_Rect ButtonRect; int MouseX,MouseY; }; #endif

Här är NewButton.cpp

#include "NewButton.h" #include <SDL.h> #include <string> using namespace std; NewButton::NewButton(int x,int y, int w, int h,SDL_Surface * Image,SDL_Surface * screen): LocalScreen(screen), MouseX(0), MouseY(0) { ButtonImage = Image; ButtonRect.x = x; ButtonRect.y = y; ButtonRect.w = w; ButtonRect.h = h; } void NewButton::DrawToScreen(){ SDL_BlitSurface(ButtonImage,NULL,LocalScreen,&ButtonRect); } bool NewButton::CheckEvents(SDL_Event &event){ if(event.type == SDL_MOUSEBUTTONDOWN){ if(event.button.button == SDL_BUTTON_LEFT){ MouseX = event.button.x; MouseY = event.button.y; if((MouseX > ButtonRect.x) && (MouseY > ButtonRect.y) && (MouseX < (ButtonRect.x + ButtonRect.w)) && (MouseY < (ButtonRect.y + ButtonRect.w))){ return true; } } } return false; }

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

Det finns två problem i koden, för det första så är event.type = SDL_MOUSEMOTION en tilldelning och inte en jämförelse.
För det andra så finns det fall som gör att funktionen NewButton::CheckEvents inte alltid returnerar ett värde, lägg den sista retursatsen utanför else-blocket istället.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Skrivet av MagnusL:

Det finns två problem i koden, för det första så är event.type = SDL_MOUSEMOTION en tilldelning och inte en jämförelse.
För det andra så finns det fall som gör att funktionen NewButton::CheckEvents inte alltid returnerar ett värde, lägg den sista retursatsen utanför else-blocket istället.

Okej 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
Skrivet av MagnusL:

Det finns två problem i koden, för det första så är event.type = SDL_MOUSEMOTION en tilldelning och inte en jämförelse.
För det andra så finns det fall som gör att funktionen NewButton::CheckEvents inte alltid returnerar ett värde, lägg den sista retursatsen utanför else-blocket istället.

Stötte på ett annat problem, Min avslutaknapp kom fram men den funkar inte när man trycker på den, Har du någon aning om vad det kan vara?

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

Nyfiken fråga - skulle man inte kunna skriva om den här satsen i main.cpp

if(event.type == SDL_KEYDOWN) { if(event.key.keysym.sym == SDLK_ESCAPE){running = false; break;} }

till

if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE){ running = false; break; }

Frågar eftersom jag är rätt ringrostig och är sugen på att börja igen.

Visa signatur

Ne nos sequere nobis secede

Permalänk
Skrivet av Wolfclaw:

Nyfiken fråga - skulle man inte kunna skriva om den här satsen i main.cpp

if(event.type == SDL_KEYDOWN) { if(event.key.keysym.sym == SDLK_ESCAPE){running = false; break;} }

till

if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE){ running = false; break; }

Frågar eftersom jag är rätt ringrostig och är sugen på att börja igen.

Tror inte det funkar. Eller jo, Om du trycker in båda knapparna i exakt samma tillfälle som loopen körs igenom, vilket är högst osannolikt. Man måste göra något som märker om knappar trycks ner, Har nämligen själv haft samma tanke ^^

EDIT, Missuppfattade, har inte en aning om det du skrev funkar

Det borde absolut funka tror jag, Men tanken med att göra så är att man kan sätta flera olika knappar efter varandra och om du skriver om det så blir det hemskt mycket kod ganska fort Kanske funkar för program där du bara vill kunna använda en knapp

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 Wolfclaw:

Nyfiken fråga - skulle man inte kunna skriva om den här satsen i main.cpp

if(event.type == SDL_KEYDOWN) { if(event.key.keysym.sym == SDLK_ESCAPE){running = false; break;} }

till

if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE){ running = false; break; }

Frågar eftersom jag är rätt ringrostig och är sugen på att börja igen.

Det är ingen bra idé då strukturen för SDL_Events inte alltid har informationen för Key utan det är det man tar reda på i "event.type == SDL_KEYDOWN"

Så skulle tro att det kan leda till fel.

Visa signatur

orka

Permalänk
Skrivet av miffo:

Det är ingen bra idé då strukturen för SDL_Events inte alltid har informationen för Key utan det är det man tar reda på i "event.type == SDL_KEYDOWN"

Så skulle tro att det kan leda till fel.

Hej! Förlåt att jag stör men har du någon gissning till varför min avsluta knapp inte funkar. Det händer inget när jag trycker på den, Den dyker dock upp nu i alla fall!

Tack i förhand

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:

bool NewButton::CheckEvents(){ if(event.type = SDL_MOUSEMOTION){ MouseX = event.motion.x; MouseY = event.motion.y; if(event.type == SDL_MOUSEBUTTONDOWN){ if(event.button.button == SDL_BUTTON_LEFT){ if((MouseX > ButtonRect.x) && (MouseY > ButtonRect.y) && (MouseX < (ButtonRect.x + ButtonRect.w)) && (MouseY < (ButtonRect.y + ButtonRect.w))){ return true; } } } } else { return false; } }

Felet är att du kolla först om det är en MouseMotionEvent.
Ett Event kan bara vara av en typ, dvs det kan inte vara ett MouseMotionEvent och ett MouseButtonEvent.
Dessutom behöver du inte spara ner x,y varje gång musen rör sig denna information kommer med i MouseButtonEvent

Visa signatur

orka

Permalänk
Skrivet av miffo:

Felet är att du kolla först om det är en MouseMotionEvent.
Ett Event kan bara vara av en typ, dvs det kan inte vara ett MouseMotionEvent och ett MouseButtonEvent.
Dessutom behöver du inte spara ner x,y varje gång musen rör sig denna information kommer med i MouseButtonEvent

Nu när jag tittar på koden så ser jag det, fan va dummt det ser ut!!. Har dock inte tillgång att testa det nu längre. Sitter på mobilen och ska snart sova. Men ditt svar låter mycket troligt!

Ett otroligt tack till dig mr!

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:

Felet är att du kolla först om det är en MouseMotionEvent.
Ett Event kan bara vara av en typ, dvs det kan inte vara ett MouseMotionEvent och ett MouseButtonEvent.
Dessutom behöver du inte spara ner x,y varje gång musen rör sig denna information kommer med i MouseButtonEvent

Har ändrat det nu, funkar fortfarande inte :/ Om du orkar lägga mer tid på mig så. hjälp mig ! Kunde inte sova på halva natten för att låg och tänkte på detta xD

EDIT, ändrade koden i huvudinlägget till så långt som jag kommit

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
Hedersmedlem

Nu var det förvisso länge sedan jag gjorde något med sdl, men tilldelas NewButton::event ett värde någonstans?

Permalänk
Medlem
Skrivet av stoffe1100:

Har ändrat det nu, funkar fortfarande inte :/ Om du orkar lägga mer tid på mig så. hjälp mig ! Kunde inte sova på halva natten för att låg och tänkte på detta xD

EDIT, ändrade koden i huvudinlägget till så långt som jag kommit

Testa att ta bort #pragma once tror den + ifndef stör på något sätt.

#pragma once #ifndef newbutton #define newbutton

Edit: testa om det med pragma once men gjorde ingen skillnad dock så borde du ändå välja en eller den andra

Sen som Elgot säger så har du inte till delat NewButton::event något så där kommer du få fel, skulle säga att enklast är att ta bort den privata medlemmen och gör så att checkevents tar emot en SDL_Event

bool NewButton::CheckEvents(SDL_Event &event)

Visa signatur

orka

Permalänk
Skrivet av miffo:

Testa att ta bort #pragma once tror den + ifndef stör på något sätt.

#pragma once #ifndef newbutton #define newbutton

Edit: testa om det med pragma once men gjorde ingen skillnad dock så borde du ändå välja en eller den andra

Sen som Elgot säger så har du inte till delat NewButton::event något så där kommer du få fel, skulle säga att enklast är att ta bort den privata medlemmen och gör så att checkevents tar emot en SDL_Event

bool NewButton::CheckEvents(SDL_Event &event)

Skrivet av Elgot:

Nu var det förvisso länge sedan jag gjorde något med sdl, men tilldelas NewButton::event ett värde någonstans?

Har uppdaterat koden till att skicka referensen av event. Men gissa vad. Det funkar fortfarande inte

EDIT: Tog även bort #pragma once

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
Hedersmedlem
Skrivet av stoffe1100:

Det funkar fortfarande inte

Det gör det visst.

Permalänk
Medlem
Skrivet av stoffe1100:

Har uppdaterat koden till att skicka referensen av event. Men gissa vad. Det funkar fortfarande inte

EDIT: Tog även bort #pragma once

Jag copypasta all kod från din post och det fungerar för mig, vad får du för fel?
Testa att köra en full rebuild.

Visa signatur

orka

Permalänk
Skrivet av Elgot:

Det gör det visst.

Skrivet av miffo:

Jag copypasta all kod från din post och det fungerar för mig, vad får du för fel?
Testa att köra en full rebuild.

Ett stort tack till er! det funkar nu.

Tydligen hade jag någon annan kod i tråden än i VS haha

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 |