SDL Alpha Kanal? Fade-out geht nicht

n00ki3

Mitglied
Code:
    //  FADE IN
    for (o = 0;o<256;o++){ 
    SDL_SetAlpha( logo, SDL_SRCALPHA | SDL_RLEACCEL, o );
    apply_surface( 0, 0,logo , screen );
    SDL_Flip( screen ) ;
    Sleep(10);
    }

    // FADE OUT
    for (o = 256;o>0;--o){ 
    SDL_SetAlpha( logo, SDL_SRCALPHA | SDL_RLEACCEL, o );
    apply_surface( 0, 0,logo , screen );
    SDL_Flip( screen ) ;
    Sleep(10);
    }

Fade Out funktioniert irgendwie nicht ... :(

Hier das ganze Projekt ...vllt liegst an etwas anderem
 
Zuletzt bearbeitet:
n00ki3 hat gesagt.:
Code:
    //  FADE IN
    for (o = 0;o<256;o++){ 
    SDL_SetAlpha( logo, SDL_SRCALPHA | SDL_RLEACCEL, o );
    apply_surface( 0, 0,logo , screen );
    SDL_Flip( screen ) ;
    Sleep(10);
    }

    // FADE OUT
    for (o = 256;o>0;--o){ 
    SDL_SetAlpha( logo, SDL_SRCALPHA | SDL_RLEACCEL, o );
    apply_surface( 0, 0,logo , screen );
    SDL_Flip( screen ) ;
    Sleep(10);
    }

Fade Out funktioniert irgendwie nicht ... :(

Hier das ganze Projekt ...vllt liegst an etwas anderem

Ok habs gelöst :

Ziemlich banaler fehler ...nach dem Fade in zeichnet er auf das bereits bestehendes logo ...und dann sieht man das fade out nicht ,weil im hintergrund das Logo mit dem Vollen Alphawert ist ^^

Also müsste ich den Hintergrund löschen :)
 
Ich sehe du arbeitest mit der Funktion aus einem der Tutorials.
Du solltest in deinen schleifen am besten auch die SDL_Events abarbeiten (zumindest prüfen, ob das Fenster geschlossen wurde),
denn während deinem fade-in und fade-out kann man das Programm nich beenden.
 
soo habs nun verbessert ...man kann im menü das spiel beenden / fenster schleissen.

Aber das Logo müssen sich die Leute ansehen ^^
Bei den meisten kommerziellen Spielen ist das auch so .
Man kann dort höchstens das Logo überspringen um aufs menü zu gelangen.

 
Sieht doch schon ganz gut aus.
Ich hab den Code kurz überflogen und mir sind ein paar Dinge aufgefallen, die du noch verbessern kannst

Wenn du den Bildschirm leeren willst, musst du nicht unbedingt ein schwarzes Bild zeichen.
Mit SDL_FillRect kannst du alles mit einer Fabre füllen, gib einfach als 1 Parameter deinen Pointer auf das Bildschirm Surface und als 2. Parameter (SLD_Rect*) NULL an.

Bei deiner load_imge Funktion solltest du besser mit einer Referenz als Parameter arbeiten.
Also anstelle von
... load_image(std::string filename)
lieber
... load_image(const std::string& filename)
Die 2. Variante bringt performance Vorteile mit sich

Worauf du achten solltest ist, zuerst zeichnen dann updaten und erst dann flippen.
Ich weiß nicht, wie die SDL intern arbeitet, aber es kann evtl. die Framerate erhöhen.
Also
C++:
while(!quit)
{
   draw();
   update();
   SDL_Flip(....);
}
 
Erstmal viele Dank für die Tips .

Zu Tip nr.1 :
Hab ich grade ebend versucht ...aber habs nicht hinbekommen.:(

Zu Tip nr.2 :
das ist mir etwas zu abstrakt erklärt ^^
Du musst wissen , ich bin ein ziemlicher C++ newb ...deswegen hab ich mir so ein Projekt ausgesucht : Ich lerne parallel fleißig C++ ...und wie du an meinem unsauberen Code siehst bin ich noch nicht beim OOP angekommen .
Ich hab zwar in Delphi OOP angewandt ,aber hier in C++ ist das etwas anders ^^.

Zu Tip nr.3 :
Was ist denn Update?
Ich denke da sind nur 2 schritte ...
1.draw = apply_surface
2.update=SDL_Flip();



Einige sagen bei game2.rar kann man die .exe nicht start bzw. das Fenster schliesst sich sofort wieder ...
kann das jemand bestätigen ?
 
Zuletzt bearbeitet:
1.

entweder du machst es so
C++:
SDL_Surface* screen = SDL_SetVideoMode(...);

...

SDL_FillRect(screen, NULL, 0); // mit schwarz füllen

oder

C++:
SDL_FillRect(SDL_GetVideoSurface(), NULL, 0);

das hat den gleichen effekt

2.
Ok ich merk gerade, dass es hier nicht wirklich einen Unterschied macht, aber Referenzen sind oft von Vorteil.


Also ich versuch es mal zu erklären. (ich hoffe es stimmt soweit, wenn nicht bitte verbessern)

Zuerst musst du wissen, was eine Referenz ist. Es ist im Prinzip einfach ein andere Bezeichner für ein und die Selbe Variable.

Also

C++:
int i = 0;
int& i2 = i;

i2 = 1;

dann hat auch i den Wert 1, da i2 nur die Referenz auf i ist.
Mit andren Worten, damit ist es möglich anstelle i auch per i2 auf i zuzugreifen.

Das macht hier noch wenig Sinn.
Bei Klassen macht es schon mehr sinn.
std::string ist eine Klasse.

angenommen du hast die Funktion

C++:
void f(std::string s)
....

Wenn du sie jetzt per

C++:
f("Hallo");

aufrufst, wird der Konstruktor der Klasse string aufgerufen.
Danach wird in der Funktion normal mit s gearbeitet.

Rufst du die Funktion so auf

C++:
std::string s;
s = "hallo";
f(s);

Dann wird wieder der Konstruktor von der string Klasse aufgerufen, obwohl ja bereits ein string Objekt übergeben wird.
Genau hier bieten Referenzen einen Vorteil.

C++:
void f(const std::string& s)
...

denn hier entfällt der Konstruktor aufruf, da s ja bereits vorhanden ist!
Du musst nur beachten, dass du s nicht innerhalb der Funktion verändern kannst. (wegen const)

3. Unter update versteht man nichts andres, als die Berechnungen, die nichts mit der Grafik zu tun haben.

Also draw ist nur das zeichnen an sich (apply_surface)

Update ist dann das abarbeiten der Eingabe, der Events, etc.

Und flippen ist wieder klar
 
Zurück