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

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

1

18.04.2010, 11:52

Probleme beim Erweitern von dem SDL Spiel

Hallo allerseits,
ich habe nun das Buch durch und habe mich ein bisschen daran versucht das SDL Spiel am Ende des Buches zu erweitern. Ich wollte als erstes eine Kollisionsdetektion zwischen den Asteroiden und dem Schiff schreiben.
Hier ist mal der Quelltext:

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
void CGame::CheckCollisionsPlayer ()
{

    list<CAsteroid>::iterator It = m_AsteroidList.begin ();

    SDL_Rect RectAsteroid;
    SDL_Rect RectPlayer;

    RectPlayer = m_pPlayer->GetPlayerRect ();

    while (It != m_AsteroidList.end () )
    {
        RectAsteroid = It->GetRect ();

        if (RectPlayer.y < RectAsteroid.y + RectAsteroid.h &&
            RectPlayer.y + RectPlayer.h > RectAsteroid.y &&
            RectPlayer.x < RectAsteroid.x + RectAsteroid.w &&
            RectPlayer.x + RectPlayer.w > RectAsteroid.x)
        {
            It->SetAlive (false);
            cout<<"Getroffen"<<endl;
        }
        if (It->IsAlive () )
            It++;
        else
            m_AsteroidList.erase (It);
    }
}

Es klappt auch alles. In der Konsole wird getroffen ausgegeben, abe kurz danach krieg ich einen Runtime error mit dem Inhalt list iterators incompatible. Ich kann mir vorstellen, dass es irgendetwas mit der Liste die ich benutzt habe zu tuen hat, aber habe keine Ahnung was es sein könnte.
Könnte mir vielleicht jemand helfen?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

18.04.2010, 13:23

beim erase wird der iterator ungültig.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

3

18.04.2010, 14:08

Ah danke. Funktioniert jetzt prima.

€: Sorry das ich schonw ieder um Hilfe bitte, aber ich hab schon wieder das nächste problem und bin mit meinem c++ am Ende.
Unzwar versuche ich die hp durch ein kreuz in de roberen linken ecke anzuzeigen, bloß das problem beginnt schon bei dem Laden von dem Sprite. Ich kriege folgenden Compilererfehler:

Quellcode

1
2
3
1>c:\projekte\asteroids\asteroids\player.cpp(175) : error C2065: 'm_pSpriteHealth': nichtdeklarierter Bezeichner
1>c:\projekte\asteroids\asteroids\player.cpp(175) : error C2227: Links von "->Load" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
1>      Typ ist ''unknown-type''

Hier mal die Klassendeklaration:

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
#ifndef PLAYER_HPP
#define PLAYER_HPP

#include <list>
#include "Sprite.hpp"
#include "Shot.hpp"

class CPlayer
{
public:
    CPlayer     ();
    void Init   ();
    void Quit   ();
    void Render ();
    void Update ();
    void Reset  ();
    void ManageHealth ();
    int GetHealth () {return Health;}
    void SetHealth (int NewHealth) {Health = NewHealth;}
    list<CShot> *GetShotList () {return &m_ShotList;}
    SDL_Rect GetPlayerRect ();

private:
    void ProcessMoving   ();
    void ProcessShooting ();
    void CheckPosition   ();

    CSprite *m_pSpritePlayer;
    CSprite *m_pSpriteShot;
    CSprite *m_pSpriteHealth;
    int Health;
    float m_fXPos;
    float m_fYPos;
    float m_fAnimPhase;
    bool m_bShotLock;
    list<CShot> m_ShotList;

};

#endif

und die Funktionsdefinition wo der Fehler auftritt:

C-/C++-Quelltext

1
2
3
4
void ManageHealth ()
{
    m_pSpriteHealth->Load ("Data/Health.bmp");
}

ICh weiß echt nicht was ich falsch gemacht habe, habe dreimal geguckt ob das richtig geschrieben ist.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ZIR« (18.04.2010, 14:36)


4

18.04.2010, 14:43

C-/C++-Quelltext

1
2
3
4
void CPlayer::ManageHealth ()
{
    m_pSpriteHealth->Load ("Data/Health.bmp");
}


Hast vergessen die Klasse anzugeben, in der sich die Methode befindet. ;)
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

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

5

18.04.2010, 15:01

ach shit, das vergess ich immer wieder-.-

little_Progger

Treue Seele

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

6

18.04.2010, 16:35

wo setzt du den überhaupt die Postition des Sprites?

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

7

18.04.2010, 16:44

Da noch gar nicht. Ich habs aber nachdem das funktionierte gemacht.
Aber jetzt nochmal ne Frage (Ja ich weiß, dass ich viele nervige Fragen stelle). Ich habe das jetzt mit einem Sprite zum Laufen gekriegt, möchte aber drei davon haben. Dafür habe ich mir ein Array von Zeigern auf Sprites erstellt und versuche nun so wie im nachfolgenden Quelltext das umzusetzen.

C-/C++-Quelltext

1
CSprite *m_pSpriteHealth[3];

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CPlayer::DrawHealth ()
{
    cout<<"Test1"<<endl;
    for (int i=0; i<3; i++)
    {
        m_pSpriteHealth[i] =  new CSprite;
        m_pSpriteHealth[i]->Load ("Data/Health.bmp");
        m_pSpriteHealth[i]->SetPos (64*float(i)+10, 10);
        m_pSpriteHealth[i]->SetColorKey (255, 0, 255);
        m_pSpriteHealth[i]->Render ();
        cout<<"Test"<<endl;
    }
    cout<<"Test2"<<endl;
}

Die Test nachrichten kommen alle an, bloß wird nichts auf dem Bildschirm gezeichnet.
Ich hoffe ihr könnt mir noch einmal helfen und rastet nicht gleich aus, weil ich nichts geschissen kriege.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

8

18.04.2010, 16:50

Das ist schon okay, jeder fängt mal an und dabei gibts eigentlich immer Probleme. Dafür gibt es ja auch unter anderem solche Foren ;)

Ich denke, dass deine DrawHealth Funktion nicht wirklich das tut, was du willst.

Die DrawHealth Funktion muss immer wieder neu aufgerufen werden, nachdem du das Framework gecleart hast etc. etc., weil du ja schließlich die Sprites immer wieder ne rendern musst.
Was du allerdings tust ist ständig neuen Speicher reservieren und Sprites laden etc. Du solltest das vielleicht in den Konstruktor deiner Klasse legen und DrawHeatlh auf folgendes Maß reduzieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
void CPlayer::DrawHealth()
{
    for(int i = 0; i < 3; i++)
    {
        m_pSpriteHealth[i]->Render();
    }
}


Folgendes:

C-/C++-Quelltext

1
2
3
4
        m_pSpriteHealth[i] =  new CSprite;
        m_pSpriteHealth[i]->Load ("Data/Health.bmp");
        m_pSpriteHealth[i]->SetPos (64*float(i)+10, 10);
        m_pSpriteHealth[i]->SetColorKey (255, 0, 255);


Benötigst du ja schließlich nur einmal.

Ich hoffe, ich konnte dir helfen ;).
WIP Website: kevinheese.de

little_Progger

Treue Seele

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

9

18.04.2010, 17:03

Oder du lässt die Funktion so aber was auch eigentlich besser wäre, wenn du das rendern der Haupschleife überlässt weil dort auch alles gerendert wird.
Ist übersichtlicher.

ZIR

Frischling

  • »ZIR« ist der Autor dieses Themas
  • Private Nachricht senden

10

18.04.2010, 17:11

Ok danke.

Werbeanzeige