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

11.02.2021, 15:47

SDL_Suface Clonen und darstellen

Hallo
Ich versuche seit einiger Zeit ein einfaches Surface,
mithilfe einer For-Schleife und einer Klasse zu clonen

-> dieses Funktioniert auch... aber sobald ich die Maus bewege verschwindet alles
-> ich glaube das muss irgendwie mit SDL_FillRect und SDL_UpdateWindow zusammenhängen
-> stelle ich mydraw.Button unter dem PollEvent geht das Feld immer weiter und weiter runter


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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <SDL.h>
#include <iostream>

const int SCREEN_WIDTH = 960;
const int SCREEN_HEIGHT = 540;

//######################

SDL_Window* window = NULL;
SDL_Surface* screenSurface = NULL;
SDL_Surface* Background = NULL;
SDL_Surface* hWndButton_Up = NULL;
SDL_Surface* hWndButton_Down = NULL;

SDL_Rect hWndFieldPos,pos;

int hWndFieldposX = 150;
int hWndFieldposY = 100;

int ButtonX = 32;
int ButtonY = 28;

int hWndFieldMatrixX = 18;
int hWndFieldMatrixY = 7;

int set_menu = 1;

//-------------------------

class draw
{
 public:
 draw();

 void hWndButton();
//void ButtonEvent();
 private:   
};

//-------------------------
draw::draw()
{   
 pos.x=hWndFieldposX;
 pos.y=hWndFieldposY;
}

//---------------------------
void draw::hWndButton()
{
 for (int i=0; i<hWndFieldMatrixY; i++) // 7    
 {
  pos.x=hWndFieldposX;  // 
  pos.y+=ButtonY;
  
  for (int j=0; j<hWndFieldMatrixX; j++) // 18
  {  
   SDL_BlitSurface(hWndButton_Up,NULL,screenSurface,&pos);  
   pos.x+=ButtonX;
  }
 }
}

//----------------------------

int main(int argc, char* args[])
{
 // dirty quik-start^^  
 SDL_Init(SDL_INIT_VIDEO); 

 //Draw Window
 window = SDL_CreateWindow(
 "Test Menu",
 SDL_WINDOWPOS_UNDEFINED,
 SDL_WINDOWPOS_UNDEFINED,
 SCREEN_WIDTH,
 SCREEN_HEIGHT,
 SDL_WINDOW_SHOWN ); //| SDL_WINDOW_FULLSCREEN//);

 screenSurface = SDL_GetWindowSurface(window);
 SDL_Surface *s;
 
 s=SDL_CreateRGBSurface(0, 960, 540, 32, 0, 0, 0, 0);

 SDL_Rect BackPos;
 BackPos.x = 0;
 BackPos.y = 0;
 
 Background = SDL_LoadBMP("background.bmp");
 
 hWndButton_Up = SDL_LoadBMP("hWnd_blank_up.bmp");
// hWndButton_Down = SDL_LoadBMP("hwnd_blank_down.bmp");
 screenSurface = SDL_GetWindowSurface(window);

 bool quit = false;
 SDL_Event event;
 
 Uint32 start;
 const int FPS = 30;
 
 start = SDL_GetTicks();

 draw mydraw;

 while (quit == false)
 {
  // SDL_FillRect(screenSurface, NULL, SDL_MapRGB(s->format, 0, 0, 150));
  //SDL_BlitSurface(Background,NULL,screenSurface,&BackPos);
   if (set_menu == 1);
   {
    mydraw.hWndButton();
   }
 
  while (SDL_PollEvent(&event))
  {
   switch(event.type)
   {
   //  case SDL_MOUSEMOTION:
   // break;
    case SDL_QUIT:
    quit=true;
    break;
    
    if (event.type == SDL_WINDOWEVENT &&event.window.event == SDL_WINDOWEVENT_RESIZED)
    {
     screenSurface= SDL_GetWindowSurface(window);
    }
   } //end of switch event
  }
 
   SDL_UpdateWindowSurface(window); 

   //... step voor step ..
   if(1000/FPS>SDL_GetTicks()-start) SDL_Delay(1000/FPS-(SDL_GetTicks()-start));

} // end of quit While

 SDL_DestroyWindow(window);
 SDL_FreeSurface(screenSurface);
 SDL_FreeSurface(s);
 SDL_FreeSurface(hWndButton_Up);

 SDL_Quit();
 return 0;
}



was mache ich falsch ?

2

11.02.2021, 18:59

hmm, der Code ist sehr komisch geschrieben, sorry.

Das Problem ist hier dass du direkt ins Screensurface schreibst und dann bei einer Bewegung weg wirfst. Das "SDL_GetWindowSurface(window)" liefert dir das Screensurface, damit sind dann aber deine Änderungen weg.


ich würde dir ein aktuelles SDL2 Tutorial empfehlen. Diese Funktionen sollte man in der art nicht nutzen. Denn im Endeffekt machst du hier alles per CPU und nutzt die GPU nicht. SDL2 unterstützt aber das arbeiten mit Texturen.


Der Grundansatz sollte bei SDL 2 wie folgt sein.
1. Window und Renderer erstellen
2. Texturen laden (keine Surfaces)
3. die Schleife
3.1 Bild leeren (SDL_RenderClear(renderer))
3.2 das zeichnen was man bei jedem bild gezeichnet haben will (SDL_RenderCopy)
3.3 das was man gezeichnet hat auch anzeigen: SDL_RenderPresent(renderer);

ein Beispiel findest du hier: https://wiki.libsdl.org/SDL_CreateTexture

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

11.02.2021, 19:04

pos.y wird nur ein einziges Mal auf 0 gesetzt, danach nur noch erhöht ... Klar, dass dein Button nach unten wandert. Weil du ihn jedes Mal weiter unten zeichnest!

4

11.02.2021, 21:28

Ja super, alles funktioniert sogar mit Fillrect! :thumbsup:

Zeile 61 nach }
Pos.y = hWndfieldposY;
}

Und dann mydraw.hWndButton unter der pollevevent schleife

Danke !!
Und jo das andere mit der Textur Übergabe sowie das Tutorial zieh ich mir auch noch rein |..|>

Ja das mit der GPU und der CPU wusste ich nicht :D

5

11.02.2021, 21:34

Danke auch dafür!,
jetzt weiß ich auch, was das mit derSurface to Textur Übergabe an den Render auf den hacken hat - das war das was ich letzte mal meinte, als ich sagte: "dass man das wohl seit neusten so macht"

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Patty1991« (11.02.2021, 21:41)


Werbeanzeige