JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Screenshot-Verwaltung
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 11:50    Titel: Screenshot-Verwaltung Antworten mit Zitat

Hey,

ich hatte mal die Methode aus dem Buch überarbeitet, die zum Screenshots-erstellen genutzt wird.
Sie soll dann nicht mehr den vorhandenen überschreiben, sondern immer wieder einen neuen Anlegen..

Das habe ich (relativ simpel) so realisiert:

CPP:
void CDirect3D::CreateScreenshot(void)
{
   struct ScreenStruct
   {
      char Name[120];
      int Number;
   };
   ScreenStruct Screen;

    FILE *ScreenFile = NULL;
   char ScreenName[125];
   char NumberString[5];

   if(ScreenFile = fopen("screens.bin", "r"))
   {
      fread(&Screen,sizeof(Screen),1,ScreenFile);
        strcpy(ScreenName,Screen.Name);
      ++Screen.Number;
      fclose(ScreenFile);
      ScreenFile = fopen("screens.bin", "r+");
      fwrite(&Screen,sizeof(Screen),1,ScreenFile);
      sprintf(NumberString,"%d",Screen.Number);
      strcat(ScreenName,NumberString);
      strcat(ScreenName,".bmp");
   }
   else
   {
      strcpy(Screen.Name,"LostBirdScreenshot");
      Screen.Number = 1;

      ScreenFile = fopen("screens.bin", "w");
      fwrite(&Screen,sizeof(Screen),1,ScreenFile);
      strcpy(ScreenName,"LostBirdScreenshot1.bmp");
   }
   fclose(ScreenFile);


   LPDIRECT3DSURFACE9 lpScreenshot;
   m_lpD3DDevice->CreateOffscreenPlainSurface(SCR_WIDTH,
                                             SCR_HEIGHT,
                                    D3DFMT_A8R8G8B8,
                                    D3DPOOL_SYSTEMMEM,
                                    &lpScreenshot,0);
   m_lpD3DDevice->GetFrontBufferData(0,lpScreenshot);
   D3DXSaveSurfaceToFile(ScreenName,D3DXIFF_BMP,
                        lpScreenshot,0,NULL);

   lpScreenshot->Release();
                                           
}


Jetzt fällt mir aber auf, immer wenn 24 Scrennshots bestehen, bricht das Programm ab, wenn man einen weiteren erstellt ;(
Hätte jemand eine grobe Vorstellung woran das liegen könnte ?

THX für Vorschläge!

(PS: Die Methode könnte man in der Neuauflage verwenden Wink )
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 40
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 12:16    Titel: Antworten mit Zitat

Hi!

Wie sieht denn die Fehlermeldung genau aus?

Ich finde du macht zuviel Dateizugriffe! Einmal auslesen der "screens.bin" würde reichen. Danach kannst du eine statische Variable bei jedem Screenshot inkrementieren.

Oder noch einfacher, ganz ohne Datei, die Dateinamen der Screenshots auslesen und beim höchsten weitermachen.

Beispiel:
CPP:
class ScreenShot
{
public:
   static void TakeShot()
   {
      char name[ 256 ];
      sprintf( name, "Screenshot%03d.tga", num );
      printf( "Take: %s\n", name );
      // Speichern etc...
      num++;
   }

   static void GetLatestNumber()
   {
      // Auslesen des Screenshot Verzeichnisses
      // Beispiel: Screenshot005.tga ist der letzte Screenshot dann
      // Num auf den entsprechenden Wert setzen
      num = 6;
   }
private:
   static unsigned long   num;
};

unsigned long ScreenShot::num = 0;

int main(int argc, char *argv[])
{
   ScreenShot::GetLatestNumber();

   ScreenShot::TakeShot();
   ScreenShot::TakeShot();
   ScreenShot::TakeShot();

   return 0;
}


grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 14:52    Titel: Antworten mit Zitat

David
Singleton benutzen, sonst haste (richtig) schlechte Karten bei einigen hier.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 40
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 15:22    Titel: Antworten mit Zitat

Hi!

Das wär ersten total überladen für so ein kleines Beispiel, was man sogar einfach in Pseudocode hätte schreiben können und zweites interessiert mich das eher weniger, was die anderen für richtig halten. Wink
Ich verwende auch Singletons, aber eben dort wo sie wirklich Sinn machen.

grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 15:36    Titel: Antworten mit Zitat

David
Sie machen dort Sinn. Es sei denn Du willst uns hier Nonsens unterbreiten oder hast das Singletonpattern nicht ganz verstanden.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 40
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 15:46    Titel: Antworten mit Zitat

Hi!

Sicher hab ich es verstanden. Aber ich weis nicht was für dieses Beispiel gegen statische Methoden sprechen sollte.
Im Übrigen führt diese Diskussion zu nichts.

grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 15:48    Titel: Antworten mit Zitat

David
Stimmt, diskusion führt hier zu nichts, aber man macht deshalb kein Static dahin. Ist ja pervers.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 16:06    Titel: Antworten mit Zitat

muss das jetzt schon wieder sein?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 16:07    Titel: Antworten mit Zitat

Jonathan_Klein
Schlechten Tag? Wenn ja: Nicht an andere auslassen. Dein Tonfall ist keiner für einen Moderator.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 16:14    Titel: Antworten mit Zitat

Hmm .. man könnte auch den letzten Dateinamen auslesen, war auch mein erster Gedanklicher ansatz ..

Aber mal weiter gedacht:
Wie kommt man an die letzte Endung ?

Man müsste ein Schleife verwenden, die alle Bilderdurchläuft, solange es ein weiteres gibt.
Natürlich sehr viel Aufwand, nur für einen Screenshot.
(Die eigendliche Zahlen-Auslesung hat dann noch nicht einmal begonnen)

Desshalb würde ich doch ganz gerne die .bin Datei verwenden .. ;(
Findet ihr da einen Fehler ?

PS: Wenn das Programm abstürzt kommt keine Fehlermeldung. Einfach weg, als hätte man es ordnungsgemäß heruntergefahren.
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 16:18    Titel: Antworten mit Zitat

Mat
Wieso so umständlich?

http://www.germangamedev.de/index.php?site=faq&id=13

Einfach nach *.tga oder Deinem Screenshotformat suchen, gucken was der letzte für ne Zahl hat und fertig.

Oder Du machst es noch einfacher: screen121235_20051212.tga

Die 1. 6 ziffern sind Uhrzeit: HHMMSS und die letzten 8 sind Datum: YYYYMMTT. Fertig. So musst Du nicht nach sovielen Dingen sortieren und kannst auf das überprüfen verzichten.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 16:58    Titel: Antworten mit Zitat

[edit]Patrick Razz [/edit]
Zitat:
Einfach nach *.tga oder Deinem Screenshotformat suchen, gucken was der letzte für ne Zahl hat und fertig.


Da finde ich die Verwendung einer bin-Datei schöner Wink
Vorallem wenn man erstmal viele Bilder zu verwalten hat.

Die Idee mit der Uhrzeit hingegen ist echt sehr sehr gut !!

Obwohl ich den Fehler im Code gerne kennen würde Razz
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 18:48    Titel: Re: Screenshot-Verwaltung Antworten mit Zitat

Mat hat Folgendes geschrieben:

CPP:
void CDirect3D::CreateScreenshot(void)
{
   struct ScreenStruct
   {
      char Name[120];
      int Number;
   };
   ScreenStruct Screen;

    FILE *ScreenFile = NULL;
   char ScreenName[125];
   char NumberString[5];

   
usw.


ok, ich fang mal hier an: Wieso in jedem Funktionsaufruf ne neue Strukturendeklaration? Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 40
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 20:28    Titel: Antworten mit Zitat

Hi!

Was du pervers findest und was nicht ist mir relativ wurst. Fakt ist das dein Stil nicht unbedingt das A und O sein muss und du ihn vor allem nicht versuchen solltest anderen aufzudrängen. Ich seh kein Problem beim static, für eine "richtige" implementation hätte ich warscheinlich auch ein Singleton verwendet, aber für das Beispiel ist es einfach ziemlich egal, weil der eigentliche Ablauf gleich bleibt.

@Topic:
Du musst ja nicht jedesmal die Dateinamen auswerten. Einmal am Anfang reicht. Dann kannst du deinen Counter ja jedesmal inkrementieren.

grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 12.12.2005, 20:46    Titel: Antworten mit Zitat

David
Nein, mein Stil ist nicht umbedingt das A und O... aber sehr nah dran.
Aufdrängen will ich keinem was, ich zeig nur wie es besser geht so das man keine Bugs bekommt, aber wer gerne am ende heulen will. bitte.

Es gibt nur "richtige" implementationen. Wer einmal die Grenze überschreitet macht es immer und es kommt nur Murks raus. Daher sollte man auch neulingen direkt zeigen wie es richtig geht und nicht wie es halb oder dahingesaut geht.

Egal ob Beispiel, Release oder Denkanregung. Halbe sachen sind genau das was sie sind: Nichts ganzes. Und was nichts ganzes ist, ist eines: Nicht sinnvoll, ausgereift und geschweige perfekt.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum