Forum: PC-Programmierung Tilemaps (Array)


von Hansi (Gast)


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!

von Max T. (charmquark)


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?

von Hansi (Gast)


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 ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.