Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Спасибо за статью. Я не Ваш студент. Но мне она помогла написать функцию для Канторова множества на Python для черепашки: import turtle def kanter(x, y, d):     if d > 1:         turtle...
Как реализовать в данном примере границы расчёта?

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Язык программирования: 
Pascal
Среда программирования: 
Lazarus IDE v.1.8.4


unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    ARect : TRect;
    BitMap : TBitMap;
 
  public
    procedure Eyes();
    procedure Fly(ind, kx, ky: integer);
  end;
 
var
  Form1: TForm1;
  fd: array [1..10] of byte;
  er: TRect;
  fr: array [1..10] of TRect;
  ebm: TBitMap;
  fbm: array [1..10] of TBitMap;
  fs, i, k, j, f, x11, x21, y11, y21, e, x12, x22, y12, y22, x13, x23, y13, y23:integer;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Eyes();
begin
  arect:=rect(0,0,er.Width,er.Height);
  paintbox1.Canvas.CopyRect(er,ebm.Canvas,arect); //восстановление зоны глаз
  with PaintBox1.Canvas do begin
    Brush.Color:=RGBToColor(32,29,37);
    Pen.Color:=RGBToColor(32,29,37);
    Ellipse(310+e, 190, 320+e, 220); //левый зрачок
    Ellipse(370+e, 190, 380+e, 220); //правый зрачок
  end;
end;
 
procedure TForm1.Fly(ind, kx, ky: integer);
begin
  arect:=rect(0,0,fs,fs);
  paintbox1.Canvas.CopyRect(fr[ind],fbm[ind].Canvas,arect); //восстановление зоны под светлячком
  fr[ind].Left:=fr[ind].Left+kx;
  fr[ind].Top:=fr[ind].Top+ky;
  fr[ind].Width:=fs;
  fr[ind].Height:=fs;
  fbm[ind].Canvas.CopyRect(arect,bitmap.Canvas,fr[ind]); //сохранение зоны нового положения светлячка
  with paintbox1.Canvas do begin
    Brush.Color:=RGBToColor(250,190,40);
    Pen.Color:=RGBToColor(250,190,40);
    Ellipse(fr[ind]);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  PaintBox1.Canvas.Brush.Color:=RGBToColor(46,61,108); //фон
  PaintBox1.Canvas.FillRect(PaintBox1.Canvas.ClipRect);
  with Paintbox1.Canvas do begin
    Brush.Color:=RGBToColor(50,49,63); //полка
    Pen.Color:=RGBToColor(50,49,63);
    Rectangle(10,400,535,450);
    Brush.Color:=RGBToColor(33,47,89); //тень
    Pen.Color:=RGBToColor(33,47,89);
    Polygon([Point(10,450),Point(534,450),Point(534,500)]);
    Brush.Color:=RGBToColor(32,29,37);
    Pen.Color:=RGBToColor(32,29,37);
    RoundRect(174,220,424,400,180,180); //тело низ
    RoundRect(240,124,430,400,180,180); //тело верх
    RoundRect(22,340,308,400,60,60); //хвост
    Polygon([Point(274,160),Point(274,110),Point(320,130)]); //левое ухо
    Polygon([Point(350,140),Point(414,112),Point(414,176)]); //правое ухо
    Brush.Color:=RGBToColor(16,198,50);
    Pen.Color:=RGBToColor(16,198,50);
    Ellipse(300, 190, 330, 220); //глаза
    Ellipse(360, 190, 390, 220);
    Brush.Color:=RGBToColor(140,198,16);
    Pen.Color:=RGBToColor(140,198,16);
    Ellipse(303, 193, 327, 217);
    Ellipse(363, 193, 387, 217);
    Brush.Color:=RGBToColor(170,198,16);
    Pen.Color:=RGBToColor(170,198,16);
    Ellipse(306, 196, 324, 214);
    Ellipse(366, 196, 384, 214);
  end;
  fs:=10;
  fr[1].Left:=30;fr[1].Top:=40; //размещение светлячков
  fr[2].Left:=460;fr[2].Top:=400;
  fr[3].Left:=140;fr[3].Top:=360;
  fr[4].Left:=250;fr[4].Top:=170;
  fr[5].Left:=370;fr[5].Top:=260;
  fd[1]:=0;fd[2]:=1;fd[3]:=0;fd[4]:=1;fd[5]:=0; //направление светлячков - 0 для движения слева направо сверху вниз, 1 - наоборот
  fr[6].Left:=random(545);fr[6].Top:=random(545);
  fr[7].Left:=random(545);fr[7].Top:=random(545);
  fr[8].Left:=random(545);fr[8].Top:=random(545);
  fr[9].Left:=random(545);fr[9].Top:=random(545);
  fr[10].Left:=random(545);fr[10].Top:=random(545);
  fd[6]:=0;fd[7]:=1;fd[8]:=0;fd[9]:=1;fd[10]:=0;
  BitMap:=TBitmap.Create;
  BitMap.Width:=PaintBox1.Width;
  BitMap.Height:=PaintBox1.Height;
  ARect:=Rect(0,0,PaintBox1.Width,PaintBox1.Height);
  BitMap.Canvas.CopyRect(ARect,PaintBox1.Canvas, ARect); //сохранение всего фона
  er:=Rect(300,190,390,220);
  ebm:=TBitMap.Create;
  ebm.Width:=er.Width;
  ebm.Height:=er.Height;
  arect:=rect(0,0,er.Width,er.Height);
  ebm.Canvas.CopyRect(arect,bitmap.Canvas,er); //сохранение исходной зоны под глаза
  for i:=1 to 10 do begin
    fbm[i]:=TBitMap.Create;
    fbm[i].Width:=fs;
    fbm[i].Height:=fs;
    fr[i].Width:=fs;
    fr[i].Height:=fs;
    arect:=rect(0,0,fs,fs);
    fbm[i].Canvas.CopyRect(arect,bitmap.Canvas,fr[i]); //сохранение исходной зоны под светлячка
  end;
  e:=0;
  Eyes();
  Timer1.Interval:=500; //таймер для смещения глаз
  Timer1.Enabled:=true;
  Timer2.Interval:=10; //таймер для движения светлячков
  Timer2.Enabled:=true;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  e:=random(10)-random(9);
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Eyes();
  for i:=1 to 10 do begin
    Fly(i,random(5-fd[i])-random(5-(1-fd[i])),random(5-fd[i])-random(5-(1-fd[i])));
    if (fr[i].Left>paintbox1.Width) and (fd[i]=0) then begin //вылет через правый край
       fr[i].Left:=-15;
       fr[i].Width:=fs;
    end;
    if (fr[i].Top>paintbox1.Height) and (fd[i]=0) then begin //вылет через нижний край
       fr[i].Top:=-5;
       fr[i].Height:=fs;
    end;
    if (fr[i].Right<0) and (fd[i]=1) then begin //вылет через левый край
       fr[i].Left:=550;
       fr[i].Width:=fs;
    end;
    if (fr[i].Bottom<0) and (fd[i]=1) then begin //вылет через верхний край
       fr[i].Top:=550;
       fr[i].Height:=fs;
    end;
  end;
end;
 
end.

Прикрепленный файлРазмер
Cat.zip3.46 кб