Использование таймеров в графике

Когда ваш самолет опаздывает, самолет,

на который вы хотели пересесть, улетает вовремя.

Из законов Мэрфи

Заставим наше НЛО мигать – менять цвет при движении – при помощи таймера. Настроим таймер так, чтобы он срабатывал каждые 100мс. Для управления цветом заливки НЛО придется ввести глобальную переменную. Она описывается в начале программы после оператора implementation:

Implementation

var clr:TColor=clGreen;

Обратите внимание на интересную особенность Delphi – глобальным переменным можно задавать начальные значения. В нашем случае в переменную clr с самого начала будет занесено значение clGreen (код зеленого цвета). TColor – это системный тип данных, предназначенный для хранения кодов цветов.

В процедуре таймера мы должны циклично менять значение переменной clr. Делается это так:

procedure TForm1.Timer1Timer(Sender: TObject);

Begin

if clr=clGreen then

clr:=clYellow

Else

clr:=clGreen

end;

Здесь в переменную clr будут циклически заноситься то значение clGreen, то clYellow.

Что делать дальше? Проблема в том, что в цикле процедура отрисовки НЛО вызывается дважды и оба раза она должна вызываться при одном и том же цвете НЛО, иначе не восстановится фон под картинкой и от нашей тарелки на экране останутся безобразные следы. Сделаем следующее: в процедуре TForm1.Button1Click заведем локальную переменную с типа TСolor и в нее будем запоминать текущее значение глобальной переменной clr в момент перед первым выводом тарелки на экран. Изменим и процедуру Ufo – теперь в нее нужно будет передавать не только координаты, но и цвет заливки. Получается вот что:

procedure TForm1.Button1Click(Sender: TObject);

VAR i:WORD;

c:TColor;

PROCEDURE Ufo(x,y:INTEGER; c:TColor);

BEGIN

WITH Image1.Canvas DO

BEGIN

Brush.Color:=c;

Pen.Color:=clBlue;

Pen.Width:=3;

Ellipse(x,y,x+20,y+10)

END

END;

Begin

Form1.DoubleBuffered:=TRUE;

WITH Image1.Canvas DO

BEGIN

Brush.Color:=clBlack;

Brush.Style:=bsSolid;

FillRect(Image1.ClientRect);

… // вывод звездного неба

Pen.Mode:=pmNOTXOR;

FOR i:=0 TO Image1.Width DO

BEGIN

c:=clr; // запомнили значение глобальной переменной clr

Ufo(i, i DIV 2,c);

Application.ProcessMessages;

Sleep(10);

Ufo(i, i DIV 2,c)

END

END

end;

Применение нескольких таймеров позволяет организовать анимацию нескольких объектов. Например, можно создать несколько блуждающих по экрану астероидов, от которых должна увертываться управляемая пользователем летающая тарелка.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: