JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Timer + Timescale

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 08.07.2004, 16:12    Titel: Timer + Timescale Antworten mit Zitat

Ich habe da grad ein so blödes Problem und denk schon denn ganzen Tag drüber nach.

Ich habe mir eine Timerklasse geschrieben, in der ich einen Timer mit Start() starten, Stop() stoppen und mit GetStatus() auslesen kann. (weiter unten gibts den Code)

In den Resourcenmanager habe ich eine Variable Timescale eingebaut, die die Framerate modifiziert zurück gibt. (return Framerate * (1 / timescale))

Nun wollte ich dass der Timer von der timescale Variable 'dynamisch' verändert wird.

Hier der Header der Timer:
Code:
class CTimer
{
   
public:
   
   CTimer();
   void SetIntervall(int Intervall);
   void Start(void);
   void Stopp(void);
   int GetTime(void);
   bool GetStatus(void){return m_GetStatus();};
   
protected:
   
   bool m_GetStatus(void);
   
   bool m_Started;
   
   // Intervall
   __int64 m_Intervall;
   
   // Frequenz des Counters
   __int64 m_Frequency;
   
   // Zählerstand bei dem der Timer stoppt
   __int64 m_TargetCount; 
};


Hier der Body:
Code:
CTimer::CTimer()
{
   // Frequenz speichern
   QueryPerformanceFrequency((LARGE_INTEGER*)&m_Frequency);
   m_Intervall = m_Frequency;
   m_Started = false;
}

void CTimer::SetIntervall(int Intervall)
{
   m_Intervall = (Intervall * m_Frequency) / 1000;
}

void CTimer::Start(void)
{
   // aktueller Zählerstand
   __int64 CurCount;
   
   if(m_Started)
      return;
   
   m_Started = true;
   
   // aktuellen Zählerstand Zeit speichern
   QueryPerformanceCounter((LARGE_INTEGER*)&CurCount);
   
   m_TargetCount = CurCount + m_Intervall;
}

void CTimer::Stopp(void)
{
   m_Started = false;
}



bool CTimer::m_GetStatus(void)
{
   // aktueller Zählerstand
   __int64 CurCount;
   
   //Prüfen ob der Timer aktiv ist
   if(m_Started)
   {
      // aktuellen Zählerstand Zeit speichern
      QueryPerformanceCounter((LARGE_INTEGER*)&CurCount);
      if(abs(m_TargetCount) - abs(CurCount)  <= 0)
      {
         Stopp();
         Start();
         return true;
      }
   }
   return false;
}

int CTimer::GetTime(void)
{
   // aktueller Zählerstand
   __int64 CurCount;
   
   
   //Prüfen ob der Timer aktiv ist
   if(m_Started)
   {
      // aktuellen Zählerstand speichern
      QueryPerformanceCounter((LARGE_INTEGER*)&CurCount);
      
      return (m_Intervall - abs(m_TargetCount - CurCount)) / (m_Frequency / 1000);
   }
   return 0;
}

_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
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: 08.07.2004, 16:28    Titel: Antworten mit Zitat

OK: Wo ist das Problem? Stürtz das Prog ab, oder macht es nicht was es soll oder was? Wie wärs mit einer etwas genauerne Fehlerbeschreibung?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.07.2004, 16:29    Titel: Antworten mit Zitat

Was ? Confused
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 08.07.2004, 16:49    Titel: Antworten mit Zitat

Zitat:
Nun wollte ich dass der Timer von der timescale Variable 'dynamisch' verändert wird.


edit: um es etwas genauer zusagen:
Ich wollte in meinem Spiel eine Verlangsamungstaste einbauen, sobald man auf diese drückt verlangsamt sich das Spiel. Wenn man sie wieder loslässt ist es wieder normal schnell. Wenn ich jetzt einen Timer auf z.B. 5 sek einstelle und wenn während dieser Zeit jemand auf die Verlanglangsamungstaste drückt soll der Intervall des Timers auch länger andauern.

Man könnte das Problem natürlich so lösen das eine Varioable jede Millisekunde inkrementiert wird. und man halt mit wenn sich die timescale verändert den Inkrementiertwert entsprechend verändert. Allerdings finde ich diesse Methode sehr ungenau, da das Spiel wahrscheinlich auf den meisten Rechnern nur mit 60fps laufen wird (wegen v-sync).
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.07.2004, 17:08    Titel: Antworten mit Zitat

FallenAngel84 hat Folgendes geschrieben:
Was ? Confused
^^
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 08.07.2004, 17:27    Titel: Antworten mit Zitat

ok. Wie mist du die Zeit?
Mit der Methode aus dem buch? Wenn du dort imer durch Framerate teilst musst du ahlt durch (Framerate*2) teilen. Also am besten immer statt
Code:

/Framerate;

lieber
Code:

/(Framerate/Spielgeschwindigkeit);

benutzen. Speilgeschwindigkeit ist dann z. B. 0.5 für halbe und 2 für doppelte Geschwindigkeit.
Kapiert?[/code]
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 08.07.2004, 17:31    Titel: Antworten mit Zitat

Das Timescale für das normale Spiel tut ja.

wenn ihr euch http://people.freenet.de/the7thson/download/FSSPong.rar runterladed und in der ini datei die zeile timescale verändert tut es ja, aber die Zeitmessungen sind immer noch unabhängig von timescale.

edit: ahh shit falsche version oben ich lad kurz eine hoch

edit: neue version oben
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
sp3cK-r0LL3
Senior JLI'ler


Alter: 34
Anmeldedatum: 18.06.2004
Beiträge: 275

Medaillen: Keine

BeitragVerfasst am: 09.07.2004, 13:47    Titel: Antworten mit Zitat

also das Problem ist folgendes (für die, die es immernoch nicht verstanden haben):

es geht darum, dass bei dem Spiel (in dem Fall Pong) ein Spielmodus eingebaut wurde (Domination), dass man wie bei UT zwei DominationPunkte besetzen muss, und dann fängt ein Timer an, herunterzuzählen. Er braucht 5 Sekunden und dann bekommt ein Spieler den Punkt, insofern der Gegner ihm nicht einen der beiden DPunkte geklaut hat. Er hat also dazu 5 Sekunden Zeit. Das Problem ist: wenn jemand währenddessen die Timescale/Zeitlupe - Taste drückt, die Peacekiller vorhat, einzubauen, läuft ja der Timer trotzdem nur 5 Sekunden lang, also ist das für den Gegner unfair, da er keine Zeit mehr hat dem anderen einen DPunkt abzuluchsen. Wie kann man das Problem so lösen, damit wenn man auf die Timescale-Taste geht, der Timer auch langsamer läuft, also 10 Sekunden etc.
Aber warum das nicht mit (Countdown/2) geht, versteh ich auch noch nicht Wink
_________________
sex is updatedb; locate; talk; date; cd; strip; look; touch; finger; unzip; uptime; gawk; head; apt-get install condom; mount; fsck; gasp; more; yes; more; umount; apt-get remove --purge condom; make clean; sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 10.07.2004, 11:46    Titel: Antworten mit Zitat

Das mit countdown*2 (so müsste es eigentlich heissen nicht /2) würde vielleicht schon klappen. Aber es gäbe das Problem wenn der spieler aud die timescale-taste drückt während der timer startet und sie wieder loslässt sobald er gestart wurde. (ich glaube ich prog mal ne demo um das problem zu veranschaulichen)
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

BeitragVerfasst am: 07.09.2004, 11:12    Titel: Antworten mit Zitat

So wie es in dem Beispiel aus dem 2. JLIBuch steht, kann man Framerates bis zu 75 Frames/sec messen (bei 75Hz). Wie kann man denn die Framerate unabhängig von der Hz-Zahl messen, damit man sehen kann, ob ein Programm auch 200 oder 300 Frames schafft?
_________________
Kein Rückzug! Kein Aufgeben!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 11.09.2004, 11:29    Titel: Antworten mit Zitat

LeeDiGer hat Folgendes geschrieben:
Wie kann man denn die Framerate unabhängig von der Hz-Zahl messen, damit man sehen kann, ob ein Programm auch 200 oder 300 Frames schafft?

Du könntest z.B. noch einen Counter einfügen, der Zählt, wieviele Frames in der minimal messbaren Zeit gezeichnet wurden 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
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 11.09.2004, 11:50    Titel: Antworten mit Zitat

Einfach vsync abschalten.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
LeeDiGer
Super JLI'ler



Anmeldedatum: 31.08.2003
Beiträge: 366
Wohnort: Duisburg
Medaillen: Keine

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

Und wie schaltet man vsync ab?
_________________
Kein Rückzug! Kein Aufgeben!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
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