SDL_Rect verdeckt mein Bild (Bild an Falscher Position)
-
Moin,
hab in einem kleinen Programm ein Bild geladen mit SDL_LoadBMP und dann auf den Screen geschrieben.
Soweit funktioniert auch alles ganz gut. Nur mit dem Problm das das Bild an der Falschen Üosition ist und zwar bei x,y(0,0).Habe ein SDL_Rect rTux und ein SDL_RectrPosition erstellt und dann meine Imagedatei in das rTux gespeichert und diese werte initialisiert:
rTux.x = 0; rTux.y = 0; rTux.w = Image->w; rTux.h = Image->h; // Und dann dieses Rect in rPosition gespeichert für die Position SDL_Rect rPosition = rTux;
Jetzt is klar das mein Bild bei 0,0 angezeigt wird (also in der linken oberen Ecke des Fensters. Wenn ich jetzt aber für Y zB. 60 etc. angebe, fehlt meinem Bild zB der Kopf oder es ist ganz weg(zB bei y=600).
Warum verschiebt sich nicht das ganze Bild? Hab eher das gefühl das das Bild stehen bleibt und nur das Rect sich verschiebt und deswegen mein Bild nicht ganz angezeigt wird... Wie kann ich das beheben?
Gruss
Gizm
-
Haste das Rect geupdatet?
-
Ja.
Hier ist mal ein grössere Ausschnitt von meinem Code...vllt. hilft das mehr.
#include <iostream> #include "SDL.h" #undef main using namespace std; bool bRun = true; bool bLeft = false; bool bRight = false; int main () { SDL_Surface *Screen, *Image; SDL_Event event; SDL_Rect rTux; // SDL Initialisieren // Video Modus setzen // Bild laden und anzeigen Image = SDL_LoadBMP("Tux.bmp"); if (Image == NULL) { cout << "Fehler bei Laden von Tux.bmp" << endl; return 1; } cout << "Bild geladen"<< endl; //Rect für Tux rTux.x = 0; rTux.y = 0; rTux.w = Image->w; rTux.h = Image->h; SDL_Rect rPosition = rTux; //Schleife und Angaben zum Keyboard while (bRun) { while (SDL_PollEvent (&event)) { switch (event.type) { case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_LEFT) { bLeft = true; } else if (event.key.keysym.sym == SDLK_RIGHT) { bRight = true; } else if (event.key.keysym.sym == SDLK_SPACE) { bJump = true; } if (event.key.keysym.sym == SDLK_ESCAPE) { bRun = false; } break; case SDL_KEYUP: if (event.key.keysym.sym == SDLK_LEFT) { bLeft = false; } else if ( event.key.keysym.sym == SDLK_RIGHT) { bRight = false; } break; case SDL_QUIT: bRun = false; break; default: break; } } if (bLeft) { rPosition.x -= 1; } else if (bRight) { rPosition.x += 1; } SDL_SetColorKey(Image, SDL_SRCCOLORKEY, SDL_MapRGB(Image->format, 255, 0, 0)); SDL_FillRect(Screen, 0, SDL_MapRGB(Screen->format, 0, 0, 0)); SDL_BlitSurface(Image, &rTux, Screen, &rPosition); SDL_Flip(Screen); } SDL_FreeSurface(Image); return 0; }
Hoffe das hilft weiter..Hab das mit SDL_Initialisieren jetzt mal rausgelassen um es nicht ganz so lang zu machen^^
Also seh grade hab nix mit Update im Code, aber müsste das eigendlich nicht trotzdem gehen? Ich mein ich veränder die Figur ja nach dem Start nicht und trotzdem fehlt schon etwas.
Bewegen lässt die sich super. ist halt nur das Problem das ich das Bild nicht da anzeigen lassen kann wo ich will sondern immer nur bei 0,0.
-
Hab mir das mal mit dem UpdateRect angeschaut. Ist das nicht das selbe was ich mit dem SDL_Flip mache?
Und wenn ich SDL_UpdateRect benutzen will, was gebe ich dort als Parameter an?
wenn ich zB:rTux.x = 0; rTux.y = 60; rTux.w = Image->w; rTux.h = Image->h; SDL_Rect rPosition = rTux;
Initialisiere.. muss ich dann direkt danach:
SDL_UpdateRect (Screen, 0, 60, Image->w, Image->h);
?
Weil es gibt zumindest keine Compiler meldung....allerdings auch keine verbesserung^^
-
Probier mal das so:
rTux.x = 0; rTux.y = 0; rTux.w = Image->w; rTux.h = Image->h; SDL_Rect rPosition = rTux; rPosition.y = 60;
Ich bin mir nicht sicher, aber das srcRect bei SDL_BlitSurface gibt doch an das du bei y 60 in deinem Bild anfangen möchtest zu zeichnen. Was quatsch ist. rTux sollte doch immer gleich bleiben. Edit: (Sprich das Bild ist ja immer das gleiche nur die Zielkoordinaten ändern sich)
-
Danke hat geholfen...Kla im Nachhinein logisch...
SO jetzt funktionierts...Danke für deine Hilfe