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

07.07.2007, 02:54

Fade mit allegro

Hi,

ich versuche mich gerade etwas mit allegro.
Nun wollte ich ganz simpel ein Bild einblenden (fade).
Am Anfang sieht man einen schwarzen Bildschirm und ein Allegrologo wird langsam eingeblendet...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
//vorher: BITMAP *AllegroLogo = load_bitmap...


BITMAP *Buffer = create_bitmap(AllegroLogo->w, AllegroLogo->h);
for(int i = 0; i < 256; i += 4)
{
        clear(Buffer);
        set_trans_blender(0, 0, 0, i);
        draw_trans_sprite(Buffer, AllegroLogo, 0, 0);
        blit(Buffer, screen, 0, 0,
                (SCREEN_W / 2) - (AllegroLogo->w / 2),
                (SCREEN_H / 2) - (AllegroLogo->h / 2),
                AllegroLogo->w, AllegroLogo->h);
}


Das ganze ist allerdings elend langsam (auch auf meinem 3GHz PC).
Dabei läuft die Schleife nur von 0 bis 256 in 4er Schritten...
Die ganze Sache hängt vom Speed des Prozessors ab... natürlich darf das nicht sein.
Gibt es nicht zeitgestuerte und fertige fade Funktionen?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

07.07.2007, 08:57

Beherrscht Allegro Multitexturing? Also dass man 2 Texturen übereinander legen kann? Wenn ja, sollte es auch eine Möglichkeit geben wo man einfach nur einen Faktor(mögl. auch zwei) angibt, der bestimmt wie stark die eine im Vergleich zu der Anderen hervortritt.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

WhiteMike

Alter Hase

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

3

07.07.2007, 10:16

Der Typ hier übergibt der Funktion dazu noch den Parameter 'int speed', der er dazu verwendet, um die Einblendungsgeschwindigkeit zu steuern.

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
void highcolor_fade_in(BITMAP *bmp_orig, int speed)
{
   BITMAP *bmp_buff;

    if ((bmp_buff = create_bitmap(SCREEN_W, SCREEN_H)))
    {
        int a;
        if (speed <= 0) speed = 16;
        
        for (a = 0; a < 256; a+=speed)
        {
            clear(bmp_buff);
            set_trans_blender(0,0,0,a);
            draw_trans_sprite(bmp_buff, bmp_orig, 0, 0);
            vsync();
            blit(bmp_buff, screen, 0,0, 0,0, SCREEN_W, SCREEN_H);
        }
        destroy_bitmap(bmp_buff);
    } 

    blit(bmp_orig, screen, 0,0, 0,0, SCREEN_W, SCREEN_H);
}

Quelle

_____________________________________________________
So kannst du die Prozessorgeschwindigkeit rausfinden und sie (durch eine Konstante geteilt) als Parameter für die 'highcolor_fade_in'-Funktion benutzen:

Ermitteln der Prozessorgeschwindigkeit (Windows API)

_____________________________________________________
Die Geschwindigkeit kann aber auch mal größer mal kleiner sein, denke ich.
Eine Möglichkeit wäre ja auch das so zu machen, wie David das in seinem Buch gemacht hat.
Dabei misst man einfach die Zeit eines Schleifendurchlaufs und übergibt sie dann der Funktion, die dann weiß, wie viel Zeit seit ihrem letzten Aufruf vergangen ist.
Je weniger das ist, desto weniger wird eingeblendet.
So bleibt die Einblendungszahl bei verschiedenen Geschwindigkeiten konstant.

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
    double TimePassed = 0.0f; 
    __int64 llFrequency; 
    __int64 llStartTime; 
    __int64 llEndTime;

    // get Frequency noch vor einer Zeitmessung! 

    QueryPerformanceFrequency((LARGE_INTEGER*) &llFrequency);
    
        // Betreten der Schleife

        while(1)
        {

    // Startzeitpunkt messen 

    QueryPerformanceCounter((LARGE_INTEGER*)(&llStartTime)); 

        // ...

    
        // Funktion für die Übreblendung

        highcolor_fade_in( ... , TimePassed);

        // ...


    // Endzeitpunkt messen 

    QueryPerformanceCounter((LARGE_INTEGER*)(&llEndTime));

    // Zeit, die vergangen ist... 

    TimePassed = ((double)(llEndTime - llStartTime)) / ((double)llFrequency); 
        if(TimePassed == 0.0f)    TimePassed = 0.0001f;

        }



___________________________________________________
So, ich hoffe das war jetzt alles richtig.

Mit freundlichen Grüßen,
WhiteMike

4

07.07.2007, 12:04

@Nox: Das weiß ich leider nicht.

@WhiteMike: Das hat keinen Sinn.
Wie gesagt: Meine Methode ist grotten langsam. Die Schleife macht ja bei mir 64 durchläufe und braucht dafür 2 Sekunden auf einem 3 GHz PC.
Es muss was anderes her...

WhiteMike

Alter Hase

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

5

07.07.2007, 15:49

Nein, Allegro unterstützt kein MultiTexturing.

Hast du versucht mit der Geschwindigkeit (mit dem Wert, um die 'i' erhöht wird) herumzuspielen?

Mit freundlichen Grüßen,
WhiteMike

6

07.07.2007, 18:10

Das mit dem Speed-Wert nützt mir nichts...
Ich brauche etwas, was auf allen PCs gleich schnell läuft...

WhiteMike

Alter Hase

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

7

07.07.2007, 18:14

Schon mal daran gedacht, dass du dich selbst darum kümmern kannst?
(s. oben!)

Mit freundlichen Grüßen,
WhiteMike

8

07.07.2007, 19:28

Kann es sein, dass du set_color_depth() vor set_gfx_mode() aufgerufen hast (weil dann dauert es wirklich sch**** lange, bis ein Bild geblittet wird)?
Sprachen: C/C++, C#, Assembler (16-Bit), QuickBASIC

9

07.07.2007, 19:40

@Reboot
Ja habe ich. Langsam wirds aber erst dann, wenn set_color_depth nach set_gfx_mode kommt. (Habe ich gerade ausprobiert, auserdem erscheint das Bild dann in falschen Farben)

@WhiteMike:
Nein, so lange die Methode auf einem 3GHz PC so langsam ist dass einige Sekunden vergehen, wenn 256 Schleifendurchläufe durchlaufen werde, brauche ich nicht anfangen irgedwas per Zeit zu steuern... Auf einem 300MHz PC, wäre das Ergebnis dann zwei Schleifendurchläufe und das Bild ist da...

10

07.07.2007, 20:32

Zitat von »"tobb"«

@Reboot
Ja habe ich. Langsam wirds aber erst dann, wenn set_color_depth nach set_gfx_mode kommt. (Habe ich gerade ausprobiert, auserdem erscheint das Bild dann in falschen Farben)


Sorry, genau das meinte ich ja! :oops:
Sprachen: C/C++, C#, Assembler (16-Bit), QuickBASIC

Werbeanzeige