Benötige Hilfe
-
Hallo, ich bin neu hier und kenne mich noch nicht so gut aus, also bitte um Nachsicht

Ich würde gerne ein C++/Cli Spiel programmieren. Das Spiel heißt Pong. Mir ist es bereits schon gelungen meinen "Spielball" zu bewegen. Nun komme ich aber nicht weiter und brauche Euren Rat.
Wie kann ich meinen "Spielball" von einer Wand abprallen lassen, bzw. welche Abfrage benötige ich?

Mein Code bis jetzt:
private: System::Void Timer_Tick(System::Object^ sender, System::EventArgs^ e) {
xWert += 10;
yWert += 10;Ball->Location = System::Drawing::Point(xWert, yWert);
if(Ball->Location.Y == 366)
{
xWert -= 10;
yWert -= 10;
}}
-
Wie kann ich meinen "Spielball" von einer Wand abprallen lassen, bzw. welche Abfrage benötige ich?
Soll er lediglich von vertikalen, bzw. horizontalen Wänden abprallen, dann invertiere einfach die Y- bzw. X-Komponente des Richtungsvektors.
Sprich, bewegt sich der Ball in jedem Schritt 10 Pixel nach links und 3 nach oben, hat also den Richtungsvektor , und prallt dann gegen die Linke Wand, dann invertierst du die X-Komponente, sodass .
Da in Pong keine Reibung herrscht, ist dabei die Y-Komponente unbeeinflusst.
-
Falls du Sones Beitrag nicht verstehst:
Statt 10 zu addieren oder zu subtrahieren, addiere immer den Wert der Variablen z.B. speedX und speedY.
SpeedX (bzw. speedY -je nachdem welche 'Wand') nimmst du mal -1, wenn eine Wand erreicht wurde.
-
ja, danke erstmal.
aber welche Abfrage muss ich treffen damit mein "Spielball" nicht das Spielfeld verlässt.
Momentan habe ich nämlich noch das Problem, dass sich mein Spielball von der Mitte des Spielfelds, schräg nach rechts unten bewegt und dann verschwindet der Spielball einfach.
Möchte aber, solbald er die Grenze des Spielfeldes erreicht, dass er abprallt?
Bei dieser Abfrage bin ich überfordert.
-
Wird Location.Y denn sicher irgendwann genau gleich 366?
Eher nicht oder?
-
Keine ahnung ob diese Abfrage funktioniert. Aber da mein Spielfeld die Größe von 898 * 366 Pixel hat, dachte ich das nützt vielleicht was.
-
Und was ist die Startposition vom Ball?
Wenn die z.B 350 ist, wird Location.Y dann irgendwann mal genau 366 wenn immer 10 addiert wird?
-
Die Startposition vom Ball liegt derzeit bei (449,183).
also der x-Wert ist 449 und der y-Wert 183.ach ja genau, du du meinst wohl dass der Wert 366 nie genau erreicht wird.
ich sollte besser >= 366 schreiben.
-
Genau. Zumindest solange du nur 4 Wände hast und keine kleinen Mauern oder sowas im Spielfeld stehen.
-
also ich hab jetzt folgendes mal ausgebessert. habe mein Spielfeld auf die Größe 900 x 360 Pixel verändert und meinen Startwert genau auf (0,0) gesetzt damit sicher die Zahl 360 erreicht wird.
meine Abfrage lautet nun:
private: System::Void Timer_Tick(System::Object^ sender, System::EventArgs^ e) {
xWert += 10;
yWert += 10;Ball->Location = System::Drawing::Point(xWert, yWert);
if(Ball->Location.Y == 360)
{
xWert += 10;
yWert -= 10;
}}
aber der Ball prallt trotzdem nicht von der Wand ab, was nun? gibt es noch eine andere Abfrage?

-
Dann bleibt er an der Wand kleben. Wie man das ändert haben Sone und ich schon geschreiben.
-
das habe ich auch schon geändert. nu r das Problem ist, dss er es nicht macht! Der Ball bleibt einfach nicht kleben, sondern fährt weiter.
-
Was ist "das" und "es"? Zeig mal den neuen Code.
Der Ball bleibt einfach nicht kleben, sondern fährt weiter.
Wirklich? 360 liegt außerhalb des Spielfelds, den Ball solltest du also gar nicht mehr sehen können.
-
Nein, er bleibt kleben, nur siehst du das nicht.
LocationXY ist die linke obere Ecke des Balls.
Abprallen sollte er aber, wenn die untere Ecke über den Bereich geht.
Kommste damit weiter?Edit: Kannst ja testeweise mal in deiner if-Abfrage nen kleineren Wert als die Spielfeldgröße angeben
-
alles klar. wenn das so ist, dann müsste ich nur noch die größe des Balls subtrahieren oder?
-
Ja, hört sich gut an.
-
danke
