Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

12.08.2006, 12:31

[Timing] Konzeptfragen

Ich schreib mir grad eine Timing Klasse zusammen. Recht sinnig, damit komme ich endlich mal davon los das jede neue Klasse ihr eigenes Süppchen brockt. Desweiteren bringt das etwaige FrameUpdates etc an eine Stelle.

Ich habe nur ein paar Fragen wie man das angehen sollte, eh ich hier irgendwas großartig verbocke.

Bisher dachte ich mir das so:
Es gibt eine TimeManagement Klasse, diese könnte eine Singleton werden, muss aber nicht unbedingt sein. Beim hochfahren der "Engine" (*hust*) wird diese initialisiert. Möchte nun einen Objekt einen Timer anfordern nutzt es dazu eine "addTimer" (oder wie auch immer) Methode. Die Management Klasse liefert dann eine eindeutige TimerID zurück, mit welcher das anfordernde Objekt den Zeitzustand abfragen kann.

Soweit die Grundidee, nun frage ich mich wie ich das technisch umsetzen könnte.

Spontan dachte ich daran ein weiteres Timer Objekt zu erschaffen, welches dann von der Managementklasse in eine Liste gepusht wird. Die Managementklasse verfügt über eine "update" Methode, in welcher sie alle einzelnen Timer Objekte durchgeht und die Zeit hinzufügt. Wird eine Zeit angefordert geht sie auch alle Objekte durch bis sie das mit der richtigen ID findet.

Klingt für mich sehr unperformant. Es wäre doch klüger nur einmal die Framezeit zu aktualisieren, und zwar in der Management Klasse. Aber ... Ich denke ich hab ein Brett vorm Kopf, wie würde ich denn dann die Zeit nehmen?

In Pseudocode stell ich mir, bei der Benutzung der Klasse(n), etwa folgendes vor.

C-/C++-Quelltext

1
2
3
4
5
6
7
TimeManagement* = new CTimeManage();
int ID = TimeManagement->addTimer(GewünschteCountdownZeit = 30s);
TimeManagement->update(FrameTime);
if(TimeManagemt->Check(ID))
{
    MachWasTolles();
}

Etwas konfus, aber ich hoffe ihr versteht was ich meine xD

Wie kann ich es also umgehen für jedes "Child" Objekt einzeln eine addTime Methode aufzurufen? Ich schätze ich hab echt nur ein Brett vorm Kopf xD

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

2

12.08.2006, 14:19

Autsch, Problem gelöst ...

Die ManagementKlasse hält die Zeit seit Programmstart. Die Kinder kriegen eine Zeit seit Programmstart + gewünschte Zeit übergeben. Man war ich blind ^^

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

12.08.2006, 15:40

Ich hab die Ganze Klasse grad mal fertiggestellt, sie benutzt sich folgendermaßen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <Windows.h>
#include "../GurXite Space Shooter/src/Timer.h"

void theMainLoop(TimerManagement *timeManage, unsigned int iID);

int main(void)
{
    std::cout << "Wir erstellen einen Timer" << std::endl;

    // Die Management Klasse anlegen

    TimerManagement *timeManage = new TimerManagement();

    // Über diese einen Timer erstellen

    unsigned int TimerID = timeManage->addNewTimer(5000);

    std::cout << TimerID << std::endl;

    // Nur zu Testzwecken ^^ Könnte man auch ohne weitere Funktion erledigen

    theMainLoop(timeManage, TimerID);
}

void theMainLoop(TimerManagement *timeManage, unsigned int iID)
{
    // Wir trenten in eine "Spielschleife"

    while(true)
    {
        // Anfang der "FrameMessung"

        DWORD   dwRenderTime;
        dwRenderTime = GetTickCount();

        // Prüfen ob unser Timer abgelaufen ist

        if(timeManage->checkTimer(iID))
        {
            std::cout << "Timer alle!" << std::endl;
        }

        // Ende der "FrameMessung"

        dwRenderTime = GetTickCount() - dwRenderTime;

        // Diese Zeit übergeben wir an die Timer Klasse

        timeManage->update(dwRenderTime);
    }
}


Das ganze wird noch ein wenig ausgebaut, meine Frage ist eher ob das evtl ein Tutorial wert wäre?

Werbeanzeige