Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.12.2012, 22:30

2D-Physik für ein Ballspiel

Hi!
Ich arbeite derzeit an einer Physik für ein mit XNA realisiertes minigame.
Bis jetzt hat der User die Aufgabe einen Ball zu steuern. Der Ball soll natürlich Hüpfen, an Wänden abprallen, usw.
Was ich bisjetzt habe:
1.)Kollisionsüberprüfung: Eine Map kann mit Paint oder einen anderen Programm gezeichnet werden und dann mittels ASCII to go (Fotos in Ascii zeichen umwandeln) ins Spiel geladen werden. Die "Ascii-Map" wird dann in ein 2D-Array geladen. Jedes Zeichen wird beim beginnen als Pixel gezeichnet. Mittels Sinus und Cosinus und einer for-Schleife die alle 360 Grad durchzählt können die Ränder des Balles ermittelt werden und an jeder Stelle wird dann überprüft ob eine Kollision auftritt. Somit wäre die Kollisionsüberprüfung geklärt. (Was auch funktioniert.)

2.)Der Ball hat eine Position(X,Y) und eine Geschwindigkeit(X,Y).
Wenn eine Kollision auftritt wird als erstes überprüft, ob der Ball den Boden "durchschlagen" hat. (Wenn die Geschwindigkeit größer eins ist, kann es auch vorkommen, dass der Ball einige Pixel unter den Boden ist) Die Position des Balles wird an die oberste bekannte Position gesetzt. Dann werden die Geschwindigkeiten umgekehrt, subtrahiert und so weiter.

Was funktioniert nicht?
Der Ball steckt im Boden, der Ball macht seltsame Bewegungen,.....
Ich würde gerne die Grad wissen in denen der Ball aufknallt, die werden völlig falsch ausgegeben. (z.B.: Auf einer geraden Fläche wird 8 Grad Steigung ausgegeben.)
Hier wäre die Methode um die es sich handelt:
Wegen falscher Formatierung siehe hier: http://pastebin.com/YaR4BaxR

C#-Quelltext

1
2
3
4
5
        public void CheckCollision()        {            bool gravitation = true;            if (playerPosY > 26)            {                for (int i = 0; i < 360; i++) //Jeder Winkel wird gecheckt                {                    float posX = (int)(Math.Round(playerPosX) + (Math.Cos(i) * 25)); //Cos(0) = 1                    float posY = (int)(Math.Round(playerPosY) + (Math.Sin(i) * 25)); //Sin(0) = 0
                    if (terrain[(int)Math.Round(posY), (int)Math.Round(posX)] != '+') //Kollision tritt an der Stelle posX,posY auf                    {
                        gravitation = false;    //Am Boden herrscht keine Schwerkraft (verhindert ruckeln auf der Y Achse)                        for (int j = 0; j < 100; j++)                        {                            if (terrain[(int)Math.Round(posY) - j, (int)Math.Round(posX)] != '+' && j != 0) //Wenn der Spieler den Boden durchschlägt, wird überprüft ob sich in den nächsten 10 pixel über ihn Luft befindet und er wird auf diese Position gesetzt                            {                                playerPosY -= 1;                            }                        }
                        //playerPosY -= 1;                        playerPosYSpeed *= -1;                        playerPosYSpeed += 1f;                        //playerPosXSpeed *= (float)Math.Cos(Convert.ToDouble(i));  //Kollisionserkennung an der X-Achse                        break;  //Schleife wird verlassen                    }                }            }
            if (gravitation)                playerPosYSpeed += 0.04f;   //Gravitation        }


Ich hoffe es ist alles verständlich!
Wenn nicht kann ich gerne nochmal das ganze Projekt uppen, sonst einfach fragen!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

03.12.2012, 07:03

An Deiner Stelle würde ich das nicht selbst machen. Box2D ist wundervoll in der Hinsicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]