Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - wie erstellt man Pong


Delphi-Zone - Mo 20.09.10 20:37
Titel: wie erstellt man Pong
Hallo,

Ich hab mich mal gefragt, wenn man jetzt z.b Pong proggen möchte.

Wie sag ich dem ball den das er wenn er so eine scheibe berührt , die richtung ändern soll?
und wie erstell ich so ein ball? kann das ein image sein oder durch canvas.moveto(x)(y)
canvas.lineTo(x)(y)???


Danke im Vorraus!

Gruß Tom


Tilman - Mo 20.09.10 22:15

Es kann ein Image sein, oder du kannst es mit Canvas selbst malen, beides ist möglich :)

Und das mit der Richtung würde ich etwa so machen:
-> du definierst eine bzw. zwei Variablen für die Bewegung, z.B. BewegungX und BewegungY. Beide werden mit einem Wert, etwa 1, belegt.
-> Durch einen Timer lässt du den Ball bewegen, z.B. ball.left := ball.left + BewegungX;
-> ausserdem musst du prüfen ob der Ball schon zu weit geflogen ist: if ball.left > 300 then...
-> wenn der Ball zu weit geflogen ist, dann muss die Bewegung umgekehrt werden. Das erreichst du mit BewegungX := -BewegungX;, damit wird der positive Wert negativ, oder wenn er negativ ist dann wird er damit positiv.

Natürlich musst du auch abfragen ob der Ball dann zuweit nach links geflogen ist, und die Y-Koordinate berücksichtigen. Und die Breite vom Ball musst du auch noch mit reinrechnen, aber das kannst du vielleicht alles selbst :)


Hidden - Di 21.09.10 01:51

Abend :)

1.: Auf den Editieren-Button oben an deinem ersten Posting klicken, und einen vielsagenderen Titel geben. :P
2.: Weiterlesen ;)

Ich würde ganz langsam, einen Schritt nach dem anderen machen: Zuerst einmal ein Bild zeichnen, und es zum Bewegen bringen.
Dazu: Wir ziehen einen Timer und eine Paintbox auf das Formular. Unter den Ereignissen im Object Inspector links suchen wir bei der Paintbox ein OnPaint - und doppelklicken in das leere Feld rechts davon.
Delphi erstellt die Methode Paintbox1Paint für uns. Die implementieren wir. Auf die gleiche Weise erstellen wir die OnTimer-Methode von Timer1, und stellen Enabled auf true. Deklarieren wir noch zwei Variablen, in denen wir uns die Position des Balls merken, haben wir alles.

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:
type
  TForm1 = class(TForm)
  {..}
  private
    {private declarations}
    FX, FY: Integer;
  end;

{..}

implementation

{..}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FX := 10;  //Initialisieren: Am Anfang den Ball nach unten links.
  FY := Paintbox1.Height - 10;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  FX := FX + 1;  //Den Ball bewegen
  FY := FY - 1;
  Paintbox1.Repaint;
end;

procedure TForm1.Paintbox1Paint(Sender: TObject);
begin
  Paintbox1.Canvas.Brush.Color := clWhite;  //Hintergrund weiß, hebt sich vom Formularhintergrund ab
  Paintbox1.Canvas.FillRect(Paintbox1.ClientRect);  //Neu zeichnen: Bisheriges auf der PBox weiß übermalen
  Paintbox1.Canvas.Brush.Color := clRed;  //Füllfarbe
  Paintbox1.Canvas.Pen.Color := clBlue;  //Randfarbe
  Paintbox1.Canvas.Ellipse(FX - 10, FY - 10, FX + 10, FY + 10);  //Kreis zeichnen; r=10, M=(FX, FY)
end;


thepaine91 - Di 21.09.10 09:07

Ich würde das mit OpenGL realisieren. Dann ist es auch noch performant.
Aber Delphi liefert in seinen Beispielen bereits ein PinBall mit nennt sich glaube ich Earthball da kann man sich das mal abgucken und auf Pong übertragen. (D7 war es zumindest dabei)


Hidden - Di 21.09.10 13:14

Moin!

Ist OpenGL nicht eher etwas für Fortgeschrittene? ;)
Sicherlich kann man damit auch einsteigen, aber den Umgang mit der Default-Zeichenoberfläche Canvas sollte man ihmo dringender beherrschen :)

lg,


Delphi-Zone - Di 21.09.10 13:32

Hiho!

Ich danke für die vielen Antworten!

Ich werde das nachher gleich mal probieren!

Gruß Tom