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

Anonymous

unregistriert

1

26.08.2003, 10:56

Galatica und Screenshot

Bei mir funktioniert die Screenshot-Funktion bei Galatica nicht. Ist mein Spiel kaputt?

Jens

Treue Seele

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

2

26.08.2003, 12:51

was gibts denn für einen Fehler?

Kannst Du die Funktion mal debuggen und den Fehler hier einstellen(?)
Ich hatte das selbe Problem. Ich musste erst die Bildschirmgröße auf quadratisch einstellen, weil ich so eine tolle Grafikkarte habe ;-)

Anonymous

unregistriert

3

26.08.2003, 13:24

Quellcode

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
// Screenshots werden mit SysRq gemacht.
    if(WasButtonPressed(16))
    {
        // Freien Screenshot suchen
        for(int iShot = 1;!tbFileExists(acSHFilename); iShot++)
        {
            // Existiert dieser Screenshot schon?
            sprintf(acSHFilename, ".\\screenshot\\screenshot%d.bmp", iShot);
            //if(!tbFileExists(acSHFilename)) break;
        }

        // temporäre Oberfläche für den Screenshot anlegen
        LPDIRECT3DSURFACE9 lpSurface;

        tbDirect3D::GetDevice()->CreateOffscreenPlainSurface(
                                    1024,
                                    768,
                                    D3DFMT_A8R8G8B8,
                                    D3DPOOL_SYSTEMMEM,
                                    &lpSurface,0);
    
        // Inhalt des Frontbuffer in die Oberfläche kopieren
        tbDirect3D::GetDevice()->GetFrontBufferData(0,lpSurface);
    
        // Oberfläche in Datei speichern
        D3DXSaveSurfaceToFile(acSHFilename,D3DXIFF_BMP,
                             lpSurface,0,NULL);

        // temporäre Oberfläche wieder freigeben
        lpSurface->Release();
    }
PS: irgendwie muss ich das 1024,
768,
in die Bildpuffer-Breite-Länge umwandeln

Jens

Treue Seele

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

4

26.08.2003, 13:52

im Buch sieht das irgendwie anders aus...

Aber die Höhe und Breite kannst Du aus der BackBufferBeschreibung herausholen.

z. B. so:

LPDIRECT3DSURFACE9 pBackBuffer = NULL;
pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
pBackBuffer->GetDesc( &m_d3dsdBackBuffer );
pBackBuffer->Release();

vielleicht ist das auch irgendwo in der TriBase vorhanden.

Was gibt es denn nun für einen Fehler?
Ein schwarzes Bild?
Schalte mal in den Vollbildmodus und versuchs dann nochmal...
Bis später...

Anonymous

unregistriert

5

28.08.2003, 10:15

Das ist ganz unterschiedlich. Aber meistens wird gemeldet: Schwerer Ausnahmefehler oder xxx hat in KERNEL.DLL einen Fehler verursacht. Vielleicht liegt dies aber nur an dieser Zeile: for(int iShot = 1;!tbFileExists(acSHFilename); iShot++)

Jens

Treue Seele

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

6

28.08.2003, 20:31

na dann rück mal raus mit dem Rest

poste mal den vorherigen Code, in dem die Funktion, die
// Screenshots werden mit SysRq gemacht.
if(WasButtonPressed(16))
enthält aufgerufen wird.
Könnte sein, dass Du für acSHFilename nicht genug Speicher übrig hast???
Bis später...

Anonymous

unregistriert

7

29.08.2003, 09:53

Mit der For-Schleife von David funktioniert alles. (for(int i=0;i<10000;i++)). Dann wird eine leere bmp-Datei erzeugt. Ich habe im Moment keinen Zugang zu einem PC, nach den Fereien werde ich es aber nochmal probieren...

Anonymous

unregistriert

8

13.09.2003, 18:26

Ist genauso wie ich es gesagt habe

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

13.09.2003, 18:47

Hier ist ein Fehler:

Quellcode

1
2
3
4
5
6
7
// Freien Screenshot suchen 
for(int iShot = 1;!tbFileExists(acSHFilename); iShot++) 
{ 
    // Existiert dieser Screenshot schon? 
    sprintf(acSHFilename, ".\\screenshot\\screenshot%d.bmp", iShot); 
    //if(!tbFileExists(acSHFilename)) break; 
}


In der for-Schleife wird schon auf acSHFilename zugegriffen, aber diese Variable wurde ja noch garnicht initialisiert. Außerdem ist das "!" in der for-Bedingung falsch, denn er soll doch so lange weitersuchen, wie die Variable einen Dateinamen enthält, den es schon gibt. So ginge es wahrscheinlich:

Quellcode

1
2
3
4
5
6
7
8
// Freien Screenshot suchen 
strcpy(acSHFilename, ".\\screenshot\\screenshot1.bmp");
for(int iShot = 1; tbFileExists(acSHFilename); iShot++) 
{ 
    // Existiert dieser Screenshot schon? 
    sprintf(acSHFilename, ".\\screenshot\\screenshot%d.bmp", iShot); 
    //if(!tbFileExists(acSHFilename)) break; 
}

10

19.09.2003, 13:49

Hi,

ich hab das mal bei mir ausprobiert. Es wird auch bei mir eine leere Datei erstellt, aber dann kommt der Fehler "Microsoft C++ ... Surface is not height enough", oder so.

Ich gucke mal, wo der Fehler liegt,

Cu,

Chrissi

Werbeanzeige