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

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

51

13.11.2013, 21:08

Wie hast du den Debugger denn benutzt?
Wenn du im Step-Modus Zeile für Zeile durch deinen Code gehst und die Werte aller relevanten Variablen verfolgst, solltest du doch schnell sehen können, wo es schief läuft.

TigerClaw25

unregistriert

52

13.11.2013, 22:59

Wie oben beschrieben: "wenn ich in der Zeile hier bin

Tile[j][k] = p_Spritemap[tilemap[j][k]].GetRect();

drück ich F11 und der läuft trotzdem weiter, statt in Sprite.cpp zu springen ... Kann das also schlecht überprüfen ..."

Bin am verzweifeln :( Hab zuvor einen Teil der Kollision beim setzen der Tiles mit reingenommen, dort hatte es geklappt.

Habe es nochmal versucht. Der springt dann hier hin: SDL_Rect GetRect(){return m_Rect;}

Da steht jetzt plötzlich "Speicher kann für Membervariablen nicht gelesen werden". Hier der aktuelle Code:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#include "Game.hpp"

// Tiles - Konstanten
const unsigned int TILE_WIDTH = 80;
const unsigned int TILE_HEIGHT = 80;
const int TOTAL_TILES = 64;
const int TILES_SPRITES = 4;
    
// Map Größe
const unsigned int map_breite = 16;
const unsigned int map_hoehe = 4;

// Map selbst
unsigned int level_1[map_breite*map_hoehe] =  
  { 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,
  3,2,1,0,0,1,2,3,0,1,2,3,0,1,2,3,
  0,0,0,0,0,1,2,3,0,1,2,3,0,1,2,3,
  3,3,3,3,0,1,2,3,0,1,2,3,0,1,2,3
};
unsigned int tilemap[map_breite][map_hoehe];
// Konstruktor
//
// Aufgabe: Allgemeine Initialisierungen
//
CGame::CGame ()
{
    m_pPlayer = NULL;
    p_Spritemap = NULL;

} // Konstruktor


// Init
//
// Aufgabe: Hintergrund initialisieren
//
void CGame::Init ()
{
        // Neuen Spieler initialisieren
    m_pPlayer = new CPlayer;
    m_pPlayer->Init ();
    m_pPlayer->Reset ();

    // Hintergrundbild (Sprite) laden
    p_Spritemap = new CSprite [TILES_SPRITES];

    p_Spritemap[0].Load ("Data/red.bmp");
    p_Spritemap[1].Load ("Data/green.bmp");
    p_Spritemap[2].Load ("Data/yellow.bmp");
    p_Spritemap[3].Load ("Data/blue.bmp");

    
    

    // Spiel läuft
    m_bGameRun = true;

} // Init

// Quit
//
// Aufgabe: Instanzen freigeben
//
void CGame::Quit ()
{
        // Hintergrundsprite freigeben

    if (p_Spritemap != NULL)
    {
        delete[] p_Spritemap;
        p_Spritemap = NULL;
    }

        // Spieler freigeben
    if (m_pPlayer != NULL)
    {
        m_pPlayer->Quit ();
        delete (m_pPlayer);
        m_pPlayer = NULL ;
    }

} // Quit

// Run
//
// Aufgabe: Hauptschleife des Spiels
//
void CGame::Run ()
{
    // Hauptschleife des Spiels durchlaufen
    //
    while (m_bGameRun == true)
    {
    
        // Events bearbeiten
        ProcessEvents ();
        
        // Framework updaten und Buffer löschen
        g_pFramework->Update ();
        g_pFramework->Clear ();

        int byte_nr = 0;
        for (int j = 0; j<map_hoehe; j++)
        {
            for (int k = 0; k<map_breite; k++)
            {
                tilemap[j][k] = level_1[byte_nr];
                p_Spritemap[tilemap[j][k]].SetPos(k*TILE_HEIGHT, j*TILE_WIDTH);
                p_Spritemap[tilemap[j][k]].Render();
                
                byte_nr++;
            }
        }

        // Spieler updaten und rendern
        m_pPlayer->Update ();
        m_pPlayer->Render ();
        
        CheckCollisions();

        // Buffer flippen
        g_pFramework->Flip ();
         
    }


} // Run

// ProcessEvents
//
// Aufgabe: Events bearbeiten
//
void CGame::ProcessEvents ()
{
    SDL_Event Event;

    // Gab es ein Event?
    if (SDL_PollEvent (&Event))
    {
        // Ja, also schauen welches
        switch (Event.type)
        {
            // Beenden?
        case (SDL_QUIT):
            {
                m_bGameRun = false;

            } break;


            // Wurde eine Taste gedrückt?
        case (SDL_KEYDOWN):
            {
                switch (Event.key.keysym.sym)
                {
                case (SDLK_ESCAPE):
                    {
                        // Ja, also Spiel beenden
                        m_bGameRun = false;

                    } break;

                
                }
            } break;
        }
    }

} // ProcessEvents


// CheckCollisions
//
// Aufgabe: Kollisionen überprüfen
//
void CGame::CheckCollisions ()
{
        SDL_Rect Player;
        SDL_Rect Tile[map_breite][map_hoehe];
        Player = m_pPlayer->GetRect();
        
            for (int j = 0; j<map_hoehe; j++)
        {
            for (int k = 0; k<map_breite; k++)
            {
                
                Tile[j][k] = p_Spritemap[(tilemap[j][k])].GetRect();
            
                if (Tile[j][k].y < Player.y + Player.h &&
                    Tile[j][k].y + Tile[j][k].h > Player.y &&
                    Tile[j][k].x < Player.x + Player.w &&
                    Tile[j][k].x + Tile[j][k].w > Player.x)
                {
                    m_bGameRun = false;
                }
            
                
            }
            }


} // CheckCollisions


Problem liegt in der Funktion CheckCollision. Darüber hinaus geht die Steuerung nicht, also zwei Tasten z.B. Pfeil oben/rechts gleichzeitig zu drücken. Pfeil oben/links funktioniert aber.

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
41
42
43
44
45
46
47
void CPlayer::ProcessMoving ()
{
    // Nach links?
    if (g_pFramework->KeyDown (SDLK_LEFT))
    {
        // Spieler nach links bewegen
        m_fXPos -= 300 * g_pTimer->GetElapsed ();


        // Falls beide Tasten gedrückt wurden
        if (g_pFramework->KeyDown (SDLK_UP))
            m_fYPos -= 300 * g_pTimer->GetElapsed ();
        else if (g_pFramework->KeyDown (SDLK_DOWN))
            m_fYPos += 300 * g_pTimer->GetElapsed ();

    }
    // Nach rechts?
    else if (g_pFramework->KeyDown (SDLK_RIGHT))
    {
        // Spieler nach rechts bewegen
        m_fXPos += 300 * g_pTimer->GetElapsed ();


        // Falls beide Tasten gedrückt wurden
        if (g_pFramework->KeyDown (SDLK_UP))
            m_fYPos -= 300* g_pTimer->GetElapsed ();
        else if (g_pFramework->KeyDown (SDLK_DOWN))
            m_fYPos += 300 * g_pTimer->GetElapsed ();

    }
        // Nach vorne?
    else if (g_pFramework->KeyDown (SDLK_UP))
    {
        m_fYPos -= 300* g_pTimer->GetElapsed ();
    }
        // Nach unten?
    else if (g_pFramework->KeyDown (SDLK_DOWN))
    {
        m_fYPos += 300* g_pTimer->GetElapsed ();
    }

    

    m_Rect.x = (m_fXPos);
    m_Rect.y = (m_fYPos);

} // ProcessMoving



Und nur so als Info. Manchmal nutze ich den Debugger und alles friert irgendwie ein. Muss dann VC komplett beenden.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »TigerClaw25« (13.11.2013, 23:35)


TigerClaw25

unregistriert

53

25.11.2013, 11:24

Hallo Zusammen,

nachdem ich einfach nicht weiterkomme, der Debugger aber vernünftige Werte liefert, benötige ich eure Hilfe.

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include "Game.hpp"

// Tiles - Konstanten
const unsigned int TILE_WIDTH = 80;
const unsigned int TILE_HEIGHT = 80;
const int TOTAL_TILES = 64;
const int TILES_SPRITES = 4;
    
// Map Größe
const unsigned int map_breite = 16;
const unsigned int map_hoehe = 4;

// Map selbst
unsigned int level_1[map_breite*map_hoehe] =  
  { 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,
  3,2,1,0,0,1,2,3,0,1,2,3,0,1,2,3,
  0,0,0,0,0,1,2,3,0,1,2,3,0,1,2,3,
  3,3,3,3,0,1,2,3,0,1,2,3,0,1,2,3
};
unsigned int tilemap[map_breite][map_hoehe];
// Konstruktor
//
// Aufgabe: Allgemeine Initialisierungen
//
CGame::CGame ()
{
    m_pPlayer = NULL;
    p_Spritemap = NULL;

} // Konstruktor


// Init
//
// Aufgabe: Hintergrund initialisieren
//
void CGame::Init ()
{
        // Neuen Spieler initialisieren
    m_pPlayer = new CPlayer;
    m_pPlayer->Init ();
    m_pPlayer->Reset ();

    // Hintergrundbild (Sprite) laden
    p_Spritemap = new CSprite [TILES_SPRITES];

    p_Spritemap[0].Load ("Data/red.bmp");
    p_Spritemap[1].Load ("Data/green.bmp");
    p_Spritemap[2].Load ("Data/yellow.bmp");
    p_Spritemap[3].Load ("Data/blue.bmp");

    
    

    // Spiel läuft
    m_bGameRun = true;

} // Init

// Quit
//
// Aufgabe: Instanzen freigeben
//
void CGame::Quit ()
{
        // Hintergrundsprite freigeben

    if (p_Spritemap != NULL)
    {
        delete[] p_Spritemap;
        p_Spritemap = NULL;
    }

        // Spieler freigeben
    if (m_pPlayer != NULL)
    {
        m_pPlayer->Quit ();
        delete (m_pPlayer);
        m_pPlayer = NULL ;
    }

} // Quit

// Run
//
// Aufgabe: Hauptschleife des Spiels
//
void CGame::Run ()
{
    // Hauptschleife des Spiels durchlaufen
    //
    while (m_bGameRun == true)
    {
    
        // Events bearbeiten
        ProcessEvents ();
        
        // Framework updaten und Buffer löschen
        g_pFramework->Update ();
        g_pFramework->Clear ();
    
        int byte_nr = 0;
        for (int j = 0; j<map_hoehe; j++)
        {
            for (int k = 0; k<map_breite; k++)
            {
                tilemap[j][k] = level_1[byte_nr];
                p_Spritemap[tilemap[j][k]].SetPos(k*TILE_WIDTH, j*TILE_HEIGHT);
                p_Spritemap[tilemap[j][k]].Render();

                byte_nr++;
            
            }

        }


            
    
        // Spieler updaten und rendern
        m_pPlayer->Update ();
        m_pPlayer->Render ();
        
        CheckCollisions();

        // Buffer flippen
        g_pFramework->Flip ();
         
    }


} // Run

// ProcessEvents
//
// Aufgabe: Events bearbeiten
//
void CGame::ProcessEvents ()
{
    SDL_Event Event;

    // Gab es ein Event?
    if (SDL_PollEvent (&Event))
    {
        // Ja, also schauen welches
        switch (Event.type)
        {
            // Beenden?
        case (SDL_QUIT):
            {
                m_bGameRun = false;

            } break;


            // Wurde eine Taste gedrückt?
        case (SDL_KEYDOWN):
            {
                switch (Event.key.keysym.sym)
                {
                case (SDLK_ESCAPE):
                    {
                        // Ja, also Spiel beenden
                        m_bGameRun = false;

                    } break;

                
                }
            } break;
        }
    }

} // ProcessEvents


// CheckCollisions
//
// Aufgabe: Kollisionen überprüfen
//
void CGame::CheckCollisions ()
{
        SDL_Rect Player;
        SDL_Rect Tile[map_breite*map_hoehe];
        Player = m_pPlayer->GetRect();
        int byte_nr = 0;
        
        for (int j = 0; j<map_hoehe; j++)
        {
            for (int k = 0; k<map_breite; k++)
            {
                
                Tile[byte_nr] = p_Spritemap[tilemap[j][k]].GetRect();

                if (Tile[byte_nr].y < Player.y + Player.h &&
                    Tile[byte_nr].y + Tile[byte_nr].h > Player.y &&
                    Tile[byte_nr].x < Player.x + Player.w &&
                    Tile[byte_nr].x + Tile[byte_nr].w > Player.x)
                {
                    m_bGameRun = false;
                }
            
                byte_nr++;
            }
        }


} // CheckCollisions


Das Problem liegt in der CheckCollision-Funktion. Laut Debugger bekomme ich zumindest richtige Werte:

- Tile 0x0016f84c {{x=960 y=240 w=0 ...}, {x=1040 y=240 w=0 ...}, {x=1120 y=240 w=0 ...}, {x=-13108 y=-13108 ...}, ...} SDL_Rect[64]
+ [0] {x=960 y=240 w=0 ...} SDL_Rect
+ [1] {x=1040 y=240 w=0 ...} SDL_Rect
+ [2] {x=1120 y=240 w=0 ...} SDL_Rect


Leider klappt aber die Kollision an sich nicht. Würde mich wsirklich sehr interessieren, warum das nicht geht. Ich vermute, dass es daran liegt, dass ich die Sprites zwar setze, aber bei derddarstellundarstellung immer überschreiben. Aber wie löse ich das ohne vektore und maps?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (25.11.2013, 12:31)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

54

25.11.2013, 13:37

w=0? h=0?
Das erfüllt Deine Ungleichung nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

55

25.11.2013, 13:53

Deswegen denke ich, dass einfach nach dem zuletzt gesetzten Sprite weitererzählt wird ausserhalb des Bildschirms, wo kein Sprite ist, da das letzte Sprite bei x = 960. Liegt. Kann es sein, dass es in Kollision so garnicht funktioniert? Ich komme hier einfach nicht weiter.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

56

25.11.2013, 14:13

Hat zwar nichts mit dem Fehler zu tun, aber ...
Warum deklarierst du da ein Array namens Tile? Du brauchst doch immer nur 1 Tile in deinen beiden Schleifen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

57

25.11.2013, 14:34

Deswegen denke ich, dass einfach nach dem zuletzt gesetzten Sprite weitererzählt wird ausserhalb des Bildschirms, wo kein Sprite ist, da das letzte Sprite bei x = 960. Liegt. Kann es sein, dass es in Kollision so garnicht funktioniert? Ich komme hier einfach nicht weiter.
Wie soll Deine Ungleichung jemals erfüllt sein, wenn Deine ganzen Rects eine Höhe und Breite von 0 haben?
Da müsste zumindest ein <= oder >= stehen statt einem < oder >.
Völlig egal, welches x das Sprite hat oder ob es außerhalb des Bildschirms liegt. Eine Höhe und Breite von 0 wird nie hinhauen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

58

25.11.2013, 17:39

Ich weiß ehrlich nicht, wo der Fehler liegt. Sowohl w ist 0 als auch x und y Koordination stimmen nicht ...

Werbeanzeige