Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Bouncepad erkennen lassen und whiles zusammenführen


PongPong - Fr 01.07.22 11:33
Titel: Bouncepad erkennen lassen und whiles zusammenführen
Vorab: Ich bin Anfänger und hab als Aufgabe eine Art "Pong" zu erstellen.

Guten Tag. Ich hätte da 2 Fragen, bei denen ich hoffe, dass mir da jemand helfen kann.

Zur ersten: Wie kann ich diese ganzen Whiles für die Richtungen in die der Ball springt zusammenfassen, so dass er dauerhaft weiter springt, bis er unter dem Bouncepad landet? Aktuell hab ich alles in einzelnen whiles und müsste für eine lange Runde noch sehr viel mehr while Schleifen erstellen, damit er immer weiter bounct.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
    
     while Ball.Top < 1009 do
     begin
          Ball.Left := Ball.Left + BallSpeed;
          Ball.Top  := Ball.Top + BallSpeed;
          Refresh;
     end;

     BallSpeed := - BallSpeed;

     while Ball.Top > 0 do
     begin
          Ball.Left := Ball.Left + 1;
          Ball.Top  := Ball.Top + BallSpeed;
          Refresh;
     end;

     while Ball.Top < 1009 do
     begin
          Ball.Left := Ball.Left + BallSpeed;
          Ball.Top  := Ball.Top + 1;
          Refresh;
     end;

          while Ball.Top > 0 do
     begin
          Ball.Left := Ball.Left - 1;
          Ball.Top  := Ball.Top - 1;
          Refresh;
     end;

          while Ball.Top < 1009 do
     begin
          Ball.Left := Ball.Left + BallSpeed;
          Ball.Top  := Ball.Top + 1;
          Refresh;
     end;


Die 2.Frage: Wie tracke ich, dass der Ball das sich bewegende Bouncepad trifft, damit der Ball dann in andere Richtungen fliegt und Punkte im Highscore gesammelt werden können?


LG


Th69 - Fr 01.07.22 12:30

Hallo und :welcome:,

genau so, wie du für die Ballbewegung eine Schleife erstellt hast, kannst du auch darum herum eine weitere Schleife erstellen, welche du mit einer Bedingung verknüpfst (bzw. zum Test einfach while(true)).

In welcher Ereignisfunktion steht denn der Code bisher?
Denn solange es kein Konsolenprogramm ist, sondern eine Windows-Anwendung (d.h. innerhalb einer Form), sollte für die Bewegung ein Timer [https://docwiki.embarcadero.com/Libraries/Sydney/de/Vcl.ExtCtrls.TTimer] benutzt werden (anstatt der while-Schleifen), da sonst die Form blockiert und Windows dann "die Anwendung reagiert nicht" anzeigt!

Und zu deiner 2. Frage: mittels TRect.Intersects [https://docwiki.embarcadero.com/Libraries/Sydney/de/System.Types.TRect.Intersects] kannst du abfragen, ob sich zwei Rechtecke (d.h. BoundsRect [https://docwiki.embarcadero.com/Libraries/Sydney/de/Vcl.Controls.TControl.BoundsRect] von Ball und Bouncepad) überschneiden.

PS: Außerdem solltest du einfach zwei Variablen BallSpeedX und BallSpeedY haben, so daß du nur jeweils eine einzige Zeile (für Veränderung von Ball.Left und Ball.Top) benötigst.