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

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

1

29.05.2011, 21:38

Parameterübergabe - Nichtdeklarierter Bezeichner?!

Halli Hallo,
Ich habe ein Problem, mit der Parameterübergabe und zwar:

Es gibt in dem Spiel ein Spielerraumschiff und einen Asteroiden. Die Init Funktion des Asteroiden wird mit 3 Parameter aufgerufen: pSpriteAsteroid, static_cast<float>(XPos), -60.0f

Die Initfunktion des Spielers meiner Meinung nach eigentlich so: : pSpritePlayer, 376.0f, 520.0f (Das ist die Startposition)

Aber der Compiler sagt zum erstem Parameter: Nichtdeklarierter Bezeichner!.... Was soll ich denn da sonst angeben... ich meine beim Asteroiden klappts ja auch!

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

29.05.2011, 21:44

Gewagter Post, ohne Code.
Mal geprüft, ob pSpritePlayer == NULL ist?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

3

29.05.2011, 21:50

Ja, aber da stürtzt nur das Programm ab.. ich hätte auch mit Code gepostet, nur wusste ich nicht, was ich von diesem riesen Code posten soll.... Vllt. hilft das ja:

// Neuen Spieler initialisieren
m_pPlayer = new CPlayer;
m_pPlayer->Init (NULL, 376.0f, 520.0f);
m_pPlayer->Reset ();

...

// Asteroid initialisieren
Asteroid.Init (m_pSpriteAsteroid, static_cast<float>(XPos), -60.0f);

Soo und hier die Init Funktionen vom Spieler und Asteroiden:

void CPlayer::Init (CSprite *pSpritePlayer, float fXPos, float fYPos)
{
// Spielersprite erstellen
m_pSpritePlayer = new CSprite;

// Zeiger auf Sprite kopieren und Koordinaten setzen
m_pSpritePlayer = pSpritePlayer;
m_fXPos = fXPos;
m_fYPos = fYPos;

// Rect initialisieren
m_Rect.x = static_cast<int>(fXPos);
m_Rect.y = static_cast<int>(fYPos);
m_Rect.w = pSpritePlayer->GetRect().w;
m_Rect.h = pSpritePlayer->GetRect().h;

...

void CAsteroid::Init (CSprite *pSpriteAsteroid, float fXPos, float fYPos)
{
// Zeiger auf Sprite kopieren und Koordinaten setzen
m_pSpriteAsteroid = pSpriteAsteroid;
m_fXPos = fXPos;
m_fYPos = fYPos;

// Animation beginnt beim ersten Einzelbild
m_fAnimPhase = 0.0f;

// Rect initialisieren
m_Rect.x = static_cast<int>(fXPos);
m_Rect.y = static_cast<int>(fYPos);
m_Rect.w = pSpriteAsteroid->GetRect().w;
m_Rect.h = pSpriteAsteroid->GetRect().h;

...

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

29.05.2011, 21:54

C-/C++-Quelltext

1
2
3
4
5
// Spielersprite erstellen
m_pSpritePlayer = new CSprite;

// Zeiger auf Sprite kopieren und Koordinaten setzen
m_pSpritePlayer = pSpritePlayer;

In der zweiten Nichtkommentar-Zeile liegt das Problem. Du erzeugst ein Memoryleak weil du den Zeiger auf den eben angeforderten Speicher überschreibst.
Vielleicht meintest du das:

C-/C++-Quelltext

1
*m_pSpritePlayer = *pSpritePlayer;

Vermutlich reichts aber schon, wenn du die Zeile einfach auskommentierst und den Parameter entfernst.

Der Hintergrund ist der: Du verwendest ein einziges Sprite für alle Asteroiden. Das Sprites und das Image des Spielers wird aber nur einmal verwendet, weshalb er es selbst erzeugen kann.
Es reicht halt nicht einfach den Code zu kopieren, ohne ihn zu verstehen. ;)
Ich empfehle dir die SFML anzuschauen, damit ein paar kleine Programme zu schreiben, dir das Buch in 1-2 Wochen nochmal anzuschauen(alle Kapitel durchgehen und schauen ob du noch alles weißt) und ein Nachschlagewerk durchzuarbeiten.
Wahrscheinlich ist es auch sinnvoll noch ein paar Programme in der Konsole zu schreiben.
"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« (29.05.2011, 22:02)


Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

5

29.05.2011, 22:04

Also wenn ich
*m_pSpritePlayer = *pSpritePlayer;
statt
m_pSpritePlayer = pSpritePlayer
schreibe und die Parameter weglasse meckert er trotzdem...
und wenn ich die Parameter nicht weglasse und wieder NULL nehme, stürtzt das Programm ab -_-*

Ich verstehs einfach nicht... Warum gehts so einfach bei der Asteroid Init und so schwer bei der Player Init???

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

6

29.05.2011, 22:10

Der Code steht doch im Buch.
Hast du die Zeile mal einfach auskommentiert? NULL übergeben ist blödsinn. Ignorier was Architekt geschrieben hat, er hat da was falsch verstanden und meinte auch was anderes.
"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?

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

7

29.05.2011, 22:13

Okay, danke erstamal für deine Gedult ;)

Ja, klar steht der Code im Buch, aber ohne diesen ganzen Rects... ich wollte eig. nur ein neues Rect für den Spieler initialisieren... und im Buch wird such kein Parameter in der Init funktion übergeben...

Ich bin erst seit einigen Tagen feritg mit dem Buch und wollte halt versuchen das Spiel mit dem was ich weiß zu erweitern.. Ich bin neu und weiß gar nicht was die SFML ist ?(

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

8

29.05.2011, 22:17

Das Rect kannst du am Ende der Reset Methode initialisieren. Diese einfach am ende der Init Methode aufrufen und fertig. Parameter brauch der Spieler nicht, weil er seine Position in der Reset Methode selbst fest legt.
"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?

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

9

29.05.2011, 22:21

:O

ookay... Vorhin hat mir jemand im Forum gesagt in der Update Methode... Aber okay... Vielen Dank für die Hilfe... Ich werd mich dran machen ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

10

29.05.2011, 22:23

In der Updatemethode ebenfalls. Das Rect sollte aber Initialisiert werden, sonst würde man falsche Daten bekommen wenn man vor dem ersten Update drauf zugreift.
"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?

Werbeanzeige