Delphi-PRAXiS

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)

karrax 6. Nov 2013 14:41

Ballspiel(Pongähnlich)
 
Hallo Com,
habe eine Frage undzwar wurde mir die Aufgabe gestellt, das ich mit einem Timer ein Shape durch den ganzen
Bildschirm fliegen lassen soll und wenn es an die Bildschirmränder prallt soll es die Richtung ändern.
Ich habe leider keine Ahnung wie ich die sache in angriff nehmen muss.
Ich weis das der Befehl x := -x die Bewegungsrichtung ändert, dass war es aber auch.
Wäre schön wenn man mir helfen kann

Karrax

Back2Code 6. Nov 2013 14:52

AW: Ballspiel(Pongähnlich)
 
Auf welcher Komponente / Hintergrund willst du den Ball zeichnen?

Du könntest ein Drawgrid nehmen dann lässt du die Bewegungen mithilfe eines Arrayes ablaufen und am Rand wechselt es dann wieder die Richtung wenn der Ball entweder auf 0 oder das Ende vom Array trifft.

baumina 6. Nov 2013 14:58

AW: Ballspiel(Pongähnlich)
 
Ich gehe mal davon aus, dass du so eine Art "fertige Lösung" suchst. Wie wäre es z.B. damit? http://www.youtube.com/watch?v=FsI8cyhVbWw

Back2Code 6. Nov 2013 15:20

AW: Ballspiel(Pongähnlich)
 
Schau dir das mal an

http://delphi.about.com/od/gameprogr.../fdac_pong.htm

http://delphi.about.com/od/gameprogramming/

DeddyH 6. Nov 2013 15:21

AW: Ballspiel(Pongähnlich)
 
Stichwort für die Forensuche: Hier im Forum suchenKollisionskontrolle, damit sollten sich etliche Beispiele finden lassen.

karrax 6. Nov 2013 16:40

AW: Ballspiel(Pongähnlich)
 
Es soll kein Pong sein nur so etwas ähnliches.
Als Ball wollte ich ein Shape verwenden und es Rund machen. Dieser Ball soll dann einfach im Bildschirm rumfliegen und wenn er gegen eine Wand prallt dann die Richtung ändern.
Dafür darf ich aber nue einen Timer verwenden

DeddyH 6. Nov 2013 16:52

AW: Ballspiel(Pongähnlich)
 
Dann pack doch einen Timer auf die Form und ändere innerhalb dessen OnTimer-Ereignisses die Position des Shapes. Wenn das klappt, implementiere noch die Kollisionskontrolle und fertig.

karrax 6. Nov 2013 17:01

AW: Ballspiel(Pongähnlich)
 
sorry das ich nachfragen muss aber habe erst seid sehr kurzem delphi. was genau soll ich denn in dem timer einstellen und wie mache ich das mit der kollision?

DeddyH 6. Nov 2013 17:07

AW: Ballspiel(Pongähnlich)
 
Du hast einen Timer und ein Shape. Für den Timer sind die Eigenschaften Enabled ("timern" oder nicht) und Interval (Zeit in Milisekunden zwischen 2 Auslösern) wichtig. Auf der "Ereignisse"-Seite des Objektinspektors kannst Du dann einen Doppelklick neben "OnTimer" machen, Delphi erstellt Dir dann das Code-Gerüst und weist gleichzeitig diese Methode dem entsprechenden Ereignis automatisch zu. So, innerhalb dieser Methode veränderst Du am Besten testhalber einfach nur mal die Position des Shapes (Left und Top ändern). Danach deklarierst Du Dir 2 Variablen für den gewünschten Versatz auf der X- und der Y-Achse und verwendest diese dann innerhalb der Timer-Methode. Zur Kollisionskontrolle musst Du dann nur noch die aktuellen Koordinaten und Dimensionen mit denen des Formular- bzw. Bildschirmrands vergleichen. Bei Kollision drehst Du dann nur noch das Vorzeichen der entsprechenden Variablen um.

karrax 6. Nov 2013 17:15

AW: Ballspiel(Pongähnlich)
 
Also ich hab geschaft das sich das Shape mit left unf top bewegt. aber bei dem rest blicke ich noch nicht so durch

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.

DeddyH 6. Nov 2013 21:46

AW: Ballspiel(Pongähnlich)
 
Nö, das hast Du eben nicht gemacht. Setz doch übrigens bitte künftig Delphi-Tags, das ist die Schaltfläche mit dem Helm im Beitragseditor, dann wird das auch schön formatiert. Ich mach das hier mal, dann sieht das so aus:
Delphi-Quellcode:
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;

(* Das hier steht nun frei im Raum, damit kann der Compiler nichts anfangen *)
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;
Richtig wäre gewesen:
Delphi-Quellcode:
procedure TDeinForm.DasWasDemTimerZugewiesenIst(Sender: TObject);
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 7. Nov 2013 16:33

AW: Ballspiel(Pongähnlich)
 
danke für alles :)
habe es ohne den befehl hinbekommen


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr.

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