Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.01.2008, 17:58

Bilder verschieben mit SDL

hi Leute,

weiß jemand wie ich mit Hilfe der SDL_BlitSurface und SDL_UpdateRect -Funktionen Bilder verschieben kann?

Hier mal ein Codeausschnitt (ich denke, ich habe nix falschgemacht, vielleicht habe ich was übersehen):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SDL_Surface *screen  = NULL;
SDL_Surface *image = NULL;

void LoadImage(const char *file, Sint32 xPos, Sint32 yPos)
{
    SDL_Rect position;

    image = SDL_LoadBMP(file);
    
    position.x = xPos;
    position.y = yPos;
    position.w = image->w;
    position.h = image->h;

    
    printf("\n%s will be loaded...\n", file);

    if(image == NULL)
        printf("\aCould not load %s", file);
    else
    {
        SDL_BlitSurface(image,NULL,screen,&position);
        SDL_UpdateRect(screen,position.x,position.y,position.w,position.h);
        printf("\n%s has been loaded\n", file);
    }
}


Für Hilfe bin ich sehr dankbar
...like a baby who's sweet and innocent :-)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

09.01.2008, 20:24

Ich sehe hier nur, dass du ein Bild lädst...

Was geht den nicht?

Befindet sich das Bild dann einfach nicht an der Position, an der du glaubst es sein sollte?

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

3

10.01.2008, 12:24

position.x und position.y ändern und neu blitten.

4

12.01.2008, 12:47

@drakon: Also ich speichere ja die einzelnen Positionen ab (Höhe, Breite, x und y)....wenn ich jetzt einfach mal zwei Zahlen eingebe (200x und 14y) soll er das Bild in diese Richtung bewegen...das macht er aber nicht......sobald ich Zahlen für x und y angebe zeigt er mein Bild nicht mehr an....wenn aber keine Zahlen da sind zeigt er das Bild ganz am Rand in original Höhe und Breite an (ich muss dazu sagen, dass man die beiden Parameter x und y nicht angeben muss da beide den Standardwert 0 besitzen)...

Hier nochmal mein etwas modifizierter Quelltext (cpp):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void LoadImage(const char *file, Sint32 xPos, Sint32 yPos)
{

    image = SDL_LoadBMP(file);
    
    printf("\n%s will be loaded...\n", file);

    if(image == NULL)
        printf("\aCould not load %s", file);
    else
    {
        SDL_Rect position;

        position.x = xPos;
        position.y = yPos;
        position.w = image->w;
        position.h = image->h;
        
        SDL_BlitSurface(image,NULL,screen,&position);
        SDL_UpdateRect(screen,position.x,position.y,position.w,position.h);
        printf("\n%s has been loaded\n", file);
    }
}


und hier der Header (h):

Quellcode

1
2
// LoadTexture lädt Bilddateien
void LoadImage(const char *file, Sint32 xPos = 0, Sint32 yPos = 0);
...like a baby who's sweet and innocent :-)

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

5

13.01.2008, 18:16

hm..du solltest nicht bei jeder Bewegung das Bild neu laden!

Mach dir 2 Funktionen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
SDL_Surface * LoadImage(const char *file)
{
     if(file == NULL)
          return NULL;  // Fehler

 
   SDL_Surface * image = SDL_LoadBMP(file);

   if(image == NULL)
   {
          printf("\aCould not load %s", file); 
         return NULL;  // Fehler

   }

   printf("\n%s is loaded...\n", file);

   return image;  

}


void MoveImage(SDL_Surface *image, Sint32 xPos, Sint32 yPos)
{
     if(image==NULL)
     {
          printf("Error in MoveImage: image is NULL");
          return;
     }

     SDL_Rect position;
     position.x = xPos;
     position.y = yPos;
     position.w = image->w;
     position.h = image->h; 

     SDL_BlitSurface(image,NULL,screen,&position);
      SDL_UpdateRect(screen,0,0,0,0);  // Ganzen Screen updaten. Alternativ könntest du die alte und neue Position updaten 

}

6

13.01.2008, 20:41

was ist denn an meiner Version falsch?
...like a baby who's sweet and innocent :-)

Werbeanzeige