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

1

09.05.2010, 16:03

Speed der Asteroiden via Timer regulieren (SDL Spiel, Kapitel 12)

Hi
ich möchte das Spiel erweitern und zwar so,dass die Geschwindigkeit der Asteroiden abhängig von der Spielzeit gemacht wird. (je länger desto schneller).
Dazu habe ich in der Timer Klasse einen Zeiger auf dem Heap angelegt , der die Bisherige Spielzeit enthält.
Er wird im Konstruktor vom Timer mit 0.0f initialisiert und durch += m_fElapsed in der Funktion Update geupdatet.
Wenn ich ihn in der Update funktion des Timers deferenziere zeigt er immer das richtige an.
Wenn ich ihn allerdings in der funktion Asteroid::Update Deferenziere zeigt er mir immer den Wert an, mit dem er im Konstruktor der Time Class initialisiert wurde.. kann mir jemand sagen woran das liegt?bzw was ich ändern muss, damit ich ihn auch in der Asteroidenfunktion richtig deferenzieren kann?
Was mich stutzig macht ist, dass der Zeiger in der Asteroiden funktion verfügbar ist (keinen error und auch keine Zahlen im Stile von -1227238e) aber dort immer den wert ausgibt mit dem er im Konstruktor initialisiert wurde und dann nicht geupdatet wird.

so sieht das ganze aus
Timer.hpp

class CTimer : public TSingleton<CTimer>
{
public:
CTimer ();
void Update ();
float GetElapsed () {return m_fElapsed;}
float *pLevel;
....

Timer.cpp
CTimer::CTimer ()
{
// Initialisierung
m_fCurTime = 0.0f;
m_fLastTime = SDL_GetTicks() / 1000.0f;
m_fElapsed = 0.0f;
pLevel=new float;
*pLevel = 1.0f;
}

// Update
//
// Aufgabe: Timer updaten
//
void CTimer::Update ()
{
// Vergangene Zeit seit dem letzten Frame berechnen
m_fCurTime = SDL_GetTicks() / 1000.0f;

m_fElapsed = m_fCurTime - m_fLastTime;
m_fLastTime = m_fCurTime;
*pLevel+=m_fElapsed;
cout<<*pLevel<<endl; //HIER WIRD DER WERT AUSGEGEBEN DEN ICH ERWARTE

} // Update

AsteroidenFunktion:
void CAsteroid::Update ()
{
cout<<*Level<<endl; //Und hier wird konstant der wert ausgegeben, den ich im Konstruktor angegeben habe ????????
// Asteroid bewegen
m_fYPos += 200.0f * g_pTimer->GetElapsed ();


......


mfg

2

09.05.2010, 16:19

Was ist Level für eine Variable? Wo kommt die her? Wie wurde sie initialisiert?
Den pLevel Pointer könntest du dir auch aus der Timer Klasse mit Hilfe einer Methode zurückgeben lassen.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

09.05.2010, 19:13

wenn gibst du den speicher von float *pLevel wieder frei? wieso nutzt du dynamische speicherverwaltung?

die rundenzeit sollte man von der Level bzw. Spieleklasse verwalten lassen. du könntest dir auch eine kleine stopuhrklasse schreiben. wenn du solche dinge immer von der timerklasse verwalten lässt ist sie nach einem monat arbeit 500zeilen lang, du hast sehr viel code doppelt und kannst sie in keinem anderen projekt benutzen.

edit: achja willkommen im forum. wenn du ernsthaft programmieren willst reicht das buch von haiko kallista, da es nur eine einführung ist, leider nicht. hast du schon ein gutes nachschlagewerk? meiner meinung nach sind das die besten: C++ von A bis Z der C++ programmierer und The C++ Programming Language(wenn das, dann unbedingt auf englisch)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »NachoMan« (11.01.2011, 21:55)


Beiträge: 774

Beruf: Student

  • Private Nachricht senden

4

09.05.2010, 19:33

Ach paperlap ich hab das Buch vom Kallista gelesen und das hat mir vollkommen als Grundlage gereicht. Nachschlagewerk ist das Internet auch.
Klar, schaden kanns sicher nicht.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

09.05.2010, 19:44

das kann man nicht vergleichen. natürlich kann man da schon programmieren. trotzdem gibt es tipps ohne ende und man lernt wesentlich schneller sauberen code zu schreiben. ich bin sehr froh eins gehabt zu haben. ich hab mir sogar ein zweites gekauft weil das besser ist.
ein nachschlagewerk kann man durcharbeiten, das internet eher nicht xD(ich nenn es nur nachschlagewerk. man sollte es trotzdem komplett durchlesen)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

jokester

Treue Seele

Beiträge: 125

Wohnort: Mainz

  • Private Nachricht senden

6

10.05.2010, 17:16

meiner meinung nach sind das die besten: C++ von A bis Z und The C++ Programming Language(wenn das, dann unbedingt auf englisch)
C++ von A bis Z ist das zweitschlechteste Buch, das ich jemals gelesen hab. Schlechter war nur C von A bis Z vom selben Autor. Einige Leckerbissen daraus zum Facepalmen:
Der Autor hat C-Strings nicht verstanden. Regelmäßig schreibt er str[sizeof(str)] = '\0' um die Nullterminierung zu setzen. Regelmäßig heißt: Es ist im ganzen Buch nicht ein einziges mal richtig.
Der Autor hat C++ nicht verstanden. Er bringt so z.B. Mensch mensch2 = mensch1; als Beispiel, in dem angeblich operator= aufgerufen wird.
Der Autor hat OOP nicht verstanden, scheint Schüler bei Herrn Bebel gewesen zu sein. So sind Würste und Brote Supermärkte, und ein Wurstbrot ist angeblich eine Wurst. Man könnte die Liste fast ewig weiterführen...
"There is a theory which states that if ever anyone discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable. There is another theory which states that this has already happened" -- Douglas Adams.

7

10.05.2010, 18:03

Ok..
Vielen Dank erstma für die Antworten.
Nun aber zurück zu meinem Problem.
Auf die Zeigervariante bin ich eigentlich erst gekommen, nachdem das "normale" nicht funktioniert hat.
Anfangs hatte ich eine Klassenmethode zum zurückgeben der Zeit aber da hatte ich genau das Selbe Problem. Beim Ausgeben in der Klasse CTimer (z.b in der Funktion Update) bekam ich das richtige Resultat, beim Aufruf der Funktion in der Funktion CAsteroid::Update bekam ich dann wieder nur das Resultat, mit welchem die Variable im Konstruktor der Timerklasse initialisiert wurde ..?

8

10.05.2010, 18:29

Wie wärs, wenn du mal unsere Fragen beantwortest? Wie sollen wir dir sonst helfen?
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

9

10.05.2010, 19:10

wo zeigt dein Level Zeiger hin ?

edit : ach kacke das war ja die erste frage von -insane- :rolleyes:
New Project: Operation CityRacer

Werbeanzeige