![]() |
AW: Ballspiel(Pongähnlich)
Prima, das ist schon der erste Schritt. Wie sieht Dein Code derzeit aus (nur das OnTimer)?
|
AW: Ballspiel(Pongähnlich)
procedure TForm1.FormCreate(Sender: TObject);
begin Shape1.Left:= Shape1.Left+5; Shape1.Top:= Shape1.Top+5; end; end. wenn du das meinst |
AW: Ballspiel(Pongähnlich)
OK, mich wundert zwar, dass die Methode FormCreate heißt, aber wenn Du sie dem Timer zugewiesen hast, ist das auch OK. Als Nächstes brauchst Du die 2 Variablen, nennen wir sie mal VersatzX und VersatzY. Die müssen unbedingt global sein (normalerweise würde ich sie zwar nicht als globale Variablen deklarieren, aber der Einfachheit halber machen wir das hier mal).
Delphi-Quellcode:
Und in Deinem Code ersetzt Du nun jeweils die 5 durch VersatzX für den Versatz auf der X-Achse(also Left) und VersatzY auf der Y-Achse(also Top).
implementation
{$R *.dfm} var VersatzX: integer = 5; VersatzY: integer = 5; |
AW: Ballspiel(Pongähnlich)
Hab ich gemacht, funktioniert auch.
Habe mich auch schon gewundert warum das so heist, irgendwie unlogisch für mich aber egal. Was muss ich als nächstes machen? |
AW: Ballspiel(Pongähnlich)
Nun kommt die Kollisionskontrolle. Eine Kollision auf der X-Achse liegt ja dann vor, wenn
- die linke Seite des Shapes kleiner oder gleich 0 oder - die rechte Seite des Shapes (ergibt sich aus Left + Width des Shapes) größer oder gleich ClientWidth des Formulars ist. Das solltest Du also zuerst prüfen. Liegt eine Kollision vor, dann drehst Du das Vorzeichen für VersatzX um, also
Delphi-Quellcode:
Wenn das klappt, lässt sich das ja recht einfach auf die Y-Achse übertragen.
VersatzX := -VersatzX;
|
AW: Ballspiel(Pongähnlich)
Es funktioniert nur der Ball ist schonzu einem Drittel aus dem Feld wieder raus. Wie kann ich das beheben?
|
AW: Ballspiel(Pongähnlich)
Entweder Du tolerierst das oder Du lässt den Ball noch einen "Zwischenschritt" machen. In dem Fall versetzt Du ihn nicht um VersatzX, sondern um -Shape.Left bzw. die Differenz zwischen rechter Shapeseite und Clientbreite des Formulars.
[edit] Das war wahrscheinlich jetzt nicht so richtig verständlich, daher ein Beispiel mit einer lokalen Variablen (wieder nur die X-Achse, etwas Arbeit sollst Du ja noch haben *g*), das macht es leichter:
Delphi-Quellcode:
var
X: integer; begin X := VersatzX; if X < 0 then //Ball bewegt sich nach links begin if Shape1.Left < -X then X := -Shape1.Left; end else //Ball bewegt sich nach rechts begin if ClientWidth < (Shape1.Left + Shape1.Width + X) then X := ClientWidth - (Shape1.Left + Shape1.Width); end; Shape1.Left:= Shape1.Left + X; (* Hier dann noch dasselbe für die Y-Achse, die Kollisionskontrolle und ggf. das Umdrehen des Vorzeichens *) end; |
AW: Ballspiel(Pongähnlich)
wenn ich den code nun einfüge haut er mir leider jedemenge fehlermeldungen raus.
undefinierter bezeichner: Shape1 (kp wieso so heist es ja hier) undefinierter bezeichner: clientwidth ´)´erwartet aber left gefunden anweisung erwartet aber datei ende gefunden verwendete unit`unit1´kann nicht compiliert werden |
AW: Ballspiel(Pongähnlich)
Wo hast Du ihn denn eingefügt? Der Code gehört mit in den Timer-Code.
|
AW: Ballspiel(Pongähnlich)
Da habe ich es auch gemacht, so sieht es aus
begin Shape1.Left:= Shape1.Left+VersatzX; Shape1.Top:= Shape1.Top+VersatzY; if (0 >= self.Shape1.Left) or (self.Shape1.Left >= self.Width - self.Shape1.width) then VersatzX := -VersatzX end; var X: integer; begin X := VersatzX; if X < 0 then //Ball bewegt sich nach links begin if Shape1.Left < -X then X := - Shape1.Left; end else //Ball bewegt sich nach rechts begin if ClientWidth < (Shape1.Left + Shape1.Width + X) then X := ClientWidth - (Shape1.Left + Shape1.Width); end; Shape1.Left:= Shape1.Left + X; (* Hier dann noch dasselbe für die Y-Achse, die Kollisionskontrolle und ggf. das Umdrehen des Vorzeichens *) end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz