Когда ваш самолет опаздывает, самолет,
на который вы хотели пересесть, улетает вовремя.
Из законов Мэрфи
Заставим наше НЛО мигать – менять цвет при движении – при помощи таймера. Настроим таймер так, чтобы он срабатывал каждые 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;
Применение нескольких таймеров позволяет организовать анимацию нескольких объектов. Например, можно создать несколько блуждающих по экрану астероидов, от которых должна увертываться управляемая пользователем летающая тарелка.