Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Ballspiel(Pongähnlich) (https://www.delphipraxis.net/177435-ballspiel-pongaehnlich.html)

DeddyH 6. Nov 2013 17:21

AW: Ballspiel(Pongähnlich)
 
Prima, das ist schon der erste Schritt. Wie sieht Dein Code derzeit aus (nur das OnTimer)?

karrax 6. Nov 2013 17:50

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

DeddyH 6. Nov 2013 17:54

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:
implementation

{$R *.dfm}

var
  VersatzX: integer = 5;
  VersatzY: integer = 5;
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).

karrax 6. Nov 2013 18:03

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?

DeddyH 6. Nov 2013 18:06

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:
VersatzX := -VersatzX;
Wenn das klappt, lässt sich das ja recht einfach auf die Y-Achse übertragen.

karrax 6. Nov 2013 18:12

AW: Ballspiel(Pongähnlich)
 
Es funktioniert nur der Ball ist schonzu einem Drittel aus dem Feld wieder raus. Wie kann ich das beheben?

DeddyH 6. Nov 2013 18:18

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;

karrax 6. Nov 2013 19:13

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

DeddyH 6. Nov 2013 20:33

AW: Ballspiel(Pongähnlich)
 
Wo hast Du ihn denn eingefügt? Der Code gehört mit in den Timer-Code.

karrax 6. Nov 2013 20:51

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 09:53 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz