![]() |
|||
| HSG |
|
Die Ampel soll ihren 'Aufhängepunkt' (x/y) jeweils links oben (von der Ampel her gesehen) haben.
Ihre Größe soll über den Radius r der runden Lichter bestimmt werden. Es soll möglich sein, die
Ampel in 4 Orientierungen o zu zeichnen: 0 = SN-Richtung, 1 = OW-Richtung, 2 = NS-Richtung,
3 = WO-Richtung. Die Lichter der Ampel werden über die booleschen Variablen rot, gelb und
gruen gesteuert. Die Ampel wird direkt in die canvas gezeichnet.
Ampelzeichnen.zip
unit uAmpel;
interface
uses
Graphics; // für canvas usw.
type
TAmpel = class(TObject)
private
{ Private-Deklarationen }
public
class procedure zeichne_Ampel(canvas : TCanvas;
x,y,r,o : integer;rot,gelb,gruen : boolean);
class procedure zeichne_kleineAmpel(canvas : TCanvas;
x,y,r,o : integer;rot,gruen : boolean);
end;
implementation
const // Ampelfarben
grau = $00404040; // XBGR
rot_an = $000000FF;
rot_aus = $00000055;
gelb_an = $0000FFFF;
gelb_aus = $00005555;
gruen_an = $0000FF00;
gruen_aus = $00005500;
class procedure TAmpel.zeichne_Ampel(canvas : TCanvas;
x,y,r,o : integer;rot,gelb,gruen : boolean);
begin
with canvas do
case o of
0 : begin
// Ampelkasten
Brush.Color := grau; Rectangle(x,y,x+3*r,y+8*r);
// Rot-Licht
if rot then Brush.Color := rot_an else Brush.Color := rot_aus;
Ellipse(x+round(0.5*r),y+round(0.5*r), x+round(2.5*r),y+round(2.5*r));
// Gelb-Licht
if gelb then Brush.Color := gelb_an else Brush.Color := gelb_aus;
Ellipse(x+round(0.5*r),y+3*r, x+round(2.5*r),y+5*r);
// Grün-Licht
if gruen then Brush.Color := gruen_an else Brush.Color := gruen_aus;
Ellipse(x+round(0.5*r),y+round(5.5*r), x+round(2.5*r),y+round(7.5*r));
// Stange
Brush.Color := grau;
Rectangle(x+round(1.25*r),y+8*r,x+round(1.75*r),y+16*r);
end;
1 : begin
// Ampelkasten
Brush.Color := grau; Rectangle(x,y,x+8*r,y-3*r);
// Rot-Licht
if rot then Brush.Color := rot_an else Brush.Color := rot_aus;
Ellipse(x+round(0.5*r),y-round(0.5*r), x+round(2.5*r),y-round(2.5*r));
// Gelb-Licht
if gelb then Brush.Color := gelb_an else Brush.Color := gelb_aus;
Ellipse(x+3*r,y-round(0.5*r), x+5*r,y-round(2.5*r));
// Grün-Licht
if gruen then Brush.Color := gruen_an else Brush.Color := gruen_aus;
Ellipse(x+round(5.5*r),y-round(0.5*r), x+round(7.5*r),y-round(2.5*r));
// Stange
Brush.Color := grau;
Rectangle(x+8*r,y-round(1.25*r),x+16*r,y-round(1.75*r));
end;
2 : begin
// Ampelkasten
Brush.Color := grau; Rectangle(x-3*r,y,x,y-8*r);
// Rot-Licht
if rot then Brush.Color := rot_an else Brush.Color := rot_aus;
Ellipse(x-round(2.5*r),y-round(0.5*r), x-round(0.5*r),y-round(2.5*r));
// Gelb-Licht
if gelb then Brush.Color := gelb_an else Brush.Color := gelb_aus;
Ellipse(x-round(2.5*r),y-round(3*r), x-round(0.5*r),y-round(5*r));
// Grün-Licht
if gruen then Brush.Color := gruen_an else Brush.Color := gruen_aus;
Ellipse(x-round(2.5*r),y-round(5.5*r), x-round(0.5*r),y-round(7.5*r));
// Stange
Brush.Color := grau;
Rectangle(x-round(1.75*r),y-8*r,x-round(1.25*r),y-16*r);
end;
3 : begin
// Ampelkasten
Brush.Color := grau; Rectangle(x-8*r,y+3*r,x,y);
// Rot-Licht
if rot then Brush.Color := rot_an else Brush.Color := rot_aus;
Ellipse(x-round(2.5*r),y+round(2.5*r), x-round(0.5*r),y+round(0.5*r));
// Gelb-Licht
if gelb then Brush.Color := gelb_an else Brush.Color := gelb_aus;
Ellipse(x-5*r,y+round(2.5*r), x-3*r,y+round(0.5*r));
// Grün-Licht
if gruen then Brush.Color := gruen_an else Brush.Color := gruen_aus;
Ellipse(x-round(7.5*r),y+round(2.5*r), x-round(5.5*r),y+round(0.5*r));
// Stange
Brush.Color := grau;
Rectangle(x-16*r,y+round(1.75*r),x-8*r,y+round(1.25*r));
end;
end; // of case
end;
....
Die Ampel-Prozeduren sind Klassenmethoden, dh. sie lassen sich ohne Erzeugung einer Instanz von TAmpel nutzen:
.... uses ..., uAmpel; .... procedure TForm1.bAmpelClick(Sender: TObject); var x,y,r,o : integer; rot,gelb,gruen : boolean; begin x := StrToInt(eX.Text); y := StrToInt(eY.Text); r := StrToInt(eR.Text); o := StrToInt(eO.Text); rot := cbRot.Checked; gelb := cbGelb.Checked; gruen := cbGruen.Checked; TAmpel.zeichne_Ampel(canvas,x,y,r,o,rot,gelb,gruen); end; ....