Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 08.07.2004, 16:12 Titel: Timer + Timescale |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 08.07.2004, 16:28 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.07.2004, 16:29 Titel: |
|
|
Was ? _________________ "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 |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 08.07.2004, 16:49 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.07.2004, 17:08 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: | Was ? | ^^ _________________ "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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 08.07.2004, 17:27 Titel: |
|
|
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
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 |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 08.07.2004, 17:31 Titel: |
|
|
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 |
|
|
sp3cK-r0LL3 Senior JLI'ler
Alter: 34 Anmeldedatum: 18.06.2004 Beiträge: 275
Medaillen: Keine
|
Verfasst am: 09.07.2004, 13:47 Titel: |
|
|
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 _________________ 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 |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 10.07.2004, 11:46 Titel: |
|
|
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 |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 07.09.2004, 11:12 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 11.09.2004, 11:29 Titel: |
|
|
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 _________________ 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 |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 11.09.2004, 11:50 Titel: |
|
|
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 |
|
|
LeeDiGer Super JLI'ler
Anmeldedatum: 31.08.2003 Beiträge: 366 Wohnort: Duisburg Medaillen: Keine
|
Verfasst am: 11.09.2004, 15:24 Titel: |
|
|
Und wie schaltet man vsync ab? _________________ Kein Rückzug! Kein Aufgeben! |
|
Nach oben |
|
|
|