
Графика в Linux/Kylix
Xakep, номер #035, стр. 035-071-2
У холста есть очень хороший метод - Draw, который может рисовать картинки. Ему надо только передать три параметра: X и Y позицию картинки и саму картинку. Вот это я и делаю.
СОЗДАЕМ АНИМАЦИЮ
Брось куда-нибудь на форму компонент TTimer с закладки Additional. Выдели его и в объектном инспекторе установи в параметре Interval значение 50. Мы уже пользовались таймером, и ты должен знать, что каждые Х миллисекунд таймер будет генерировать событие, которое мы можем выловить. "Х" в данном случае не журнал, а количество миллисекунд, указанное в свойстве Interval.
Теперь перейди на закладку Events и создай обработчик события OnTimer. Там напиши все, что написано в листинге 3. Итак, каждые 50 миллисекунд будет вызываться эта процедура. В ней мы будем изменять X и Y позиции нашей картинки, чтобы она перемещалась по экрану. Давай посмотрим, как я это делаю.
В первой строке X:=X+XR я переменной X присваиваю ее текущее значение плюс XR. То есть увеличиваю позицию картинки на значение скорости. То же самое я делаю и с Y.
Дальше идет проверка, не пересекла ли картинка край окна. Если X<0, то я присваиваю скорости (XR) значение 5. Если Х больше значения ширины экрана (Width) минус ширина картинки (fbitmap.Width), то есть картинка пересекла ширину окна, то значению скорости (XR) я присваиваю -5. Это заставит двигаться картинку в обратную сторону. Почему? Да потому что когда будет выполняться строка X:=X+XR, где XR=-5, значение Х будет уменьшаться. Если ты и сейчас не понял, то бегом в первый класс средней школы, ты пропустил очень много интересного в своей жизни :).
Те же операции происходят и с Y координатой картинки. Так что здесь я останавливаться не буду.
Самая последняя функция - FormPaint(nil) - заставляет экран перерисоваться.
УСТАЛЛА АЛЛА
Все, пример готов. Можешь нажать F9, чтобы запустить прогу. На рисунке 4 ты можешь увидеть результат его работы. Как видишь, после картинки остается след ее движения. Я специально его оставил, чтобы ты мог увидеть результат в полном объеме. Если ты хочешь от него избавиться, то в обработчике события OnPaint первыми строчками (перед рисованием картинки) напиши:
Canvas.Brush.Color:=clWhite;
Canvas.FillRect(ClientRect);
Это заставит прогу сначала закрасить все окно белым цветом, а потом на чистый экран вывести картинку.
Все!!! На сегодня новостей больше нет. Исходник ты, как всегда, сможешь забрать с моего сайта www.cydsoft.com/vr-online/. Удачи тебе!!!
Листинг 1
procedure TForm1.FormCreate(Sender: TObject);
begin
fbitmap:=TBitmap.Create;
fbitmap.LoadFromFile('Bart.bmp');
X:=0;
Y:=0;
XR:=5;
YR:=5;
end;
Листинг 2
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Draw(X,Y,fbitmap);
end;
Листинг 3
procedure TForm1.Timer1Timer(Sender: TObject);
begin
X:=X+XR;
Y:=Y+YR;
if X<0 then XR:=5;
if X>Width-fbitmap.Width then XR:=-5;
if Y<0 then YR:=5;
if Y>Height-fbitmap.Height then YR:=-5;