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!