Показать сообщение отдельно
  #10  
Старый 28.02.2012, 04:51
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

При использовании класса-наследника, меняется немного:
Код:
unit Unit2;
 
interface

uses
  Windows, Messages, SysUtils, Graphics;

type
  TCustomBabina = class
  private
    fCanvas     : TCanvas;
    fAlpha,
    fSpeed,
    fDrift,
    fScale     : Single;
  protected
    procedure Babina(a : Single; wid, x, y, r : Integer);
    procedure Line(x1, y1, x2, y2, wid : Integer);
  public
    procedure Draw;

    property Alpha : Single read fAlpha write fAlpha;
    property Speed : Single read fSpeed write fSpeed;
    property Drift : Single read fDrift write fDrift;
    property Scale : Single read fScale write fScale;
  end;

  TBabina       = class(TCustomBabina)
  public
    constructor Create(Canvas : TCanvas);

    property Alpha;
    property Speed;
    property Drift;
    property Scale;
  end;

implementation

procedure TCustomBabina.Draw;                               // расчет новых значений
var
  l1, l2 : Single;
begin
  l1 := 7 - Round(fDrift / 1.5) mod 25;
  Line(75 + Round(l1), 206, 300 + Round(l1), 206, 7);
  l1 := Frac(fDrift / 200 / Pi) * Pi;
  Babina(fAlpha / 180 * Pi + l1, 10, 300, 100, 100);
  l2 := Frac(fDrift / 150 / Pi) * Pi;
  Babina(fAlpha / 180 * Pi + l2, 10, 75, 125, 75);
  if (Round(l1 * 1000) = 0) and (Round(l2 * 1000) = 0) then
    fDrift := 0;
  fDrift := fDrift + fSpeed;
end;

procedure TCustomBabina.Line(x1, y1, x2, y2, wid : Integer);    // рисование толстой пунктирной линии
var
  I : Integer;
begin
  with fCanvas do
  begin
    Pen.Width := 1;
    Pen.Style := psDash;
    Pen.Color := clBlack;
    for I := 0 to wid - 1 do
    begin
      MoveTo(Round(x1 * fScale), Round(y1 * fScale) - I);
      LineTo(Round(x2 * fScale), Round(y2 * fScale) - I);
    end;
  end;
end;

procedure TCustomBabina.Babina(a : Single; wid, x, y, r : Integer); // рисование бабины(колесо с 4 спицами)
begin
  with fCanvas do
  begin
    Pen.Color := clMaroon;
    Pen.Width := wid;
    wid := wid div 2;
    Brush.Color := clBtnFace;
    Ellipse(Round((x + wid - r) * fScale), Round((y + wid - r) * fScale), Round((x + wid + r) * fScale), Round((y + wid + r) * fScale));
    Dec(r);
    MoveTo(Round((x + wid + Round(r * Sin(a))) * fScale), Round((y + wid - Round(r * Cos(a))) * fScale));
    LineTo(Round((x + wid - Round(r * Sin(a))) * fScale), Round((y + wid + Round(r * Cos(a))) * fScale));
    MoveTo(Round((x + wid - Round(r * Cos(a))) * fScale), Round((y + wid - Round(r * Sin(a))) * fScale));
    LineTo(Round((x + wid + Round(r * Cos(a))) * fScale), Round((y + wid + Round(r * Sin(a))) * fScale));
  end;
end;

constructor TBabina.Create(Canvas : TCanvas);
begin
  inherited Create;
  fCanvas := Canvas;
end;

end.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием