JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=411f39cf9adcdf5f96bb37036d7f6ec3Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Framerate ausgeben - Problem
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 08.06.2004, 14:56    Titel: Framerate ausgeben - Problem Antworten mit Zitat

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 Sad
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 Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 15:01    Titel: Antworten mit Zitat

Was klappt denn nicht?

Meine erste Vermutung ist, dass du wohl den DeviceContext(hDC) erst mit GetDC(oder so) erst initialisieren musst Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 15:24    Titel: Antworten mit Zitat

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...
Code:
GetDC(hDC)
?? geht auch net, gleicher Fehler und die Frames werden immer noch net angezeigt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 15:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 16:01    Titel: Antworten mit Zitat

Begin und End-Funktion? Nee, sowas hab ich nicht Surprised

Die Funktion render kann ich ja ausführen, die Rechtecke werden ja wie gesagt angezeigt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

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

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 16:23    Titel: Antworten mit Zitat

Jo, also habs denk ich gefunden, da steht
Code:
HDC GetDC(HWND hWnd)


Hab alles mögliche probiert...versteh das nicht Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 16:31    Titel: Antworten mit Zitat

GetDC gibt den DeviceContext zurück.
Also sollte man den nicht als Parameter verwenden
Code:
GetDC(DC)


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 Wink
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 16:40    Titel: Antworten mit Zitat

Nun gehts Smile
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 Smile

Und dann noch eins *g*
Die Frames werden jetzt auf weißer Hintergrundfarbe ausgegeben, wie kann ich denn den Hintergrund ändern?

Gruß
Thomas Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 16:48    Titel: Antworten mit Zitat

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 Smile

Indem du den Hintergrund wie bei den Rechtecken mit einem großen, farbigen Rechteck vor den anderen Zeichenoperationen(z.B. TextOut) füllst. Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 16:55    Titel: Antworten mit Zitat

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. Wink


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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 21:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 21:32    Titel: Antworten mit Zitat

Das geht ja net, da ändert er ja irgendwie nur die Hintergrundfarbe vom Bildschirm aber net den, wo die Framrate reingeschrieben wird Sad

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 08.06.2004, 23:02    Titel: Antworten mit Zitat

All sowas kann man in der Dokumentation finden:
Code:

   SetBkMode(hDC, TRANSPARENT);

_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 08.06.2004, 23:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL 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