Guten Tag an die Community,
Im Sinne meines Abschlussprojektes programmiere ich ein 2D-Platformer mit Microsoft Visual Studio 2010, C++, Der Bibliothek "Allegro 4". Das ganze natürlich objektorientiert.
Ich habe folgendes Problem:
mit dieser Methode:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
void Collision::LoadCollisionMap(const char *filename)
{
ifstream openfile(filename);
if(openfile.is_open())
{
openfile >> mapSizeX >> mapSizeY;
while (!openfile.eof())
{
openfile >> ColMapFile[loadCounterX][loadCounterY];
loadCounterX++;
if(loadCounterX >= mapSizeX)
{
loadCounterX = 0;
loadCounterY ++;
}
}
loadCounterX = loadCounterY = 0;
}
}
|
lade ich meine Map:
10 8
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
in das zweidimensionale Array "ColMapFile[loadCounterX][loadCounterY]"
die ersten zwei Werte sollen inr mapSizeX und mapSizeY geladen werden.
Das funktioniert auch, da ich genau die selbe Logik angewandt habe, um meine Map mittels Tiles zu gestalten.
Nun zu dem Problem:
mit folgender Methode:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
void Collision:: PlatformCollision(BITMAP *buffer, Player &player)
{
for (int i = 0; i < mapSizeX; i++)
{
for (int j = 0; j < mapSizeY; j++)
{
if(ColMapFile[i][j] != 0)
{
if(player.y+player.animation->h<j*BlockSize || player.x > i*BlockSize+BlockSize || player.y > j*BlockSize+BlockSize || player.x+player.animation->w < i* BlockSize)
{
player.Platform = false;
}
else
{
player.Platform = true;
}
}
}
}
}
|
prüfe ich das o.g. Array auf einsen, wenn eine gefunden wird, soll die oben zusehende if-Abfrage durchgeführt werden usw.
Auch das funktioniert soweit, ich habe aus Testzwecken erstmals ein einziges Tile, also eine einzige 1, geladen, die Kollisions-Erkennung funktionierte dann auch einwandfrei,
aber sobald ich eine zweite eins in die Map packe, wird nur eine eins erkannt und auf Kollision überprüft. Es scheint mir so als würde sich mein Code immer auf die eins festlegen, welche am nächsten zum Spieler spawn ist.
Syntaktischer oder logischer Fehler?
schonmal vielen lieben Dank,
mit freundlichen Grüßen,
flohdieter
PROBLEM HAT SICH ERLEDIGT,
LÖSUNG WAR FOLGENDES:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
void Collision:: PlatformCollision(BITMAP *buffer, Player &player)
{
player.Platform = false;
for (int i = 0; i < mapSizeX; i++)
{
for (int j = 0; j < mapSizeY; j++)
{
if(ColMapFile[i][j] != 0)
{
if(!(player.y+player.animation->h<j*BlockSize || player.x > i*BlockSize+BlockSize || player.y > j*BlockSize+BlockSize || player.x+player.animation->w < i* BlockSize))
{
player.Platform = true;
}
}
}
}
}
|
[/i]