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

Anonymous

unregistriert

1

07.05.2005, 01:19

Anfängerfrage: Zeiteinteilung

Ich bin grade dabei eine simulation ala Fussball-manager zu machen, allerdings ohne Grafik.
Solche Spiele habt ihr sicher schon mal gesehen, gibt viel shareware davon (Taxiunternehmen usw.)

Nachdem ich ein bisschen rumgebastelt habe, kam schnell die erste schwierige Frage: Wie mache ich Zeit?

Gibt es da eine Grundlegende (allgemeine!) Möglichkeit, auf die ich noch nicht gekommen bin? Wahrscheinlich bin ich nur zu blöd :angel:

Lukaro

PS: Das billard ist echt klasse, wie ist das denn z.B. da mit der Zeit/Geschwindigkeit der Kugeln gelöst? Ich denke mal nicht, dass der Speed von der CPU abhängt ???

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

07.05.2005, 09:33

Also, man kann das auf verschiedene Seiten lösen.
Du kannst zum Besipiel das Bild darstellen (entfällt bei dir ja) und dann die Zeit messen, die vergangen ist um das Bild zu zeichnen. Diese Zeit kannst du dann in deine Bewegungen mit einberechnen.

Beispiel:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
DWORD Div;

Render()
{
DWORD Anfang, Ende;

Anfang = Stoppe_Zeit();
Zeichne_ein_schönes_Bild();
Ende = Stoppe_Zeit();

Div=Ende - Anfang;
}

Und dort wo du etwas bewegst ... (oder in deinem Fall berwechest, oder iregndwo eben wo es gebraucht ist)

Quellcode

1
2
3
4
5
6
7
8
Move()
{
DWORD Anfang, Ende;

// Objekt soll sich 5 einheiten nach Rechts bewegen
Bewegung_x = Div * 5;

}


Der Effekt, das Objekt bewegt sich 5 Einheiten, wenn viel Zeit vergangen ist, also ne langsame CPU dann bewegt er sich schneller (Div ist größer), sonst eben langsamer, d.h. in der gleichen Zeit die gleiche Strecke

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

3

07.05.2005, 11:59

Besser ist, wenn Du die Zeit nicht nur beim Zeichnen berechnest, sondern allgemein pro Frame, also jedes Mal wenn Deine Move Funktion neu aufgerufen wird misst du die Zeit seit dem letzten Aufruf... so hast du die gesamte Zeit die vergangen ist, falls das bewegen ebenfalls noch die CPU belastet.

Anonymous

unregistriert

4

07.05.2005, 11:59

hmm, aber wenn das abhängig von der cpu ist, dann ist es ja blöd *g*

wie könnte man es z.b. so machen, dass zwei spieler mit unterschiedlicher geschwindigkeit (einer 5 m/s, einer 10) rennen?

(Ich nehme mal allgemeinen "Code")

Quellcode

1
2
3
4
5
6
7
8
$time = timestamp;

while (game_on) {
 if ($time = timestamp+1) {
  $time = timestamp;
  spieler1=x+5;
  spieler2=x+10;
}}


Oder was ist so die grundlegende Programmschleife?
Etwa doch nicht die Zeit?

Lukaro

PS: Ich hab keine ahnung, wie überhaupt so ein spiel aufgebaut ist, habe nichts bei google und auch kein grundlegendes prinzip hier im Forum enddeckt. Hat vielleicht jemand ein "tutorial", oder ein Forum wo man nicht sofort völlig verwirrt wird ? ;)

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

5

07.05.2005, 12:17

Nein, da du es abhängig von der vergangenen Zeit machst, ist es CPU und damit Geschwindigkeitsunabhängig:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
Move()
{
static float neueZeit;
static float alteZeit;
float fSekunden;
alteZeit = neueZeit; //neueZeit ist noch die Zeit vom letzten Frame

nimmZeit(neueZeit); //das ist die aktuelle Zeit

fSekunden = neueZeit - alteZeit //das ist also die vergangene Zeit seit dem letzen Frame


Spieler1.PosX += 5 * fSekunden //Spieler1 bewegt sich auf der X-Achse 5 Einheiten/Sekunde

Spieler2.Posx += 10 * fSekunden //entsprechend

}


Das ist deine Move-Funktion. Diese wird in deiner grundlegenden Programmschleife aufgerufen. Du siehst das sich die Spieler immer 5, bzw 10 Einheiten pro Sekunde bewegen. Ist fSekunden kleiner als 1, also ist weniger als 1 Sekunde vergangen bewegenen sie sich entsprechend weniger, ansonsten schneller.

Deine grundlegende Programmschleife sieht so aus:
(nach Davids Buch 1. Auflage S. 7)

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
MSG Messge; //Windows-Nachricht


//Spiel initialisieren:

Init();

//grundlegende Nachrichtenschleife:

ZeroMemory(&Message, sizeof(MSG)); //Achtung das ist Bestandteil der TriBase Engine, also kein C++ Standard. Sollte aber auch nicht zwingend notwendig sein.

while(Message.message != WM_QUIT)
{
    //Nachrichten verarbeiten:

    while(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }

    Move(); //Das ist deine Move-Funktion


    Render(); //Hier würde die Render-Funktion zum Zeichnen kommen

}

ExitGame(); //Der Benutzer hat das Programm beendet, die Schleife wird verlassen und das Game kann geschlossen werden (Speicher freigeben)

Anonymous

unregistriert

6

07.05.2005, 12:36

danke, das wird mir schon mal weiterhelfen :)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

7

07.05.2005, 13:13

SpikeEvil hat Recht! Natürlich ist es besser so! :P

PD

unregistriert

8

07.05.2005, 16:16

Zur Hauptschleife ist zu sagen: Die ist so oft auszuführen wie möglich ;) Also kein "wenn 1 sekunde vergangen ist mache das und das" ;) Ein durchlauf deiner Hauptschleife (while(game_on)) ist das was du in einem Spiel unter Frame verstehst :) Und die Anzahl der durchläufe dieser Schleife pro Sekunde ist deine FPS (Frames per second).

Also darfst du die FPS net deiner Bewegung anpassen sondern umgekehrt. Du musst also alles unter dem gesichtspunkt der "Zeit pro Frame" machen. Und das ist das was dir oben versucht wurde zu erklären ^^

Anonymous

unregistriert

9

07.05.2005, 17:43

@alle, besonders aber an PD
also sind frames immer gleichlang?

und was für eine zeit sollte ich nehmen?
sind 50ms okay, oder muss ich dann mit "stau" und damit ungenauigkeiten rechen?

// Edit
moment mal, das ist ja falsch :o

die frames sind also einfach nur eine while-schleife die immer (bis aufs beenden) läuft?

steigt dann nicht die cpu-last auf 100, wenn der dann so schnell berechnet, wie er kann?

und wenn man das in deinem style macht, muss man dann am anfang des Spiels nicht erst einmal gucken wieviel fps so "laufen" um darauf die bewegungen anzupassen?

// Edit
ahh, jetzt verstehe ich auch spike.
das heißt fSekunden ist die dauer eines Frames.
und wieso

C-/C++-Quelltext

1
Spieler1.PosX += 5 * fSekunden //Spieler1 bewegt sich auf der X-Achse 5 Einheiten/Sekunde 
?
Ist "fSekunden" nicht deutlich weniger als eine Sekunde?
Fragen über Fragen...

Lukaro

PS: was lernen wir aus diesem Post:
1. erst nachdenken dann schreiben
2. wenn man es so nicht versteht hilft es, sich selbst fragen aufzustellen und diese dann versuchen zu beantworten
3. alles aufschreiben, dann kann mans besser verstehen

(Ich hoffe ich nerve nicht :-) )

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

10

07.05.2005, 19:12

^^

Also fSekunden ist normalerweise auch immer deutlich weniger als 1, ich habe nur versucht dir zu erklären wie damit gerechnet wird. Und: ja, ein Spiel läuft immer auf Volllast (außer es ist minimiert)... Deswegen kannst Du zB nicht auf einer LAN gamen und dabei mit guter Downloadrate rechnen während du ziehst.

Werbeanzeige