this slowpoke moves

Screensaver Matrix Style

type
	TMot = record
  Chaine : String;
  Colonne : Integer;
	Red, Green, Blue : Byte;
  Index : Double;
  Longueur : Integer;
  TailleFont : Integer;
  Vitesse : Double;
end;

private
    { Private declarations }
    Liste : TList;
    SavePoint : TPoint;
    NbColonnes : Integer;
    NbLignes : Integer;
    TableauChaine : Array of String;
    procedure CreerMot;

const
  NbMotCreate = 20;
  NbMotMax = 80;
  
//

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
	Close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
	Index, Index2 : Integer;
  PMot : ^TMot;
begin

	for Index := 0 to Liste.Count - 1 do
  begin
    PMot := Liste.Items[Index];
		Canvas.Font.Size := PMot.TailleFont;
    for Index2 := 0 to PMot.Longueur - 1 do
    begin
      Canvas.Font.Color := clBlack;
      Canvas.TextOut(10 + PMot.Colonne * 20,
                     5 + Round((PMot.Index - PMot.Vitesse - Index2) * 20),
                     Copy(PMot.Chaine, Index2 + 1, 1));
      Canvas.Font.Color:= RGB(PMot.Red, PMot.Green, PMot.Blue);
      if Index2 > 4 then Canvas.Font.Color := RGB(PMot.Red, PMot.Green, PMot.Blue)
      else Canvas.Font.Color := RGB((PMot.Red + (4 - Index2) * (255 - PMot.Red) div 4),
                                    (PMot.Green + (4 - Index2) * (255 - PMot.Green) div 4),
                                    (PMot.Blue + (4 - Index2) * (255 - PMot.Blue) div 4));
      Canvas.TextOut(10 + PMot.Colonne * 20,
                     5 + Round((PMot.Index - Index2) * 20),
                     Copy(PMot.Chaine, Index2 + 1, 1));
    end;
    PMot.Index := PMot.Index + PMot.Vitesse;
  end;
	for Index := Liste.Count - 1 downto 0 do
  begin
    PMot := Liste.Items[Index];
  	if PMot.Index - PMot.Longueur >= NbLignes then
    begin
      Dispose(Liste.Items[Index]);
      Liste.Delete(Index);
    end;
	end;
  if Liste.Count >= NbMotMax then Exit;
  CreerMot;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
	Index : Integer;
begin
  Randomize;
  Liste := TList.Create;
  WindowState := wsMaximized;
  SavePoint.x := Mouse.CursorPos.x;
  SavePoint.y := Mouse.CursorPos.y;
  NbColonnes := Round(Screen.Width / 20);
  NbLignes := Round(Screen.Height / 20);
  Setlength(TableauChaine, 5);
  TableauChaine[0] := ' SU DNUORA LLA SI XIRTAM EHT';
  TableauChaine[1] := ' NOISIVELET HCTAW UOY NEHW EREHT SI TI';
  TableauChaine[2] := ' OEN DLROWMAERD A NI EVIL UOY';
  TableauChaine[3] := ' ENO EHT SI EH';
  TableauChaine[4] := ' SUEHPROM YTINIRT OEN';
  for Index := 0 to NbMotCreate - 1 do CreerMot;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
	Close;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(Liste);
end;

procedure TForm1.CreerMot;
var
	Index : Integer;
  PMot : ^TMot;
  ColonneTrouvee : Boolean;
  ChoixColonne : Integer;
  PMot2 : ^TMot;
  NombreTest : Integer;
begin
	
  New(PMot);
  PMot.Chaine := '';
	
  NombreTest := 0;
  ColonneTrouvee := False;
  ChoixColonne := 0;
	while (not ColonneTrouvee) and (NombreTest < 10) do
  begin
    ChoixColonne := Random(NbColonnes);
    Inc(NombreTest, 1);
    if Liste.Count = 0 then ColonneTrouvee := True;
    for Index := 0 to Liste.Count - 1 do
    begin
      PMot2 := Liste.Items[Index];
      if PMot2.Colonne = ChoixColonne then
      begin
        if PMot2.Index - PMot2.Longueur >= 1 then
        begin
  	      ColonneTrouvee := True;
	        Break;
        end
        else Break;
      end
      else if Index = Liste.Count - 1 then ColonneTrouvee := True;
    end;
  end;
  PMot.Colonne := ChoixColonne;
  PMot.Green := Random(155) + 100;
  PMot.Red := 20 + 105 * (PMot.Green - 100) div 155;
  PMot.Blue := 20 + 105 * (PMot.Green - 100) div 155;
  PMot.TailleFont := Round(9 + 4 * (PMot.Green - 100) / 155);
  PMot.Index := 0;
  PMot.Vitesse := Random(5) / 10 + 0.4;
  if PMot.TailleFont <> 13 then
  begin
  	if Random(2) = 0 then
    begin
		  PMot.Chaine := TableauChaine[Random(5)];
		  PMot.Longueur := Length(PMot.Chaine);
    end
    else begin
      PMot.Longueur := Random(20) + 10;
      for Index := 0 to PMot.Longueur - 1 do
      PMot.Chaine := PMot.Chaine + Chr(97 + Random(26));
    end;
  end
  else begin
	  PMot.Longueur := Random(20) + 10;
	  for Index := 0 to PMot.Longueur - 1 do
  	PMot.Chaine := PMot.Chaine + Chr(-32 + 97 + Random(26));
  end;
  Liste.Add(PMot);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
	if (X <> SavePoint.x) or (Y <> SavePoint.y) then Close;
end;

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate