Delphi 经典游戏程序设计40例 的学习 例28 残留的轨迹是正弦曲线

 

 

unit R28;

interface

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

type
  TRei28 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    ScrollBar1: TScrollBar;
    ScrollBar2: TScrollBar;
    ScrollBar3: TScrollBar;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Image1: TImage;
    Timer1: TTimer;
    Edit3: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure ScrollBar2Change(Sender: TObject);
    procedure ScrollBar3Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Rei28: TRei28;
  St : Byte;        //按钮控制,设置状态控制指示用变量
  X,Y,DX,DY,C,W : Integer;   //X,Y 坐标用变量,DX,DY 坐标增量(变化量)用变量,C 周期用变量,W 振幅用变量
  DR,TR : Extended;          //DR  弧度的变化量,TR 现在的弧度(总幅度)
  RectD : TRect;



implementation

{$R *.dfm}

procedure TRei28.FormCreate(Sender: TObject);
begin   //设置初始值,
  St := 0 ;
  C := 140;
  W := 100;
  DY := 2;
  ScrollBar1.Position := C;
  ScrollBar2.Position := W;
  ScrollBar3.Position := DY;
end;

procedure TRei28.Timer1Timer(Sender: TObject);
begin
  case St of
    0: begin
      RectD := Rect(0,0,Image1.Width,Image1.Height);
      Image1.Canvas.Brush.Color := clBlack;
      Image1.Canvas.FillRect(RectD);   //刷黑
      Edit1.Text := ' ' + IntToStr(C); //显示参数
      Edit2.Text := ' ' + IntToStr(W * 2);
      Edit3.Text := ' ' + IntToStr(DY);
      X := Image1.Width div 2;    //X 起点,居中
      Y := 0;                     //Y 起点
      DR := 2 * Pi * DY / C;      //弧度变化量 计算公式
      if Random(2) = 0 then       //设置初始弧度
        TR := 0
      else
        TR := Pi;
      St := 1;                    //进入下一状态
    end;

    1: begin
      DX := Round(W * (Sin(TR + DR) - Sin(TR)));  //根据公式计算DX ,
      TR := TR + DR;                              //弧度累加,为下次计算DX
      X := X + DX;
      Y := Y + DY;
      Image1.Canvas.Pixels[X,Y] := clWhite;
      Image1.Canvas.Pixels[X + 1,Y] := clWhite;
      if (Y > Image1.Width) then                 // 画到图底后进入停止状态
        St := 2;
    end;
  end;
end;

procedure TRei28.ScrollBar1Change(Sender: TObject);
begin
  C := ScrollBar1.Position;
  Edit1.Text := ' ' + IntToStr(C);
  DR := 2 * Pi * DY / C;                        //应该去掉这行,否则在绘图中会即时的改变
end;                                            //似乎又不行,在状态1中,W,DY值都被在计算
                                                // 所以这里只有同步重新计算DR值
procedure TRei28.ScrollBar2Change(Sender: TObject);
begin
   W := ScrollBar2.Position;
   Edit2.Text := ' ' + IntToStr(W * 2);
end;

procedure TRei28.ScrollBar3Change(Sender: TObject);
begin
  DY := ScrollBar3.Position;
  Edit3.Text := ' ' + IntToStr(DY);
  DR := 2 * Pi * DY / C;                        // 所以这里只有同步重新计算DR值
end;

procedure TRei28.Button1Click(Sender: TObject);
begin
  St := 0;
end;

end.

1,结构同 例 27

2,例27应用的是抛物线,本例才是三角函数。

 

posted @ 2022-09-08 16:49  D7mir  阅读(59)  评论(0)    收藏  举报