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

21.03.2014, 21:57

C++/SDL - bild mehrmals darstellen

Hallo, ich schreibe gerade an ein Raumschiff spiel.
Nun bin ich bei den Punkt angekommen wo ich schüsse und feinde mehrmals darstellen möchte
Ich hatte da an sowas wie Array`s gedacht..

Nur irgendwie wird kein bild dargestellt und wie mache ich dass jeder feind woandrs dargestellt wird

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <SDL.h>
#include<SDL_image.h>

int main(int argc ,char** argv)
{
 SDL_Init(SDL_INIT_EVERYTHING);
 SDL_Surface* screen_ ;     
 
 screen_ = SDL_SetVideoMode(640,480,32,SDL_DOUBLEBUF);
 
 
 int i = 1;
 bool run = true;
 
 SDL_Surface* image[50];
 image[i] = IMG_Load("explo.jpg");  // 32x32 - 128x32
 
 SDL_Rect imagePosition;
    imagePosition.x = 100; // hier später (rand() 1 % 100)...
    imagePosition.y = 100;
    
    
 SDL_Rect rect;
 rect.x = 128;
 rect.y = 128;
 
 SDL_Rect rects[500];
 
 // rects position ??
 
 
 while(run)
 {
  SDL_Event event;
  while (SDL_PollEvent(&event))
  {
   switch (event.type)
   {
    case SDL_QUIT:
     run =false;
    break;  
   }
  }



    SDL_FillRect(screen_, 0, SDL_MapRGB(screen_->format, 0, 0, 255));
    
  //SDL_BlitSurface(image,&rects[frame],screen_,&rect);  -> youtube tutorial abgetippt (animation sdl 8) :-)  - nicht wichtig
 // SDL_BlitSurface(image, 0, screen_, &imagePosition);
  
  SDL_BlitSurface(image[i], &rects[i], screen_, &rect); // <- hier zum testen  
  i++;
  imagePosition.y += 1;
  SDL_Flip(screen_); 
  
 }
 SDL_FreeSurface(image[i]);
 SDL_Quit();
 return 0;  
}

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

21.03.2014, 22:41

Da kommen wohl 'ne Menge Probleme zusammen. :)
"sowas wie Array's" -> std::vector, std::array
"mehrmals darstellen" -> Mehrere male dieselbe Ressource (Dein SDL_Surface*) an verschiedene Stellen zeichnen
Jeden Feind woanders darstellen -> Feinde an verschiedene Position zeichnen
Was funktioniert bei dir nicht? Du erhöhst i in jedem Durchlauf / Frame, aber hast nur an der Anfangsposition von i ( = 1) ein gültiges SDL_Surface. Alles andere ist NULL bzw. undefiniert.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

3

22.03.2014, 13:52

:crazy: ich bin jetzt total verwiirt

Ich wollte eigentlich nur folglendes machen


C-/C++-Quelltext

1
2
3
//pseudo-code

bild[i] = sdl_blitsurface("bild",0,screen,bild[i].x,bild[i].y)



aber ich weiss jetz überhauptnichtmehr wem ich den arraywas ich zuweisen soll

SDl_surface ?
Sdl-Blitsurface ?
Bildposition?
Sdl rect ?

hier mein code, kann mir wer das richtig stellen?

4

22.03.2014, 13:59

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
38
39
40
41
42
43
44
45
46
47
48
49
#include <SDL.h>
#include<SDL_image.h>

int main(int argc ,char** argv)
{
 SDL_Init(SDL_INIT_EVERYTHING);
 SDL_Surface* screen_ ;
 SDL_Surface* multi_pic[50];        
 
 screen_ = SDL_SetVideoMode(640,480,32,SDL_DOUBLEBUF);
 
 
 int i = 1;
 bool run = true;
 
 SDL_Surface* image = IMG_Load("bild.jpg"); 
 
 SDL_Rect multi_rect[50];
 multi_rect[i].x  = rand() %  200 + 100;
 multi_rect[i].y  = rand() %  300 + 100;
 
 
 while(run)
 {
  SDL_Event event;
  
  while (SDL_PollEvent(&event))
  {
   switch (event.type)
   {
    case SDL_QUIT:
     run =false;
    break;  
   }
  }
  
  SDL_FillRect(screen_, 0, SDL_MapRGB(screen_->format, 0, 0, 255));
  
  i++;
  //multi_pic[i] = 
  SDL_BlitSurface(image, 0, screen_, &multi_rect[i]); // <- hier zum testen  
  
  SDL_Flip(screen_); 
  }
 
 SDL_FreeSurface(image);
 SDL_Quit();
 return 0;  
}


Die fehlermelung ist das char ** angeblich nicht int in sdl survace conventiren kann

So sieht man das bild nur paar mal binken , aber nicht mehrere sondern nur ein an verschieden position :(

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

5

22.03.2014, 14:14

Gehe im Kopf mal die einzelnen Schritte durch die du dort machst.

1. Was mach:

C-/C++-Quelltext

1
while(run)
2. Was:

C-/C++-Quelltext

1
SDL_FillRect(screen_, 0, SDL_MapRGB(screen_->format, 0, 0, 255));
3. Was:

C-/C++-Quelltext

1
SDL_BlitSurface(image, 0, screen_, &multi_rect[i]);

Versuch dir einfach mal vor zu stellen du sollst diese Anweisungen genau so selbst zeichnen, was würdest du da machen?
:love: := Go;

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

22.03.2014, 15:51

Du erstellt ein Array einer bestimmten Größe, aber nur das erste Element davon hat einen gültigen Wert. Die restlichen Elemente sind ungültig. Das ist eines deiner größeren Probleme. Ich denke da sollten Grundlagen nachgeholt werden.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

7

22.03.2014, 21:53

Ich glaube, ich habs aber das bild wird auch hier nur einmal erstellt aber an 50 verschiednden position :)
Ich bin neu auf diesem gebiet

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
Int test[50];
...
   SDL_Rect multi_rect[50];
   multi_rect[i].x  = rand() %  200 + 100;
   multi_rect[i].y  = rand() %  300 + 100;
 
 

  SDL_FillRect(screen_, 0, SDL_MapRGB(screen_->format, 0, 0, 255));
 
  test[i]=SDL_BlitSurface(image, 0, screen_, &multi_rect[i]); 

  i++;

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

8

22.03.2014, 22:00

Wenn du ein Bild auf eine Leinwand malst, malst diese auch nach jedem einzelnen Strich auf deinem Weg zum Gemälde komplett Weiß über?
:love: := Go;

9

23.03.2014, 19:43

Okey, wenn ich fillrect lösche oder abschalte, dann werden zwar 50 bilder angezeigt, aber irgendwie wird
trotz zufall alles auf eine position erstellt auser 2 oder 3 und wie geht das mit "leinwand"?

Ist blitsuface ein ini ?
oder wieso kann ich nicht einfach

C-/C++-Quelltext

1
2
3
4
SDL_BLITSURFACE test[50];
...
test[i] = ???
...

machen

Ich bekomme es einfach nicht hin ..
Hier so siehts momentan aus ..

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <SDL.h>
#include<SDL_image.h>
 
 
 SDL_Surface* screen_ ;     
 SDL_Surface* image;
 
 
int main(int argc ,char** argv)
{
 SDL_Init(SDL_INIT_EVERYTHING);
 
 screen_ = SDL_SetVideoMode(800,600,32,SDL_DOUBLEBUF);
 image = IMG_Load("astro.bmp");  // 32x32 - 128x32
  
 //multi_pic[i]= SDL_BlitSurface(image, 0, screen_, &multi_rect[i]); 
 
   int i = 1;
   int multi_pic[i]; 
   
   SDL_Rect multi_rect[100];
   multi_rect[i].x  = rand() %  500 + 10;
   multi_rect[i].y  = rand() %  600 + 100;
   
   bool run = true;
 
 while(run)
 {
  SDL_Event event;
  
  while (SDL_PollEvent(&event))
  {
   switch (event.type)
   {
    case SDL_QUIT:
     run =false;
    break;  
   }
  }
  
 
  
 //multi_rect[i].y ++;
 
  i++;
  
  //SDL_FillRect(screen_, 0, SDL_MapRGB(screen_->format, 0, 0, 255));
 
  multi_pic[i]=SDL_BlitSurface(image, 0, screen_, &multi_rect[i];
 
  SDL_Flip(screen_); 
  }
 
 SDL_FreeSurface(image);
 SDL_Quit();
 return 0;  
}


Ich hab auch schon alle durch 50 ersetzt und test[i] gelöscht ....alles mögliche

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

23.03.2014, 19:49

Sind dir Schleifen ein Begriff?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige