Tilemaps (Array)

Gast #3227809
Lesenswert?
• ▲
▼
Hallo zusammen,

hab ein Problem und zwar habe ich einen Punkt, der sich wie in einem 
PacMan spiel steuern lassen soll. Funktioniert alles auch. Nur bei der 
Map habe ich Probleme.

Hier der Codeausschnitt:
1
#include "Game.hpp"
2

3
// Tiles - Konstanten
4
const unsigned int TILE_WIDTH = 80;
5
const unsigned int TILE_HEIGHT = 80;
6
const int TOTAL_TILES = 64;
7
const int TILES_SPRITES = 4;
8
  
9
// Map Größe
10
const unsigned int map_breite = 16;
11
const unsigned int map_hoehe = 4;
12

13
// Map selbst
14
unsigned int level_1[map_breite*map_hoehe] =  
15
  { 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,
16
  3,2,1,0,0,1,2,3,0,1,2,3,0,1,2,3,
17
  0,0,0,0,0,1,2,3,0,1,2,3,0,1,2,3,
18
  3,3,3,3,0,1,2,3,0,1,2,3,0,1,2,3
19
};
20
unsigned int tilemap[map_breite][map_hoehe];
21
// Konstruktor
22
//
23
// Aufgabe: Allgemeine Initialisierungen
24
//
25
CGame::CGame ()
26
{
27
  m_pPlayer = NULL;
28
  p_Spritemap = NULL;
29

30
} // Konstruktor
31

32

33
// Run
34
//
35
// Aufgabe: Hauptschleife des Spiels
36
//
37
void CGame::Run ()
38
{
39
  // Hauptschleife des Spiels durchlaufen
40
  //
41
  while (m_bGameRun == true)
42
  {
43
  
44
    // Events bearbeiten
45
    ProcessEvents ();
46
    
47
    // Framework updaten und Buffer löschen
48
    g_pFramework->Update ();
49
    g_pFramework->Clear ();
50

51
    int byte_nr = 0;
52
    for (int j = 0; j<map_hoehe; j++)
53
    {
54
      for (int k = 0; k<map_breite; k++)
55
      {
56
        tilemap[j][k] = level_1[byte_nr];
57
        p_Spritemap[tilemap[j][k]].SetPos(k*TILE_HEIGHT, j*TILE_WIDTH);
58
        p_Spritemap[tilemap[j][k]].Render();
59
        
60
        byte_nr++;
61
      }
62
    }
63

64
    // Spieler updaten und rendern
65
    m_pPlayer->Update ();
66
    m_pPlayer->Render ();
67
    
68
    CheckCollisions();
69

70
    // Buffer flippen
71
    g_pFramework->Flip ();
72
     
73
  }
74

75

76
} // Run
77

78

79
// CheckCollisions
80
//
81
// Aufgabe: Kollisionen überprüfen
82
//
83
void CGame::CheckCollisions ()
84
{
85
    SDL_Rect Player;
86
    SDL_Rect Tile[map_breite][map_hoehe];
87
    Player = m_pPlayer->GetRect();
88
    
89
      for (int j = 0; j<map_hoehe; j++)
90
    {
91
      for (int k = 0; k<map_breite; k++)
92
      {
93
        
94
        Tile[j][k] = p_Spritemap[tilemap[j][k]].GetRect();
95
        if (tilemap[j][k] == 0)
96
        {
97
        if (Tile[j][k].y < Player.y + Player.h &&
98
          Tile[j][k].y + Tile[j][k].h > Player.y &&
99
          Tile[j][k].x < Player.x + Player.w &&
100
          Tile[j][k].x + Tile[j][k].w > Player.x)
101
        {
102
          m_bGameRun = false;
103
        }
104
        }
105
        
106
      }
107
      }
108

109

110
} // CheckCollisions

Sobald ich mit dem Punkt das Feld mit 0, in dem Fall mit der Farbe rot, 
berühre, soll das Spiel beendet werden. Problem ist, es tut sich nichts. 
Kopiere ich den Code aus CHECKCOLLISION oben in die ersten beiden 
Schleifen rein, funktioniert es. Hat jemand eine Idee?

Danke vorab!
#3229005
Lesenswert?
• ▲
▼
Hi!

Wie ist m_bGameRun deklariert? Mit volatile?
Warum schreibst du die Rückgabe von CheckCollisions in eine Globale 
Variable, statt einen Rückgabewert zu benutzen?
Ausserdem frage ich mich, warum du bei jedem Aufruf das komplette 
Tile[j][k]-Array füllst, wenn du bei jeder iteration nur einen einzelnen 
Wert brauchst. Genau so in der haupt-Schleife.

Ich glaube du machst das viel zu umständlich mit der Kollisions-Abfrage. 
Warum fragst du nicht einfach ab, auf welchem tile sich der Spieler 
befindet und schaust dann, ob in der tilemap an der Stelle ein tile ist? 
Oder habe ich das Prinzip falsch verstanden?
Gast #3230805
Lesenswert?
• ▲
▼
Hi,

bGameRun habe ich nur zu Testzwecken benutzt. Laut Debugger liegt der 
Fehler hier:

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

GetRect gibt mir ja den aktuellen Wert des Rects zurück. Aber aus irgend 
einem Grund habe ich für alle Felder immer den ein und den selben Wert x 
= -131... und y = 92...

Du hast ja recht, ich fülle bei jedem Durchgang das komplette Array neu. 
Es liegt daran, dass ich erst einmal selbst das Ganze auf meine Art 
versuchen möchte. Optimieren kann ich es dann immer noch. Möchte aber, 
dass der grobe Ablauf stimmt ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren