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

goldfisch007

Alter Hase

  • »goldfisch007« ist der Autor dieses Themas

Beiträge: 446

Wohnort: Süden von Berlin

  • Private Nachricht senden

1

11.04.2009, 19:25

Variable stetig hochzählen

Hey ich melde mich hier heute zum erstenmal mit nem Problem.
Ich bin noch ein C++ neuling (zur hälfte durch das Buch von Heiko Kalista), sitze aber aktuell an einem kleinen Textbasierten Game in der Konsole, bei dem ich nun stetig eine Gold -Variable hochzählen möchte(weil eine mine xGold pro Sekunde produziert). Und jetzt bin ich schon seit längerem am überlegen wie man das realisieren könnte....
Zu erst dachte ich das man dafür eine Funktionschreiben könnte, die die variable hochzählt, die stettig im hintergrund des programms läuft (sozusagen als eine Schicht des programmes und die Ausgaben des programmes wären dann eine Schicht höher) aber ich hab nichts gefunden wie das gehen sollte. Dann dachte ich das man zuerst die Goldfunktion startet(die die variable hochzählt) und dann halte die Spielfunltion aber das ging auch nich so wirklich ...

und jetzt wollte ich dazu mal von euch einen rat haben, wie ihr das realisieren würdet und ob mein Ansatz komplett verrückt ist oder ob ich da nen Denkfehler drin habe...

danke für antworten
goldfisch007

2

11.04.2009, 19:36

Willkommen im Forum goldfisch007!

Bzw. willkommen bei den Aktiven (bist ja schon 'ne Zeit angemeldet).

Mit Schichten meinst du wahrscheinlich Threads, Prozesse die paralell zum Hauptprogramm laufen. Das zu realisieren dürfte für einen Neuling schwer werden.

Ich würde mir eine Klasse Goldmine anlegen.
Wenn du noch nicht fit im Umgang mit Klassen bist, dann tuts vielleicht ein struct.

In der Hauptschleife (Gameloop) des Programms kannst du jeweils Eingaben und Bedingungen prüfen und den "Goldzähler" entsprechend erhöhen.
Zusätzlich dazu brauchst du eine Funktion, die die Zeit seit dem letzten Schleifendurchlauf berechnet.
fka tm

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

3

11.04.2009, 19:40

du solltest zuerst einmal irgendwo die zeit herbekommen, die du für die berechnung eines "frames" benötigst... dann setzt du einfach deine variablen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
float gold = 0.0f;
float goldpersecond = 5.0f
float time;

while (true)
{
time = GetFrameTime(); // <---- hierfür musst du irgendwas passendes finden...

gold += goldpersecond * time;
}

keine ahnung, ob es das ist, was du suchst, aber so macht man das normalerweise

goldfisch007

Alter Hase

  • »goldfisch007« ist der Autor dieses Themas

Beiträge: 446

Wohnort: Süden von Berlin

  • Private Nachricht senden

4

13.04.2009, 23:45

hey cool danke für die antworten.
heute kam mir die Idee ne klasse Cressis zu erzeugen
und dann eine instanz dieser Klasse
Gold erstellen die im Konstruktor das gold hochzählt
und wenn man diese Instanz bis zum ende des programms
offen lässt zählt sie dann nicht auch das gold hoch bis die beenden eingabe kommt dann den destruktor der instanz aufrufe?
Wir bauen auf und reißen nieder, so ham wir Arbeit ima wieder...
--------------------
http://www.piratenpartei.de/tmp/images/Slogans_5_0.png
--------------------
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender, geklaut von Helmut xD)

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

5

14.04.2009, 00:19

Also vielleicht solltest du nochmal etwas weiter vorne bei den Grundlagen anfangen... Solange du keine Threads benutzt kannst du den konstruktor einer instanz nicht parallel zu deinem Programm laufen lassen xD

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

6

14.04.2009, 01:17

Der Konstruktor wird ein einziges mal beim Instanzieren der Klasse aufgerufen, ist also nicht dafür geeignet.

Du kannst aber deiner Klasse einfach eine Update Funktion spendieren, die die vergangene Zeit seit dem letzten Frame erwartet.

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

7

14.04.2009, 09:29

Ob er für das Hochzählen eine Klasse verwendet oder nicht, ist relativ egal...
Was er aber in jeden Fall braucht, und das scheint noch nicht ganz verstanden worden zu sein, ist eine "Endlos-"schleife, die die ganze Zeit läuft während das Programm läuft. In dieser Schleife machst du dann einfach alles.
Jetzt nimmst du einmal am Anfang der Schleife die Zeit, und einmal am Ende. Dann berechnest du die Differenz dazwischen und mit diesem Wert musst du dann beim hochzählen "alles" multiplizieren, weil es sonst auf unterschiedlich schnellen Rechnern auch unterschiedlich schnell hochzählen würde. (Sie würde einfach schneller->öfter durchlaufen)
Jetzt kannst du wie K-Bal sagt auch eine Klasse fürs Hochzählen erstellen, und dieser dann eine UpdateMethode verpassen, welche du dann in jedem Schleifendurchlauf einmal aufrufst...

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

8

14.04.2009, 10:48

Zitat von »"n0_0ne"«

Ob er für das Hochzählen eine Klasse verwendet oder nicht, ist relativ egal...
Was er aber in jeden Fall braucht, und das scheint noch nicht ganz verstanden worden zu sein, ist eine "Endlos-"schleife, die die ganze Zeit läuft während das Programm läuft. In dieser Schleife machst du dann einfach alles.
Jetzt nimmst du einmal am Anfang der Schleife die Zeit, und einmal am Ende. Dann berechnest du die Differenz dazwischen und mit diesem Wert musst du dann beim hochzählen "alles" multiplizieren, weil es sonst auf unterschiedlich schnellen Rechnern auch unterschiedlich schnell hochzählen würde. (Sie würde einfach schneller->öfter durchlaufen)
Jetzt kannst du wie K-Bal sagt auch eine Klasse fürs Hochzählen erstellen, und dieser dann eine UpdateMethode verpassen, kannst das aber auch ganz normal über globale Variablen oder so machen.
Du könntest dir auch eine CGame Klasse basteln, in der dann diese Schleife läuft, z.B. CGame::Run() und dann nicht mehr mit Globalen Variablen arbeiten, sondern mit privaten variablen der CGame klasse... oder du gibst CGame eine Membervariable vom Typ CResourceManager...
Wie du siehst hast du also etliche Möglichkeiten, was du machst ist Geschmackssache... allerdings wirst du als Anfänger erstmal nicht um die Spielschleife herumkommen, wobei das aber auch eine absolut sinnvolle Lösung ist! :)


Ähm, sorry, das klingt für mich nach vielen Dingen, die du irgendwie mal aufgeschnappt hast und jetzt irgendwie wieder zusammensetzt. Meiner Meinung nach ist dieser Post nicht sehr wertvoll.

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

9

14.04.2009, 12:04

Konstruktive Kritik FTW... was ist falsch daran, was ich geschrieben habe?
Ich meinem Spiel funktioniert das alles in etwa so, wie ich es beschrieben habe. Eigentlich wollte ich ihm aber nur klarmachen, dass er für das Hochzählen eine Schleife braucht, und dafür keine parallel laufenden Konstruktoren verwenden sollte/kann....

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

10

14.04.2009, 12:15

Zitat von »"n0_0ne"«

Konstruktive Kritik FTW... was ist falsch daran, was ich geschrieben habe?
Ich meinem Spiel funktioniert das alles in etwa so, wie ich es beschrieben habe. Eigentlich wollte ich ihm aber nur klarmachen, dass er für das Hochzählen eine Schleife braucht, und dafür keine parallel laufenden Konstruktoren verwenden sollte/kann....


Ich hab es mir jetzt noch ein paar mal durchgelesen und es stimmt schon, was du sagst. Der Post ist aber sehr wirr geschrieben ;)

Werbeanzeige