unit mKugel;

interface

uses mSuM;

type Kugel = class
       hatStift: Buntstift;         // die Kugel hat einen Buntstift, um sich zu zeichnen
                                    // (Buntstift ist hier für Unterklassen günstiger!)
       kenntBildschirm: Bildschirm; // die Kugel kennt einen Bildschirm als Begrenzung

       zRadius :         Zahl;      // wegen der Pulsierkugel hier als Zahl (nicht GanzeZahl)
       zGeschwindigkeit: Zahl;

       // alle als "virtual" gekennzeichneten Dienste dürfen in Unterklassen überschrieben werden
       constructor init(pAnfangH, pAnfangV: GanzeZahl; pGeschwindigkeit: Zahl; pRichtung: Zahl); virtual;
       procedure   Zeichne; virtual;
       procedure   Loesche; virtual;
       procedure   Bewege; virtual;
       function    hPosition: Zahl;
       function    vPosition: Zahl;
       function    Richtung: Zahl;
       procedure   setzeRichtung(pWinkel: Zahl);
       procedure   merke(pBildschirm: Bildschirm);
       destructor  gibFrei;
     end;

implementation

constructor Kugel.init(pAnfangH, pAnfangV: GanzeZahl; pGeschwindigkeit: Zahl; pRichtung: Zahl);
begin
  zRadius:=5;
  zGeschwindigkeit:=pGeschwindigkeit;
  hatStift := Buntstift.init;
  hatStift.bewegeBis(pAnfangH, pAnfangV);
  hatStift.dreheBis(pRichtung);
end;

procedure   Kugel.Zeichne;
begin
  hatStift.zeichneKreis(zRadius);
end;

procedure   Kugel.loesche;
begin
  hatStift.radiere;
  self.Zeichne;
  hatStift.normal
end;

procedure   Kugel.Bewege;
begin
  self.loesche;
  hatStift.bewegeUm(zGeschwindigkeit);
  if self.hPosition >= (kenntBildschirm.Breite-zRadius-1) then       // am rechten Rand
          self.setzeRichtung(180 - self.Richtung);  // nach links reflektieren
  if self.hPosition <= (zRadius+1) then       // am linken Rand
          self.setzeRichtung(180 - self.Richtung);  // nach rechts reflektieren
  if self.vPosition >= (kenntBildschirm.Hoehe-zRadius-1) then       // am unteren Rand
          self.setzeRichtung(360 - self.Richtung);  // nach oben reflektieren
  if self.vPosition <= (zRadius+1) then       // am oberen Rand
          self.setzeRichtung(360 - self.Richtung);  // nach unten reflektieren
   self.Zeichne;
end;

function    Kugel.hPosition: Zahl;
begin
  result:=hatStift.hPosition
end;

function    Kugel.vPosition: Zahl;
begin
  result:=hatStift.vPosition
end;

function    Kugel.Richtung: Zahl;
begin
  result:=hatStift.winkel
end;

procedure   Kugel.setzeRichtung(pWinkel: Zahl);
begin
  hatStift.dreheBis(pWinkel)
end;

procedure   Kugel.merke(pBildschirm: Bildschirm);
begin
  kenntBildschirm := pBildschirm
end;

destructor  Kugel.gibFrei;
begin
  hatStift.gibFrei;             // Stift wieder freigeben
end;

end.