Der Epina Delphi-Kurs bietet Ihnen eine allgemeine Einführung in das Programmieren mit Delphi/Pascal. Mit vielen ausgearbeiteten Beispielen können Sie direkt in die Delphi-Programmierung einsteigen. Mehr dazu finden Sie hier....

4. Programm: Bounce

Wir schreiben nun ein kleines Programm, das eine farbige Scheibe über das Formular wandern lässt, wobei die Scheibe nach und nach das Formular füllt. Dazu verwenden wir einen Timer, der in regelmäßigen Abständen die Scheibe verschiebt und neu zeichnet. Es entsteht dadurch eine Schlange, die immer länger wird und das Formular immer mehr zudeckt.

Wie kann man nun diese Scheibe dazu bringen, dass sie an einer vorgegebenen Grenze abprallt und sich wie eine Kugel im Billard verhält? Die Lösung dafür ist sehr einfach: Man braucht nur die Position der Scheibe überprüfen; falls sie eine Grenze überschreitet wird einfach das Vorzeichen des Positionsinkrements umgekehrt (für x- und y-Richtung getrennt).

 

Schritt Aktivität Anmerkungen
1. Erzeugen Sie eine neue Applikation und speichern Sie diese ab. Details im Programm 1
2. Platzieren Sie einen Timer auf dem Formular. Der Timer ist eine nicht-visuelle Komponente und befindet sich auf der Komponenten-Palette 'System'. Nicht-Visuelle Komponenten werden durch ein Icon symbolisiert.
3. Definieren der Grenzen und der Schrittweite Zur Definition der Schrittweite und der Grenzen werden entsprechende Konstanten deklariert, die im ganzen Programm gültig sind. Die Einheiten sind in Pixel.
  const
    STEP_WIDTH = 7;
    LEFT_BORDER = 50;
    TOP_BORDER = 50;
    RIGHT_BORDER = 400;
    BOTTOM_BORDER = 300;
4. Deklaration der benötigten Variablen Um die Position berechnen zu können werden vier Variable benötigt:
  var
    PosX  : integer;
    PosY  : integer;
    StepX : integer;
    StepY : integer;
5. Stellen Sie das Timer-Intervall auf 200 (ms) und erzeugen Sie den OnTimer Event. Im OnTimer Event wird die Position der Scheibe neu berechnet und gezeichnet. Wir benötigen dazu vier globale Variable, die die Position (x und y) und die Schrittrichtung (für x und y) vorgeben. Es wird zuerst die neue Position errechnet und dann überprüft, ob die Grenzen überschritten worden sind. Im Fall eines Überschreitens wird die Schrittrichtung entsprechend gesetzt:
  posX := posX + StepX;
  posY := posY + StepY;
  if posX < LEFT_BORDER then
    StepX := STEP_WIDTH;
  if posX > RIGHT_BORDER then
    StepX := -STEP_WIDTH;
  if posY < TOP_BORDER then
    StepY := STEP_WIDTH;
  if posY > BOTTOM_BORDER then
    StepY := -STEP_WIDTH;
  Canvas.Ellipse(posX-8, posY-8, posX+8, posY+8);
Man beachte, dass sowohl die Schrittweite als auch die Grenzen durch Konstante bestimmt sind.
6. Initialisierung der Werte Damit das Programm ordentlich funktioniert müssen die beteiligten Variablen, so wie die Farben des Zeichengeräts initialisiert werden. Dies geschieht am besten im OnShow Event, der unmittelbar bevor das Formular vom Betriebssystem auf den Bildschirm gebracht wird ausgelöst wird:
PosX := 0;
PosY := 0;
Canvas.Brush.Color := clYellow;
Canvas.Brush.Style := bsSolid;
Canvas.Pen.Color := clMaroon;

Frage: Wieso verschwindet die Schlange, wenn man das Formular des Programms 'Bounce' kurz mit einem anderen Fenster überdeckt? (Antwort: siehe Neuzeichnen des Canvas).

Download: prog_004.zip [2 kB]

Beispiel: Zum besseren Überblick nochmals alle Zeilen dieses Programms:
unit mainfrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  STEP_WIDTH = 7;
  LEFT_BORDER = 50;
  TOP_BORDER = 50;
  RIGHT_BORDER = 400;
  BOTTOM_BORDER = 300;

var
  PosX  : integer;
  PosY  : integer;
  StepX : integer;
  StepY : integer;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
posX := posX + StepX;
posY := posY + StepY;
if posX < LEFT_BORDER then
  StepX := STEP_WIDTH;
if posX > RIGHT_BORDER then
  StepX := -STEP_WIDTH;
if posY < TOP_BORDER then
  StepY := STEP_WIDTH;
if posY > BOTTOM_BORDER then
  StepY := -STEP_WIDTH;
Canvas.Ellipse(posX-8, posY-8, posX+8, posY+8);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
PosX := 0;
PosY := 0;
Canvas.Brush.Color := clYellow;
Canvas.Brush.Style := bsSolid;
Canvas.Pen.Color := clMaroon;
end;

end.

Last Update: 2008-09-09