Ich habe ein kleines Spiel mit Kacheln und einem Spieler erstellt, und ich versuche, in Kollisionserkennung zu programmieren. Also habe ich es geschafft, eine Kollision zu machen, wenn der Charakter nach links geht ('A'), um zu arbeiten, aber es funktioniert nicht, wenn es nach rechts geht ('D'). Dies ist mein Code:(C# XNA) Zeichen durch Objekte in nur einer Richtung
public bool ColX(Texture2D sprite, Vector2 pos, float speed)
{
float PosLeftX = pos.X;
float PosUpY = pos.Y;
float PosRightX = pos.X + sprite.Width;
float PosDownY = pos.Y + sprite.Height;
float DestX = pos.X + speed;
Vector2 tileTopLeft = GetTile(PosLeftX, PosUpY); //using PosLeftX and PosLeftY to set top left tile to a variable
Vector2 tileBotLeft = GetTile(PosLeftX, PosDownY);
Vector2 tileTopRight = GetTile(PosRightX, PosUpY);
Vector2 tileBotRight = GetTile(PosRightX, PosDownY);
Vector2 tileDestUp = GetTile(DestX, PosUpY);
Vector2 tileDestDown = GetTile(DestX, PosDownY);
if(tileTopRight.X < tileDestUp.X)
{
float startX = tileTopRight.X;
float finishX = tileDestUp.X;
float startY = tileTopRight.Y;
float finishY = tileBotRight.Y;
for (int l = (int)startX; l <= finishX; l++)
{
for (int i = (int)startY; i <= finishY; i++)
{
if (tileList[l, i] != null)
{
return true;
}
}
}
return false;
}
else if (tileTopLeft.X > tileDestDown.X)
{
float startX = tileDestUp.X;
float finishX = tileTopLeft.X;
float startY = tileDestUp.Y;
float finishY = tileDestDown.Y;
for (int l = (int)startX; l <= finishX; l++)
{
for (int i = (int)startY; i <= finishY; i++)
{
if (tileList[l, i] != null)
{
return true;
}
}
}
return false;
}
else
{
return false;
}
}
auf ‚A‘ drückt, Geschwindigkeit wird ein negativer Parameter sein, die Zielkachel links von dem Spieler machen, und es wird geprüft, ob jede Kachel in dem ein Rechteck aus dem Ziel Kacheln Sie in den unteren linken Bereich des Spielers. Wenn es eine Kachel gibt, wird die Bewegung abgebrochen und es funktioniert. Dasselbe funktioniert jedoch nicht für den 'D' Schlüssel, obwohl ich annahm, dass der gleiche Code für 'A' mit kleinen Änderungen für 'D' funktionieren würde.
Danke dafür, aber ich habe herausgefunden, was ich falsch gemacht habe. Wenn ich die 'A' Taste drückte, blieb die Geschwindigkeit positiv und die Position wurde um die Geschwindigkeit * -1 geändert. Dies bedeutet, dass hier nur nach rechts und nicht nach links nach Fliesen gesucht wird. Ich fügte jedoch die Geschwindigkeit der Charaktere der Position hinzu und machte eine Kachel mit Kacheln, durch die das Zeichen hindurchgehen würde, wobei alle auf Kollisionen überprüft wurden. Wenn das Zeichen in diesem Feld kollidierte, wurde es schrittweise dekrementiert Geschwindigkeit um 1, und dann erneut die Box mit der neuen Geschwindigkeit, bis keine Kollisionen passiert sind, und bewegte das Zeichen. – SentriCast
Eigentlich, von dem, was ich geschrieben habe, bin ich mir nicht sicher, was ich falsch gemacht habe (wie ich sagte, es war die richtige Kollision, die nicht funktioniert, anstatt die linke). Aber ich habe es vorher herausgefunden, also muss ich den Code weggelassen haben. – SentriCast