Главное меню
Главная
Новости
Общие вопросы
Нормативная база
Материалы к урокам
Справочная информация
Документация
Ссылки
Ленты новостей
Контакты
Поиск
Новогодний хранитель экрана Печать E-mail
Автор Олег Ляш   
23.05.2011 г.

Доброго времени суток уважаемые.
Сегодня мы попробуем создать хранитель экрана для Windows и Linux соответственно. Естественно тема хранитель экрана выбрана новогодняя :-).

Наш проект будет включать два модуля: движок (engine.pas) и основной модуль формы (unit1.pas).
Движок (engine.pas) предназначен для выполнения рутинных операций по отрисовке новогодней елки, управлению снегом и т.п.

Доброго времени суток уважаемые.
Сегодня мы попробуем создать хранитель экрана для Windows и Linux соответственно. Естественно тема хранитель экрана выбрана новогодняя :-).

Наш проект будет включать два модуля: движок (engine.pas) и основной модуль формы (unit1.pas).
Движок (engine.pas) предназначен для выполнения рутинных операций по отрисовке новогодней елки, управлению снегом и т.п.

Модуль движка.

  1. unit engine;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, Forms, ExtCtrls,Graphics,GraphType;
  6. Const N=250;//Количество снежинок
  7. {Новый тип данных для хранения информации о снежинке}
  8. type TSnezhinka=record
  9. x,y : integer;//Координаты снежинки
  10. X_Shift, Y_Shift : integer;//Сдвиг снежинки по осям OX и OY
  11. Size : integer;//Размер снежинки
  12. color : Tcolor;//Цвет снежинки
  13. end;
  14. type
  15. { TSnow }
  16. TSnow=object {Тип данных для всех снежинок}
  17. SnowBuf : TBitmap;//Буфер где храняться снежинки
  18. gravity : integer;//Гравитация
  19. Wind: integer;//Ветер
  20. SnowMatrix : array [1..N] of TSnezhinka;//Массив со снежинками
  21. procedure Init(Width, Height: integer; Color : TColor);//Инициализация
  22. procedure Draw(canvas : TCanvas);//Отрисовка
  23. end;
  24. { TTree }
  25. TTree=object {Тип данных для дерева}
  26. TreeBuf : TBitmap;//Буфер где храняться снежинки
  27. procedure Init(filename: string);//Инициализация
  28. procedure Draw(canvas : TCanvas);//Отрисовка дерева
  29. end;
  30. { TTextOut }
  31. TTextOut=object {Тип данных для текста}
  32. TextBuf : TBitmap;//Буфер где храняться снежинки
  33. R,G,B, Rs, Gs, Bs : integer;
  34. procedure Init(canvas : TCanvas);//Инициализация
  35. procedure Draw(canvas : TCanvas);//Отрисовка дерева
  36. end;
  37. implementation
  38. { TSnow }
  39. {Инициализация объекта со снежинками}
  40. procedure TSnow.Init(Width, Height: integer; Color: TColor);
  41. var i : integer;
  42. begin
  43. Randomize;
  44. gravity:=1;//Гравитация
  45. Wind:=1;//Ветер
  46. for i:=1 to N do begin//Цикл инициализации снежинок
  47. SnowMatrix[i].X:=Random(Width);//Случайная координата по оси OX
  48. SnowMatrix[i].Y:=Random(Height);//Случайная координата по оси OY
  49. SnowMatrix[i].Color:=Color;//Цвет снежинки
  50. SnowMatrix[i].Size:=Random(2)+1;//СЛучайный размер снежинки
  51. SnowMatrix[i].X_Shift:=Random(2)-1;//Сдвиг по оси OX
  52. SnowMatrix[i].Y_Shift:=1;//Сдвиг по оси OY
  53. end;
  54. //Создаем и задаем размеры буфера для снежинок
  55. SnowBuf:=TBitmap.Create;
  56. SnowBuf.Width:=Width;
  57. SnowBuf.Height:=Height;
  58. end;
  59. {Отрисовка объекта со снежинками}
  60. procedure TSnow.Draw(canvas : TCanvas);
  61. var i : integer;
  62. begin
  63. Randomize;
  64. //Цикл сдвига всех снежинок
  65. for i:=1 to N do begin
  66. SnowMatrix[i].X:=SnowMatrix[i].X+Wind;//Смещение по оси OX
  67. SnowMatrix[i].Y:=SnowMatrix[i].Y+gravity;//Смещение по оси OY
  68. canvas.Pen.Color:=clWhite;//Цвет снежинок
  69. //снежинки в виде круга
  70. {
  71.   canvas.Ellipse(
  72.   Round(SnowMatrix[i].X)-SnowMatrix[i].Size,
  73.   Round(SnowMatrix[i].Y)-SnowMatrix[i].Size,
  74.   Round(SnowMatrix[i].X)+SnowMatrix[i].Size,
  75.   Round(SnowMatrix[i].Y)+SnowMatrix[i].Size
  76.   );
  77.   Canvas.Brush.Color:=clWhite;//Цвет заливки
  78.   //Заливаем внутренности снежинки
  79.   canvas.FloodFill(Round(SnowMatrix[i].X),
  80.   Round(SnowMatrix[i].Y),
  81.   clWhite,
  82.   fsSurface
  83.   );
  84. }
  85. //Снежинки в виде звездочек
  86. canvas.Pen.Color:=RGBToColor(Random(255),Random(255),Random(255));//Случайный цвет для снежинок
  87. canvas.Line( Round(SnowMatrix[i].X)-SnowMatrix[i].Size,
  88. Round(SnowMatrix[i].Y)-SnowMatrix[i].Size,
  89. Round(SnowMatrix[i].X)+SnowMatrix[i].Size,
  90. Round(SnowMatrix[i].Y)+SnowMatrix[i].Size
  91. );
  92. canvas.Line( Round(SnowMatrix[i].X),
  93. Round(SnowMatrix[i].Y)-SnowMatrix[i].Size,
  94. Round(SnowMatrix[i].X),
  95. Round(SnowMatrix[i].Y)+SnowMatrix[i].Size
  96. );
  97. canvas.Line( Round(SnowMatrix[i].X)-SnowMatrix[i].Size,
  98. Round(SnowMatrix[i].Y),
  99. Round(SnowMatrix[i].X)+SnowMatrix[i].Size,
  100. Round(SnowMatrix[i].Y)
  101. );
  102. canvas.Line( Round(SnowMatrix[i].X)+SnowMatrix[i].Size,
  103. Round(SnowMatrix[i].Y)-SnowMatrix[i].Size,
  104. Round(SnowMatrix[i].X)-SnowMatrix[i].Size,
  105. Round(SnowMatrix[i].Y)+SnowMatrix[i].Size
  106. );
  107. //Анализ выхода снежинок за границы формы
  108. if SnowMatrix[i].Y>canvas.Height then begin
  109. SnowMatrix[i].y:=0;
  110. SnowMatrix[i].Size:=Random(2)+1;
  111. end;
  112. if SnowMatrix[i].X>canvas.Width then begin
  113. SnowMatrix[i].X:=0;
  114. SnowMatrix[i].Size:=Random(2)+1;
  115. end;
  116. end;
  117. end;
  118. { TTree }
  119. {Инициализация объекта с деревом}
  120. procedure TTree.Init(filename: string);
  121. begin
  122. TreeBuf:=TBitmap.Create;
  123. TreeBuf.LoadFromFile(filename);
  124. TreeBuf.Transparent:=true;
  125. TreeBuf.TransparentColor:=TreeBuf.Canvas.Pixels[1,1];
  126. end;
  127. {Отрисовка дерева}
  128. procedure TTree.Draw(canvas: TCanvas);
  129. begin
  130. canvas.Draw((canvas.Width div 2) - (TreeBuf.Width div 2),
  131. (canvas.Height) - (TreeBuf.Height),
  132. TreeBuf);
  133. end;
  134. { TTextOut }
  135. procedure TTextOut.Init(canvas : TCanvas);
  136. begin
  137. TextBuf:=TBitmap.Create;
  138. TextBuf.Width:=50;
  139. TextBuf.Height:=50;
  140. TextBuf.TransparentColor:=clBlack;
  141. TextBuf.Canvas.CopyRect(Rect(0,0,TextBuf.Width,TextBuf.Width),
  142. canvas,
  143. Rect(0,0,TextBuf.Width,TextBuf.Width)
  144. );
  145. // TextBuf.Transparent:=true;
  146. R:=120;G:=120;B:=120;Rs:=Random(10);Gs:=Random(10);Bs:=Random(10);
  147. end;
  148. //------------------------------
  149. procedure TTextOut.Draw(canvas: TCanvas);
  150. var TDay1, TDay2, DateDiff: TDateTime;
  151. begin
  152. //Очистка фона (копируем кусок фона из буфера, очищая старый текст)
  153. TextBuf.Canvas.CopyRect(Rect(0,0,TextBuf.Width,TextBuf.Width),
  154. canvas,
  155. Rect(0,0,TextBuf.Width,TextBuf.Width)
  156. );
  157. //Определяем количество дней до НГ
  158. TDay1 := Date;
  159. TDay2 := StrToDate('31.12.'+IntToSTr(CurrentYear));//Для Windows
  160. // TDay2 := StrToDate('31-12-'+IntToSTr(CurrentYear));//Для Linux
  161. DateDiff := TDay2 - TDay1+1;
  162. r:=r+Rs; if (r>=245) or (r<=120) then Rs:=-Rs; //Изменение красной состовляющей цвета надписи
  163. g:=g+Gs; if (g>=245) or (g<=120) then Gs:=-Gs;//Изменение зеленой состовляющей цвета надписи
  164. // b:=b+Gs; if (b>=245) or (b<=120) then bs:=-bs;//Изменение синей состовляющей цвета надписи
  165. TextBuf.Canvas.Font.Size:=24;
  166. TextBuf.Canvas.Font.Color:=RGBToColor(r,g,b);
  167. TextBuf.Canvas.TextOut(0,0,leftstr(DateToStr(DateDiff),2));
  168. canvas.Draw(0,0,TextBuf);
  169. end;
  170. end.

 

Основной модуль

  1. unit Unit1; 
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  6. ExtCtrls, engine;
  7. type
  8. { TForm1 }
  9. TForm1 = class(TForm)
  10. Timer1: TTimer;
  11. procedure FormCreate(Sender: TObject);
  12. procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  13. procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  14. procedure Timer1Timer(Sender: TObject);
  15. private
  16. { private declarations }
  17. public
  18. { public declarations }
  19. end;
  20. var
  21. Form1: TForm1;
  22. SnowFlake : TSnow;
  23. tree : TTree;//Дерево
  24. buf : TBitmap;//Буфер
  25. DaysToNewYear : TTextOut;
  26. implementation
  27. { TForm1 }
  28. procedure TForm1.FormCreate(Sender: TObject);
  29. begin
  30. tree.Init('img/tree.bmp');//Инициализируем дерево
  31. //Устанавливаем размеры формы, равными размерам картинки с деревом
  32. form1.ClientWidth:=tree.TreeBuf.Width;
  33. form1.ClientHeight:=tree.TreeBuf.Height;
  34. Form1.BorderStyle:=bsNone;
  35. Form1.WindowState:=wsMaximized;
  36. Form1.Color:=clblack;
  37. //Инициализируем объект со снежинками
  38. SnowFlake.Init(Screen.Width, Screen.Height, clRed);
  39. SnowFlake.Wind:=1;
  40. //Создаем буфер и задаем его размеры, равными размерам картинки с деревом
  41. buf:=TBitmap.Create;
  42. buf.Width:=Screen.Width;
  43. buf.Height:=Screen.Height;
  44. //
  45. DaysToNewYear.Init(Buf.Canvas);
  46. //Задаем параметры таймера
  47. Timer1.Interval:=40;//Интервал
  48. Timer1.Enabled:=true;//Включаем таймер
  49. end;
  50. //------------------------------
  51. procedure TForm1.Timer1Timer(Sender: TObject);
  52. var Day : TDateTime;
  53. begin
  54. //Задаем цвет заливки буфера, равным цвету левого верхнего пикселя из картиники с деревом
  55. buf.Canvas.Brush.Color:=tree.TreeBuf.Canvas.Pixels[0,0];
  56. //Очищаем буфер
  57. buf.Canvas.Clear;
  58. //
  59. DaysToNewYear.Draw(buf.Canvas);
  60. //Рисуем в буфере дерево
  61. tree.Draw(buf.Canvas);
  62. //Рисуем в буфере снежинки
  63. SnowFlake.Draw(Buf.Canvas);
  64. //Рисуем содержимое буфера на форме
  65. form1.Canvas.Draw( 0,0, buf);
  66. //Вызов процедуры для обработки событий во время работы таймера
  67. Application.ProcessMessages;
  68. end;
  69. //------------------------------
  70. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState );
  71. begin
  72. //Завершаем работу программу, если нажата любай клавиша
  73. Application.Terminate;
  74. end;
  75. //------------------------------
  76. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  77. Y: Integer);
  78. begin
  79. //Завершаем работу программу, если сдвинули указатель мыши
  80. Application.Terminate;
  81. end;
  82. //------------------------------
  83. initialization
  84. {$I unit1.lrs}
  85. end.
 
След. »
2018 Центр СПО образовательных учреждений Мурманской области

Автор сайта - Николай Нифакин - nifakin.ucoz.ru