www.mikrocontroller.net

Forum: PC-Programmierung SDL: Rechteck bewegt sich nicht


Autor: LinuxUser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo möchte mit der SDL Bibliothek als erste Übung ein kleines Rechteck 
mit durch die Tastatur bewegen. Leider funktioniert dies überhaupt 
nicht.
Was mache ich vermutlich falsch?
int main(int argc, char **argv)
{

  if (SDL_Init ( SDL_INIT_VIDEO ) != 0) 
  { //SDL Initialisierung 
    printf ("SDL Initialisierung fehlgeschlagen: %s\n", 
    SDL_GetError ()); //Bei Fehler, beenden 
    return EXIT_FAILURE; 
  } 
  atexit (SDL_Quit); //Beim beenden des Programms wird SDL_Quit ausgeführt 
  screen = SDL_SetVideoMode (640, 480, 16, SDL_SWSURFACE); // Erstelle Screen 
  if (screen == NULL) 
  {  //Bei Fehler 
    printf ("Auflösung nicht gefunden: " //Fehler melden! 
    " %s\n", SDL_GetError ()); 
    return EXIT_FAILURE; 
  } 
  //SDL_Delay (2000);  //Warte 2000 Millisec. 
  //printf ("Alles OK!\n");  //Beenden mit "Alles OK!" 
     
  image = IMG_Load("wuerfel.JPG");
  if ( image == NULL )
  {
    printf("Das Bild konnte nicht geladen werden: %s\n", SDL_GetError());
    exit(-1);
  }
  /*
  //Apply the surface to the screen
    apply_surface( 0, 0, image, screen ); 

  //Update the screen
    if( SDL_Flip( screen ) == -1 )
    {
        return 1;
    } 
  */
  rect.x = 0;
  rect.y = 0;
  rect.w = 0;
  rect.h = 0;
  SDL_BlitSurface(image, NULL, screen, &rect);
  SDL_UpdateRect(screen, rect.x, rect.y, rect.w, rect.h);

  while (!quit)
    {
      SDL_PollEvent (&e);
      bKey = SDL_GetKeyState (NULL);
      if (bKey[SDLK_ESCAPE])
        quit = 1;
      if (bKey[SDLK_LEFT] && rect.x > 0)
        rect.x--;
      if (bKey[SDLK_RIGHT] && rect.x < 640)
        rect.x++;
    if (bKey[SDLK_UP] && rect.y > 0)
        rect.y++;
    if (bKey[SDLK_DOWN] && rect.y < 480)
        rect.y++;
    printf("rect.x = %d rect.y = %d\n",rect.x,rect.y);

    SDL_BlitSurface(image, NULL, screen, &rect);
    SDL_UpdateRects(image,1,&rect);

    SDL_FreeSurface(image);

    SDL_Delay(500);
    }

  return EXIT_SUCCESS;
}

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
includes fehlen?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem updatest du mit updateRect immer nur eine Rect der Größe (h und 
w) von 0.

Autor: Arne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum sind rect.h und rect.w Null? Müsste das nicht Höhe/Breite von 
'image' sein?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achja, und bei Update musst du natürlich den screen angeben und nicht 
image.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arne schrieb:
> Warum sind rect.h und rect.w Null? Müsste das nicht Höhe/Breite von
> 'image' sein?

Achja, stimmt, SDL_Blitt trägt ja die Größe in das Rect ein. Da hab ich 
zuerst nicht dran gedacht.

Damit bleibt noch, dass SDL_UpdateRect mit screen aufgerufen werden 
muss.

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ganz abgesehen davon, dass "screen" in Zeile 11 nicht deklariert 
wurde :)

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und was mir noch gerade auffällt: Warum wird das image mit 
SDL_FreeSurface(image); in der Schleife gelöscht? Beim zweiten Durchlauf 
wird nur noch auf nicht belegten Speicher zugegriffen. Eigentlich müsst 
da jeder Debugger sofort Alarm schreien.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.