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
|
Verfasst am: 12.12.2005, 11:50 Titel: Screenshot-Verwaltung |
|
|
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 ) _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 12.12.2005, 12:16 Titel: |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 12.12.2005, 15:22 Titel: |
|
|
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.
Ich verwende auch Singletons, aber eben dort wo sie wirklich Sinn machen.
grüße |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 12.12.2005, 15:36 Titel: |
|
|
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 |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 12.12.2005, 15:46 Titel: |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 12.12.2005, 16:14 Titel: |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 12.12.2005, 16:18 Titel: |
|
|
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 |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 12.12.2005, 16:58 Titel: |
|
|
[edit]Patrick [/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
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  _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 12.12.2005, 18:48 Titel: Re: Screenshot-Verwaltung |
|
|
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?  |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 12.12.2005, 20:28 Titel: |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 12.12.2005, 20:46 Titel: |
|
|
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 |
|
 |
|