ЗАДАНИЕ. Создайте приложение мультипликацию, в котором на фоне снежных гор летит самолет
Создайте приложение мультипликацию, в котором на фоне снежных гор летит самолет. Рисунки фона и самолета можно сделать самостоятельно, (рис. 28).
рис. 28
Создайте форму, для свойства Caption которой задайте значение «Полет самолета». Поместите на форму компонент Timer из палитры System и компонент Image из палитры Additional. Задайте для свойства Image1.Align значение alClient. Сохраните файл под именем airplane, файл модуля – под именем main в папке «Летящий самолет». Добавьте в раздел переменных модуля описание переменных:
Back, bitmap, Buf: Tbitmap; {фон, картинка, буфер} BackRct, bitmapRct, BufRct: Trect; {область фона, картинки, буфера} x, y: integer; {координаты левого верхнего угла картинки} W, H: integer; {размеры картинки (ширина, высота)} Для запуска анимации создайте обработчик события OnActivate, наступающего, когда форма получает или теряет фокус, например, при щелчке по ней мышью. Чтобы создать обработчик события, выберите в окне Инспектора объектов объект Form1 и на странице Events произведите двойной щелчок на пустом поле списка в событии OnActivate. После этого в окне Редактора кода будет сгенерирована заготовка процедуры обработчика события procedure TForm1.FormActivate (Sender. TObject); Отредактируйте текст этой процедуры следующим образом: Procedure TForm1.FormActivate (Sender: TObject); Begin Back: =TBitmap.Create; {фон} Bitmap: = TBitmap.Create; {картинка} Buf: = TBitmap.Create; {буфер} {загрузить и вывести фон из файла Backgraund.bmp} Back.LoadFromFile (‘Backgraund.bmp’); Form1.Image1Canvas.Draw (0, 0, Back); {загрузить изображение самолета, который будет двигаться} bitmap.LoadFromFile (‘aplane.bmp’); bitmap. Transparent: =True; bitmap. TransParentColor: =bitmap. Canvas. Pixels[1, 1]; {создать буфер для сохранения копии области фона, на которую накладывается картинка} W: =bitmap. Width; H: =bitmap. Height; Buf. Width: =W; Buf. Height: =H; Buf.Palette: =Back.Palette; {обеспечить соответствие палитр} Buf. Canvas. CopyMode: =cmScrCopy; BufRct: =Bounds (0, 0, W, H); x: =-W; y: =20; BackRct: =Bounds (x, y, W, H); {обеспечить сохраняемую область фона} Buf. Canvas. CopyRect (BufRct, Back. Canvas, BackRct); {сохранить ее} end; Для получения эффекта мультипликации создайте процедуру обработчика события OnTimer, для чего выберите в окне Инспектора объектов объект Timer1 и на странице Events произведите двойной щелчок на пустом поле списка в событии Timer1Timer. Отредактируйте тело процедуры обработчика события следующим образом: Procedure TForm1. Timer1Timer (Sender: TObject); Begin Form1. Image1. Canvas. Draw (x, y, Buf); {восстановление фона (из буфера) -удалить рисунок} x: =x+2; {смещение самолета по х} if x> Form1. Image1. Width then x: =-W; {если самолет «вылетел» за пределы рисунка фона} BackRct: =Bounds (x, y, W, H); {определить сохраняемую область фона} Buf. Canvas. CopyRect (BufRct, Back. Canvas, BackRct); {сохранить ее копию} Form1. Image1. Canvas. Draw (x, y, bitmap); {вывести рисунок самолета в новой позиции} end;
Для освобождения памяти от переменных, в которых хранились значения фона, рисунка самолета и буфера с фрагментом фона, создайте процедуру обработчика события закрытия окна приложения. Для этого выберите в окне Инспектора объектов объект Form1 и на странице Events произвести двойной щелчок на пустом поле списка в событии OnClose. Вставьте в тело процедуры обработчика события вызов метода Free для освобождения памяти, динамически выделенной под объекты Back, bitmap и Buf.
Procedure TForm1. FormClose (Sender: TObject; var Action: TCloseAction); Begin Back. Free; {освободить память} bitmap. Free; Buf. Free; End; Сохраните текст приложения, откомпилируйте его и поверьте его работу. Убедитесь, что в окне приложения на фоне выбранного рисунка осуществляется перемещение изображения самолета, как показано ниже на рисунке 29.
рис. 29
|