C# Berechnen eines "Slopes" und Collision

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
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);
        }
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:
Code:
[COLLIDER1]
NAME=Plane
CENTER=(-1.3, 1.6, 6.1)
EXTENTS=(2.9, 1.8, 4.7)
 
Statt
C#:
Types.player[connectionID].position.y = (m * step);
lieber
C#:
Types.player[connectionID].position.y += (m * step);
?
 
Das funktioniert auch nicht der Spieler läuft nicht linear nach oben zum obersten Punkt
 
Müsste
Code:
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);
nicht eher
Code:
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);
sein ... :D
 

Ähnliche Themen

C
Antworten
2
Aufrufe
1.987
Cave Johnson
C
Zurück
Oben