# Pong Ausfallswinkel



## Maschine (16. Jun 2011)

Hey, ich bin grad dabei Pong zu programmieren und finde keine gute Idee, wie ich den Ball "anschneiden" kann, wenn der Ball mit einem Paddel kollidiert.
Im moment hab ich einfach Einfallswinkel = Ausfallswinkel.
Das ist aber ziehmlich langweilig, desshalb will ich je nach Geschwindigkeit des Paddels beim Aufprall des Balles, die Geschwindigkeit des Balles und den Ausfallswinkel verändern.

Ich hoffe mir kann einer einen Tipp geben, wie es zu lösen wäre


----------



## SlaterB (16. Jun 2011)

du kannst doch den Punkt des Auftreffens bestimmen und je nach Position zwischen Mitte und ganz außen einen oder mehrere Faktoren/ Prozentwerte in bestimmten Bereichen errechnen,
diese/n Faktor/en benutzt du dann um den berechneten Einfallswinkel + die Geschwindigkeit zu ändern,
wie stark, dass zeigen nur Erfahrungswerte


----------



## Maschine (16. Jun 2011)

Ich habe das schon probiert. Hab es mir so gedacht, trifft der Ball in die Mitte vom Paddel ist faktor 1, also bleibt EW = AW. Ganz oben ist der faktor 0 und unten faktor 2. Aber irgendwie sieht es sehr unschön aus und wenn der Winkel einmal 0° ist, bleibt er das auch...

Hier mal die Methode:

```
private void kollisionMitSchlaeger(PaddelSuper paddel, int index){
//		index 0 ist der linke Paddel
		double paddleMitteY = paddel.gibHoehe() / 2;
		double ballMitteY = y + (hoehe /2) - paddel.gibY();
		double faktor = ballMitteY / paddleMitteY;

		if(index == 0){
			if(y + hoehe >= paddel.gibY() && y <= paddel.gibY() + paddel.gibHoehe() && x <= paddel.gibRandX()){
				winkel = (90 + (90 - winkel)) * faktor;
			}
		}
//		index 1 ist der rechte Paddel
		else if(index == 1){
			if(y + hoehe >= paddel.gibY() && y <= paddel.gibY() + paddel.gibHoehe() && x + breite >= paddel.gibRandX()){
				winkel = (90 + (90 - winkel)) * faktor;
			}
		}
	}
```


----------



## SlaterB (16. Jun 2011)

wie gesagt: das ist eine Grundtechnik, welche Werte sich danach wie verändern ist komplett variabel,
faktor 0-2 ist eher verrückt, wenn dann 0.5-2, maximal Verdopplung oder Halbierung,
schaue dir ein vorhandenes Pong-Programm an, schaue wie weit sich ein Winkel maximal verändert,

es muss nichtmal ein linearer Verlauf sein, sondern z.B. quadratisch, 
nach außen hin umso stärkere Abweichung oder auch andersrum eher schwächer, Abweichung schon hoch genug,
es kann auch mit von der Geschwindkeit abhängen und andersrum,
außerdem können sehr flache Einfallswinkel anders behandelt werden, so dass diese in einem viel größeren Bereich wieder zu normlen Werten abgelenkt werden

ich persönlich kann da überhaupt nichts konkretes nennen, aber ne Suchmaschine bedienen, wenn dir das zu schwer ist 
hier
Java Pong Game
gibts sogar Quellcode, auch wenn ich auf die Schnelle keine entsprechende Stelle gefunden habe, sofern sie überhaupt implementiert ist (Spiel auch nicht ausprobiert)


----------



## FArt (17. Jun 2011)

Meinst du nur verschiedene Austrittswinkel oder tatsächlich etwas wie anschneiden?

Hm, so ein Pong mit anschneiden kenne ich noch nicht, wäre aber bestimmt lustig: Bestimmt im Moment des Aufpralls die Geschwindigkeit des Paddels, welche in einer beliebigen Form ein wenig variabel sein muss (z.B. eine Art Trägheit oder spezielle Beschleunigungsmöglichkeiten) daraus kann man dann eine kurvige Flugbahn bestimmen. Auch hier muss man sich nur näherungsweise an "echtes" Verhalten annähern, z.B. könnte ich mir vorstellen, dass man eine Formel aus der Physik (flacher Wurf, nur umgekehrt) adaptieren kann.
Das kann man natürlich noch weiterspinnen, z.B. mit Effet am Ball, der den Austrittswinkel wieder beeinflusst usw.... macht sicher laune... zu entwickeln und zu spielen...


----------



## SlaterB (17. Jun 2011)

also ich dachte daran noch nicht, das Paddel zumindest hatte ich fest gesehen 
meine die Geschwindigkeit des Balls, welcher ja vielleicht auch als Schwierigkeitsgrad benutzt wird,

generell habe ich da aber eher Breakout im Kopf, nicht Pong

edit: 
oh, steht sogar im ersten Post:
'je nach Geschwindigkeit des Paddels beim Aufprall des Balls'


----------



## muckelzwerg (17. Jun 2011)

Naja, solange sich das Paddel nur mit einer einzigen Geschwindigkeit bewegt gibt es ja nur drei Bewegungszustände, mit dem es den Ball trifft. Soo viele Winkel lassen sich daraus nicht unbedingt direkt ableiten. Da fände ich den Spin auch reizvoller.

Bei Breakout gibt es die Abgerundeten Ecken, vielleicht kann man mit denen etwas mehr Risiko und andere Winkel reinbringen.


----------



## Marco13 (17. Jun 2011)

Ja, abgerundete Ecken wären auch das erste, was mir eingefallen wäre. Anschneiden könnte duetlich schwieriger werden, weil man schon um es (nicht "korrekt", sondern nur) plausibel aussehen zu lassen einiges an Physik da reinbringen müßte, mit Drehmoment und Reibung und so...


----------



## muckelzwerg (17. Jun 2011)

Falls es denn überhaupt geht. Als Spieler würde ich die Winkelveränderung vermutlich genau andersrum erwarten, als es einigermaßen physikalisch passt. Zumindest wenn ich an Breakout denke.
Und wenn man nur eine einzige Geschwindigkeit heit, dann gibte es auch nur eine Winkelverzerrung nach links und eine nach rechts.
Ganz egal, welche Formel man verwendet.

Deswegen meinte ich, den Spin zu verwenden. Also den Winkel nicht am Paddle zu ändern, sondern beim nächsten Auftreffen am Spielfeldrand, weil er Topspin oder Backspin gespielt wurde.

"Meine" Breakoutvariante war immer "Arkanoid". Wenn man sich solche Spiele anschaut, gibt es jede Menge coole Sachen, die man außer den Winkeln noch einbauen kann.
Da hatte man den Winkel doch einigermaßen unter Kontrolle, bilde ich mir ein. Aber wenn ich mir jetzt Videos davon anschaue, erkenne ich nicht unbedingt direkt ein eindeutiges Verfahren.
Irgendwo in der Nähe der Ecken gibt es eine Stelle ab der der Ball direkt relfektiert wird. Und weiter außen wir er dann noch "flacher"?


----------



## Maschine (17. Jun 2011)

Ich habs jetzt so gelöst:
5 Pixel vor aufprall von dem Ball mit dem Paddel bestimme ich die Y-Koordinate und beim Aufprall nochmal. Das Subtrahier ich dann. Dann bestimm ich den Ausfallwinkel mit tan(deltaY / 5). So ist der Winkel 0°, wenn ich das Paddel nicht bewege und der Winkel ist groß, wenn ich es schnell bewege.

So kann ich jetzt auch die Geschwindigkeit des Balles leichter verändern.


----------

