 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
t10ottoo Senior JLI'ler

Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 08.06.2004, 14:56 Titel: Framerate ausgeben - Problem |
|
|
Hi,
bin grad bei dem Kapitel "Die Spielschleife" und da berechnet man ja die Frames, nun wollt ich aber mal die Frames aufn Bildschirm ausgeben. Hab aus der einen Übung ne kleine "Animation" gebaut, also von links oben laufen die Rechtecke nach rechts unten mit der Verzögerung "Sleep(1)".
Aber die Ausgabe der Frame will einfach net klappen
Hier ist mal der Code:
Code: |
// Ausgabefunktion
void Render(void)
{
HDC hDC;
// Eine Struktur für Bliteffekte anlegen
DDBLTFX DDBltFX;
// Initialisieren und Größe festlegen
ZeroMemory(&DDBltFX,sizeof(DDBltFX));
DDBltFX.dwSize = sizeof(DDBltFX);
RECT r1;
POINT p1, p2;
// **********ERSTES RECHTECK********** //
// Punkte für das spätere Recheckt festlegen
p1.x = 0; p1.y = 0;
p2.x = 50; p2.y = 50;
// Koordinaten aus dem Fenster in Bildschirmkoordinaten umrechnen
ClientToScreen(hWnd,&p1);
ClientToScreen(hWnd,&p2);
// aus den Punkten ein Rechteck aufbauen
r1.left = p1.x;
r1.top = p1.y;
r1.right = p2.x;
r1.bottom = p2.y;
for(int i = 0; i < 974; i++)
{ // for
// Farbe setzen
DDBltFX.dwFillColor = i*i*i;
// Rechteck nach rechts unten verschieben
r1.left++; r1.top++;
r1.right++; r1.bottom++;
// Rechteck auf den Bildschirm ausgeben
if(FAILED(lpDDSPrimary->Blt(&r1,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&DDBltFX)))
{
Error("Blt ist fehlgeschlagen");
return;
}
// Farbe setzen
DDBltFX.dwFillColor = i*i*i;
Sleep(1);
// Berechnung der tatsächlichen Framerate
thisTime = timeGetTime();
elapsedTime = thisTime - lastTime;
lastTime = thisTime;
FrameCount++;
Time = thisTime - FrameTime;
if(Time > 1000)
{
Frames = (FrameCount * 1000) / Time;
FrameTime = thisTime;
FrameCount = 0;
}
// Framerate ausgeben
char buf[10];
sprintf(buf,"%d",Frames);
// Text ausgeben
TextOut(hDC,500,5,buf,strlen(buf));
// Wichtig !!! Device Context wieder freigeben
lpDDSPrimary->ReleaseDC(hDC);
} // for
}
|
Im Buch steht ja auch nix weiter, auf der CD geht das zwar, aber wenn ich den Code für die Ausgabe der Framerate bei mir reinkopieren, dann geht das irgendwie nicht...achja, beim compilieren kommt immer ne Warnung:
Zitat: | warning C4700: Lokale Variable 'hDC' wurde ohne Initialisierung verwendet |
Weiß ja net, obs weiterhilft...
Bitte helf mit *verzweifel*
Thomas  |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 08.06.2004, 15:01 Titel: |
|
|
Was klappt denn nicht?
Meine erste Vermutung ist, dass du wohl den DeviceContext(hDC) erst mit GetDC(oder so) erst initialisieren musst  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
t10ottoo Senior JLI'ler

Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 08.06.2004, 15:24 Titel: |
|
|
Naja, er zeigt mir halt net die Frames an.
Die Animation (Rechtecke von links oben nach rechts oben) geht und zeigt er auch an, ab die "Bilder pro Sekunde" gibt er nicht aus...
?? geht auch net, gleicher Fehler und die Frames werden immer noch net angezeigt. |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 08.06.2004, 15:53 Titel: |
|
|
Hast du vor und nach dem Rendern diese Begin... und End...-Funktionen eingefügt?
Ich weiß gerade nicht, wie sie genau heißen, aber das soll AFAIK(wenn man den DC verwendet) den Rendervorgang ein- und ausleiten. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
t10ottoo Senior JLI'ler

Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 08.06.2004, 16:01 Titel: |
|
|
Begin und End-Funktion? Nee, sowas hab ich nicht
Die Funktion render kann ich ja ausführen, die Rechtecke werden ja wie gesagt angezeigt... |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 08.06.2004, 16:12 Titel: |
|
|
Ja schon, aber die Rechtecke "zeichnest" du mit DX-Funktionen. Und dafür braucht man AFAIK auch nicht diese Befehle.
Wenn du das Buch hast, schau am Besten mal an der Stelle, an der der DC zum ersten Mal behandelt wird. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
t10ottoo Senior JLI'ler

Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 08.06.2004, 16:23 Titel: |
|
|
Jo, also habs denk ich gefunden, da steht
Code: | HDC GetDC(HWND hWnd) |
Hab alles mögliche probiert...versteh das nicht  |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 08.06.2004, 16:31 Titel: |
|
|
GetDC gibt den DeviceContext zurück.
Also sollte man den nicht als Parameter verwenden
Das Einzige, was du angeben musst, ist das Handle des Fensters, das du am Anfang des Programms erstellst(HWND). Wenn du der GetDC-Funktion dieses Handle übergibst, sollte sie den richtigen DC zurückgeben
Code: | HWND handle=FensterErstellen(); //<- oder wie auch immer du das machst
//Render
hDC devicecontext=GetDC(handle); |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
t10ottoo Senior JLI'ler

Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 08.06.2004, 16:40 Titel: |
|
|
Nun gehts
Code: |
HDC hDC;
hDC = GetDC(hWnd);
[...]
[...]
// Framerate ausgeben
char buf[10];
sprintf(buf,"%d",Frames);
// Text ausgeben
TextOut(hDC,500,5,buf,strlen(buf));
|
Aber verstehen tu ich das nicht so richtig.
Also am Anfang erstell ich ja:
Code: | HWND CreateMainWindow(HINSTANCE hInstance); |
Dann halt die Standard-Funktion für Erstellen eines Fensters. Aber wieso kann ich denn net einfach nur das hier machen:
Code: |
// Framerate ausgeben
char buf[10];
sprintf(buf,"%d",Frames);
// Text ausgeben
TextOut(hWnd,500,5,buf,strlen(buf));
|
Also bei Textout "hWnd" schreiben und net "hDC", hab ja schließlich das hier oben stehen:
Code: |
// Das Fensterhandle
HWND hWnd = 0;
|
Wäre nett, wennde mir das auch noch erklären könntest
Und dann noch eins *g*
Die Frames werden jetzt auf weißer Hintergrundfarbe ausgegeben, wie kann ich denn den Hintergrund ändern?
Gruß
Thomas  |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 08.06.2004, 16:48 Titel: |
|
|
Die HWND-Variable ist eben nur das Handle des Fensters. Aber wenn du diese Funktionen(Text ausgeben, Linienzeichnen) nutzen willst, musst du eben den DC von dem Fenster ermitteln und das geht mit der GetDC()-Funktion.
Das Fensterhandle allein reicht eben nicht für die TextOut-Funktion.
Und damit nicht jedes Mal automatisch der DC ermittelt werden muss(was alles verlangsamen würde), hat man das dem Programmierer überlassen, ihn aus dem Fensterhanlde zu holen.
t10ottoo hat Folgendes geschrieben: | Und dann noch eins *g*
Die Frames werden jetzt auf weißer Hintergrundfarbe ausgegeben, wie kann ich denn den Hintergrund ändern?
Gruß
Thomas  |
Indem du den Hintergrund wie bei den Rechtecken mit einem großen, farbigen Rechteck vor den anderen Zeichenoperationen(z.B. TextOut) füllst.  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
t10ottoo Senior JLI'ler

Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 08.06.2004, 16:55 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: |
Indem du den Hintergrund wie bei den Rechtecken mit einem großen, farbigen Rechteck vor den anderen Zeichenoperationen(z.B. TextOut) füllst.  |
Ja und wie *g*
Code: |
// Framerate ausgeben
char buf[10];
sprintf(buf,"%d",Frames);
// Text ausgeben
DDBltFX.dwFillColor = 0x000000;
TextOut(hDC,500,5,buf,strlen(buf));
|
So geht das nicht... |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 08.06.2004, 21:09 Titel: |
|
|
Code: | DDBLTFX DDBltFX;
// Farbe setzen
DDBltFX.dwFillColor=0xFF0000;
//Bildschirm mit Farbe füllen
if(FAILED(lpDDSPrimary->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&DDBltFX)))
{
Error("Blt ist fehlgeschlagen");
return;
}
|
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
t10ottoo Senior JLI'ler

Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 08.06.2004, 21:32 Titel: |
|
|
Das geht ja net, da ändert er ja irgendwie nur die Hintergrundfarbe vom Bildschirm aber net den, wo die Framrate reingeschrieben wird
Code: |
// Framerate ausgeben
char buf[10];
//sprintf(anzahl,"%d");
sprintf(buf,"%d",Frames);
// Text ausgeben
DDBltFX.dwFillColor = 0xFF0000;
if(FAILED(lpDDSPrimary->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&DDBltFX)))
{
Error("Blt ist fehlgeschlagen");
}
TextOut(hDC,500,5,buf,strlen(buf));
|
|
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 08.06.2004, 23:02 Titel: |
|
|
All sowas kann man in der Dokumentation finden:
Code: |
SetBkMode(hDC, TRANSPARENT);
|
_________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 08.06.2004, 23:07 Titel: |
|
|
Was mir weiter oben noch aufgefallen ist, wohl aber nicht viel mit dem Problem an sich zu tun hat:
Es gibt bestimmte API-Funktionen, die immer Paarweise aufgerufen werden müssen - so muss z.B. bei GetDC() auch ReleaseDC() aufgerufen werden, weil sonst innerhalb kürester Zeit kein Speicher mehr zur verfügung steht.
Eventuell löst es ja sogar doch dein Problem, weil der 2. AUfruf vvon GetDC nichts bringt (liefert fehler zurück) da der Grafikbereich noch gelockt ist - oder die Zeichenaktionen erst bei ReleaseDC() durchgeführt werden... _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
|
|
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
|