Ergebnis 1 bis 3 von 3

Thema: csg`s SDL Fragen-Thread

  1. #1

    csg`s SDL Fragen-Thread

    Hi Leute!
    Endlich hab ich es doch noch zum laufen bekommen.
    Und nachdem ich nen paar Tutorials durchlaufen habe tauchen natürlich sofort die ersten Fragen auf. Erstmal mein Programm, und dann die frage ^^

    Code:
    #include <iostream.h> 
    #include<stdlib.h>
    #include <SDL.h>    
    #ifdef _WIN32      
    #undef main         
    #endif 
    ///////////////////////////////////////////////////
    class Sprite
    {
    public:
    	Sprite(SDL_Surface *image, int x, int y);
    	Sprite();
    	void Move();
    	void SetPos(int x, int y);
    	void Draw(SDL_Surface *Target);
    	SDL_Rect *GetRect(void);
    protected:
    	SDL_Surface *Image;
    	SDL_Rect rect;
    	int speed;
    };
    
    Sprite::Sprite()
    {
    	Image = SDL_LoadBMP("regentropfen2.bmp");
        SDL_SetColorKey(Image, SDL_SRCCOLORKEY, SDL_MapRGB(Image->format, 0, 0, 0)); 
    	speed = rand()%40;
    	int x = rand()%640;
    	int y = 0;
    	SetPos(x,y);
    
    }
    
    Sprite::Sprite(SDL_Surface *New_Image, int x, int y)
    {
    	Image = New_Image;
    	speed = 1;
    	SetPos(x,y);
    
    }
    
    void Sprite::SetPos(int x, int y)
    {
    	rect.x = x;
    	rect.y = y;
    }
    
    SDL_Rect *Sprite::GetRect(void)
    {
    	return &rect;
    }
    
    void Sprite::Draw(SDL_Surface *target)
    {
        SDL_BlitSurface(Image, NULL, target, &rect);
    }
    
    void Sprite::Move()
    {
        //rect.x += speed;
        rect.y += speed;
    
    }
    
    
    //////////////////////////////////////////////////
    
    
    
    int main()
    {
    	SDL_Rect rect_fill;
    	SDL_Event event;
    	bool done = false;
    	SDL_Surface *screen;
    
    	if ((SDL_INIT_VIDEO | SDL_DOUBLEBUF) == -1)
    	{
    		cout<<"Fehler beim Inizialisieren! :"<<SDL_GetError()<<endl;
    	}
    
    	screen = SDL_SetVideoMode(640,480,16,SDL_HWSURFACE); //SDL_HWSURFACE
    	if (screen == 0)
    	{
    		cout<<"Fehler beim Video mode: "<<SDL_GetError()<<endl;
    	}
    
        SDL_SetAlpha(screen, SDL_SRCALPHA, 150); // 255 für normalen regen
    
    	Sprite tropfen[300];
    
        while (!done)
    	{
            while (SDL_PollEvent(&event))
    		{
                switch(event.type) 
    			{
                case SDL_QUIT:
                    done = true;
                    break;
                }
    
                for (int i = 0; i < 300; i++)
    			{
    				if (tropfen[i].GetRect()->y + tropfen[i].GetRect()->h < screen->h)
    				{
    				   tropfen[i].Move();
    				} 
    	      		else
    				{
    			        tropfen[i].SetPos(rand()%640, (rand()%100));
    				}
    			}
    
            SDL_FillRect(screen, &rect_fill, SDL_MapRGB(screen->format, 0, 0, 0));
    
    		for (int a = 0; a < 300; a++)
    		{
    			tropfen[a].Draw(screen);
    		}
    		SDL_Flip(screen);
        }
    	}
    
    
    
    
    	return 0;
    }
    Das ganze zaubert eine Palette von Regentropfen auch den Bildschirm. (Das Alpha Blending lässt das ganze richtig toll ausehen)

    Nun bemerke ich haber beim Programm das sich nur etwas bewegt, wenn ich die Maus bewege. Warum ist das denn so?
    Welcher teil vom Programm bestimmt das, und wie kann ich das ändern? Es wäre natürlich schön wenn die Tropfen auch ohne Mausbewegung fallen würden.
    Das ist echt ne wichtige Frage, da ich als nächstes ein Pong spiel programmieren wollte...

    Danke schonmal für eure antworten.

  2. #2
    Der Code funktioniert??

    Irgendwie erkenne ich nicht wo du SDL initialisierst. Du hast zwar
    Code:
    if ((SDL_INIT_VIDEO | SDL_DOUBLEBUF) == -1)
    // Zeug..
    Aber da überprüfst du nur ob die Oder-Verknüpfung von 2 Konstanten gleich -1 ist. Du musst anfangs explizit SDL_init(FLAGS); aufrufen.
    Weiterhin benutzt du SDL_flip, hast Doppelbuffering aber nicht aktiviert. (SDL_DOUBLEBUFF ist eine Flag für SetVideoMode) Kann sein, daß flip in dem Fall automatisch SDL_RectUpdate ausführt, aber ohne Doppelbuffering, musst SDL_RectUpdate aufrufen um Teile des Screens, oder den ganzen Screen, upzudaten.

    Ansonsten sieht der Code vernünftig aus.

  3. #3
    Das Scheint sich schon automatisch zu initialisieren, das Programm funktioniert ohne Fehler. Zumindest muss ich es es vorher machen.
    Aber weißt du vielleicht Antworten auf meine Frage?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •