(Внимание!!! Пример написанный в Kylix прекрасно работает в Delphi)
Кто сказал, что работа с графикой в Linux - болезнь гемора? Кто сказал, что Linux нормально работает только в текстовом режиме? Да, графическая оболочка в Linux притормаживает, по сравнению с окнами. Но это не значит, что работа невозможна. Windows 9х вообще падает каждые пять митут, но это же не значит, что так работать нельзя!!!
С помощью Kylix работа с графикой в Linux превращается в увлекательнейшее занятие. Сегодня я покажу тебе, как создать простенькую анимацию. Для этого заготовь какой-нибудь рисунок любого размера, желательно не более 100 на 100. То, что приготовил я, ты можешь увидеть на рисунке 1. Признаюсь честно, что картинку я нагло стырил, потому что сам я рисовать не умею. Глядя на то, как я рисую, можно сказать, что для меня слово художник происходит от того слова, которое пишут на заборе :).
Рис 1. Картинка для анимации
Запускай Kylix и создавай новый проект. Перейди в редактор кода и найди описание закрытых переменных (об этом мы говорили в самой первой статье). Допиши туда следующее:
private
{ Private declarations }
fbitmap:TBitmap;
X, Y, XR,YR:Integer;
Я дописал сюда несколько переменных, которые буду использовать при анимации. fbitmap - я объявил как объект TBitmap, т.е. точечный рисунок. X, Y, XR и YR - сделал целыми числами. Первые две переменные (X и Y) я буду использовать для хранения текущей позиции картинки. Вторые две будут хранить скорость движения картинки.
Создай обработчик события для формы OnCreate. Напиши там то, что написано в листинге 1, а я сейчас поясню, что там происходит. В первой строке, я инициализирую переменную fbitmap. Для этого надо ей присвоить TBitmap.Create. Почему именно это надо присвоить? Да потому что переменная fbitmap типа TBitmap, поэтому нужно вызвать именно его метод Create. Почему fbitmap нужно инициализировать? Потому что это объект, который использует память, а во время инициализации выделяется необходимая память, и инициализируются необходимые свойства значениями по умолчанию.
Определить переменные, которые надо инициализировать очень легко. Если название ее типа начинается с буквы Т, то инициализация обязательна. Все, что начинается с Т, это объекты. Они используют память и требуют инициализации. Для этого нужно вызвать метод Create (иногда называется конструктором) объекта, как мы это делаем с картинкой.
Во второй строке я загружаю картинку. У нашего объекта fbitmap есть метод LoadFromFile. В качестве параметра нужно указать имя файла, который нужно загрузить. Если файл находится в той же директории, то можно указать только имя. Если где-то в другом месте, то придется указывать полный путь.
Далее, я присваиваю переменным Х и Y значение 0. Это будет начальное положение картинки. А переменным XR и YR значение 5. Это будет скорость движения картинки.
Теперь создай обработчик события OnPaint. Напиши там все, что показано в листинге 2. Мы уже занимались рисованием в Delphi, здесь это происходит точно так же. Сейчас я тебе напомню, как это делается.
Для рисования используется объект TCanvas. У большинства компонентов уже есть свойство Canvas (по-русски холст), которое ты можешь использовать для вывода графики. У главной формы тоже есть такое свойство, так что им мы и воспользуемся.
У холста есть очень хороший метод - Draw, который может рисовать картинки. Ему надо только передать три параметра: X и Y позицию картинки и саму картинку. Вот это я и делаю.
Брось куда-нибудь на форму компонент TTimer с закладки Additional. Выдели его и в объектном инспекторе установи в параметре Interval значение 50. Мы уже пользовались таймером и ты должен знать, что каждые Х миллисекунд таймер будет генерировать событие, которое мы можем выловить. "Х" в данном случае не журнал, в количество миллисекунд, указанные в свойстве Interval.
Рис 2. Компонент TTimer
Теперь перейди на закладку Events и создай обработчик события OnTimer. Там напиши все, что написано в листинге 3. Итак, каждые 50 миллисекунд будет вызываться эта процедура. В ней мы будем изменять X и Y позиции нашей картинки, чтобы она перемещалась по экрану. Давай посмотрим, как я это делаю.
В первой строке X:=X+XR я переменной X присваиваю ее текущее значение плюс XR. То есть увеличиваю позицию картинки на значение скорости. То же самое я делаю и с Y.
Рис 3. Форма.
Дальше идет проверка, не пересекла ли картинка край окна. Если X<0 то я присваиваю скорости (XR) значение 5. Если Х больше значения ширины экрана (Width) минус ширина картинки (fbitmap.Width), то есть картинка пересекла ширину окна, то значению скорости (XR) я присваиваю -5. Это заставит двигаться картинку в обратную сторону. Почему? Да потому что когда будет выполняться строка X:=X+XR, где XR=-5, значение Х будет уменьшатся. Если ты и сейчас не понял, то бегом в первый класс средней школы, ты пропустил очень много интересного в своей жизни :).
Те же операции происходят и с Y координатой картинки. Так что здесь я останавливаться не буду.
Самая последняя функция - FormPaint(nil) заставляет экран перерисоваться.
Рис 4. Результат работы
Все, пример готов. Можешь нажать F9 чтобы запустить прогу. На рисунке 4 ты можешь увидеть результат его работы. Как видишь, после картинки остается след ее движения. Я специально его оставил, чтобы ты мог увидеть результат в полном объеме. Если ты хочешь от него избавится, то в обработчике события OnPaint первыми строчками (перед рисованием картинки) напиши:
Canvas.Brush.Color:=clWhite;
Canvas.FillRect(ClientRect);
Это заставит прогу сначала закрасить все окно белым цветом, а потом на чистый экран вывести картинку.
Все!!! На сегодня новостей больше нет. Исходник ты как всегда сможешь забрать с моего сайта www.cydsoft.com/vr-online/. Удачи тебе!!!
Листинг 1
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;
FormPaint(nil);
end;