Gotenks666
Ensign
- Registriert
- Mai 2009
- Beiträge
- 165
Ich wünsche einen wunderschönen guten Abend!
Ich stehe vor folgendem Problem, momentan entwickle ich ein kleines 3D OnlineFPS Spiel in dem die Collision auf dem Server berechnet wird. Jedes Objekt in meinem Spiel hat einen "Box Collider" dessen "Center" und "Extent" information im Server lade um Server Seitiges Movement zu gewähren. Das funktioniert wunderbar, ich kann mit meinem Spieler nicht durch diese Box Collider laufen und auch drum rum! Nun habe ich aber folgendes Problem. Nun möchte ich aber einen "Plane" aufstellen der im 20 Grad Winkel nach oben schaut das der Spieler auf diesem Object nach oben auf die Spitze laufe kann. Doch ich nähere mich der Verzweiflung da ich einfach die passende Formel nicht finden kann.
Mein Spieler bewegt sich wie folgt auf dem Server: Die Client sendet den Key Input zum Server und der Server verarbeitet diese Informationen und bewegt den Spieler dann, bevor erfolgt die Collision detection.
step is equal to 0.1
Ich kann den Slope kalkulieren mit allen Collider Informationen die ich habe, nur schaffe ich es nicht das sich der Spieler auf diesem "Plane" in der Y Achse jeden "Stept" nach oben bewegt.
Collider Information:
Ich stehe vor folgendem Problem, momentan entwickle ich ein kleines 3D OnlineFPS Spiel in dem die Collision auf dem Server berechnet wird. Jedes Objekt in meinem Spiel hat einen "Box Collider" dessen "Center" und "Extent" information im Server lade um Server Seitiges Movement zu gewähren. Das funktioniert wunderbar, ich kann mit meinem Spieler nicht durch diese Box Collider laufen und auch drum rum! Nun habe ich aber folgendes Problem. Nun möchte ich aber einen "Plane" aufstellen der im 20 Grad Winkel nach oben schaut das der Spieler auf diesem Object nach oben auf die Spitze laufe kann. Doch ich nähere mich der Verzweiflung da ich einfach die passende Formel nicht finden kann.
Mein Spieler bewegt sich wie folgt auf dem Server: Die Client sendet den Key Input zum Server und der Server verarbeitet diese Informationen und bewegt den Spieler dann, bevor erfolgt die Collision detection.
step is equal to 0.1
C#:
if (key.Contains(KeyInput.W))
{
x = step * (float)Math.Round(Math.Sin(moveAngle * Constants.Deg), 4);
z = step * (float)Math.Round(Math.Cos(moveAngle * Constants.Deg), 4);
}
//backward
if (key.Contains(KeyInput.S))
{
x -= step * (float)Math.Round(Math.Sin(moveAngle * Constants.Deg), 4);
z -= step * (float)Math.Round(Math.Cos(moveAngle * Constants.Deg), 4);
}
//left
if (key.Contains(KeyInput.A))
{
x -= step * (float)Math.Round(Math.Cos(moveAngle * Constants.Deg), 4);
z += step * (float)Math.Round(Math.Sin(moveAngle * Constants.Deg), 4);
}
//right
if (key.Contains(KeyInput.D))
{
x += step * (float)Math.Round(Math.Cos(moveAngle * Constants.Deg), 4);
z -= step * (float)Math.Round(Math.Sin(moveAngle * Constants.Deg), 4);
}
Code:
public static bool CheckCollision(int connectionID, float moveX, float moveZ)
{
Vector3 pos = new Vector3(moveX, Types.player[connectionID].position.y, moveZ);
//Get player rectangle information
Bounds playerBound = new Bounds();
playerBound.center = pos;
playerBound.extents = Types.player[connectionID].extents;
playerBound.max = pos + Types.player[connectionID].extents;
playerBound.min = pos - Types.player[connectionID].extents;
playerBound.size = Types.player[connectionID].extents * 2;
for (int i = 0; i < Types.mapColliders.Length; i++)
{
//Set the rectangle information
Bounds colliderBound = new Bounds();
colliderBound.center = Types.mapColliders[i].center;
colliderBound.extents = Types.mapColliders[i].extends;
colliderBound.max = Types.mapColliders[i].center + Types.mapColliders[i].extends;
colliderBound.min = Types.mapColliders[i].center - Types.mapColliders[i].extends;
colliderBound.size = Types.mapColliders[i].extends * 2;
if (playerBound.Intersects(colliderBound))
{
if ((Types.mapColliders[i].center.y + Types.mapColliders[i].extends.y) != (Types.player[connectionID].position.y - Types.player[connectionID].extents.y))
{
Vector3 colliderPoint = pos;
Vector3 colliderTop = colliderBound.max;
float distance = Vector3.Distance(colliderPoint, colliderTop);
float m = CalculateSlope(colliderBound.max.y, playerBound.min.y, colliderBound.max.z, colliderBound.min.z);
if (m <= Constants.MAX_SLOPE_WALK)
{
Types.player[connectionID].position.y = (m * step);
return true;
}
return false;
}
}
}
return true;
}
Code:
public static float CalculateSlope(float _y2, float _y1, float _x2, float _x1)
{
return (_y2 - _y1) / (_x2 - _x1);
}
Collider Information:
Code:
[COLLIDER1]
NAME=Plane
CENTER=(-1.3, 1.6, 6.1)
EXTENTS=(2.9, 1.8, 4.7)