Forum: PC-Programmierung SDL: Rechteck bewegt sich nicht


von LinuxUser (Gast)


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?
1
int main(int argc, char **argv)
2
{
3
4
  if (SDL_Init ( SDL_INIT_VIDEO ) != 0) 
5
  { //SDL Initialisierung 
6
    printf ("SDL Initialisierung fehlgeschlagen: %s\n", 
7
    SDL_GetError ()); //Bei Fehler, beenden 
8
    return EXIT_FAILURE; 
9
  } 
10
  atexit (SDL_Quit); //Beim beenden des Programms wird SDL_Quit ausgeführt 
11
  screen = SDL_SetVideoMode (640, 480, 16, SDL_SWSURFACE); // Erstelle Screen 
12
  if (screen == NULL) 
13
  {  //Bei Fehler 
14
    printf ("Auflösung nicht gefunden: " //Fehler melden! 
15
    " %s\n", SDL_GetError ()); 
16
    return EXIT_FAILURE; 
17
  } 
18
  //SDL_Delay (2000);  //Warte 2000 Millisec. 
19
  //printf ("Alles OK!\n");  //Beenden mit "Alles OK!" 
20
     
21
  image = IMG_Load("wuerfel.JPG");
22
  if ( image == NULL )
23
  {
24
    printf("Das Bild konnte nicht geladen werden: %s\n", SDL_GetError());
25
    exit(-1);
26
  }
27
  /*
28
  //Apply the surface to the screen
29
    apply_surface( 0, 0, image, screen ); 
30
31
  //Update the screen
32
    if( SDL_Flip( screen ) == -1 )
33
    {
34
        return 1;
35
    } 
36
  */
37
  rect.x = 0;
38
  rect.y = 0;
39
  rect.w = 0;
40
  rect.h = 0;
41
  SDL_BlitSurface(image, NULL, screen, &rect);
42
  SDL_UpdateRect(screen, rect.x, rect.y, rect.w, rect.h);
43
44
  while (!quit)
45
    {
46
      SDL_PollEvent (&e);
47
      bKey = SDL_GetKeyState (NULL);
48
      if (bKey[SDLK_ESCAPE])
49
        quit = 1;
50
      if (bKey[SDLK_LEFT] && rect.x > 0)
51
        rect.x--;
52
      if (bKey[SDLK_RIGHT] && rect.x < 640)
53
        rect.x++;
54
    if (bKey[SDLK_UP] && rect.y > 0)
55
        rect.y++;
56
    if (bKey[SDLK_DOWN] && rect.y < 480)
57
        rect.y++;
58
    printf("rect.x = %d rect.y = %d\n",rect.x,rect.y);
59
60
    SDL_BlitSurface(image, NULL, screen, &rect);
61
    SDL_UpdateRects(image,1,&rect);
62
63
    SDL_FreeSurface(image);
64
65
    SDL_Delay(500);
66
    }
67
68
  return EXIT_SUCCESS;
69
}

von zwieblum (Gast)


Lesenswert?

includes fehlen?

von Klaus (Gast)


Lesenswert?

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

von Arne (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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

von Klaus (Gast)


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.

von zwieblum (Gast)


Lesenswert?

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

von Klaus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.