Иллюстрированный самоучитель по C++ Builder

Меню

 
Главная
Assembler
Turbo Pascal
C++ Builder
Delphi
Java
Скачать


Статистика

 

   


Реклама

 
Цифровик.ру - рейтинг nokia 8600 Luna. Все что вы хотели знать о nokia 8600 Luna

 

 

Использование битовых образов



В последнем примере изображение формировалось из графических примитивов. Теперь рассмотрим, как можно реализовать перемещение заранее подготовленного при помощи графического редактора изображения.

Как и в предшествующей программе, эффект перемещения объекта (картинки) достигается за счет периодической перерисовки картинки с некоторым смещением относительно ее прежнего положения. Перед выводом картинки в новой точке предыдущее изображение должно быть удалено, а фоновый рисунок, который был перекрыт — восстановлен. Удалить (стереть) картинку и одновременно восстановить фон можно путем перерисовки всей фоновой картинки или только той ее части, которая была перекрыта объектом. В рассматриваемой программе используется второй подход. Изображение объекта выводится применением метода Draw к свойству canvas формы, а стирается путем копирования (метод CopyRect) нужной части фона из буфера в битовый образ, соответствующий поверхности формы.

Форма программы приведена на рис. 3.17, а текст — в листинге 3.6. Компонент Timer используется для организации цикла удаления и вывода изображения самолета.



Рис. 3.17. Форма программы "Полет над городом"


Листинг 3.7. Полет над городом

void _fastcall TForml::FormCreate(TObject *Sender)
 
{
// загрузить фоновый рисунок из bmp-файла 
back = new Graphics::TBitmap(); 
back->LoadFromFile("factory.bmp");
// установить размер клиентской (рабочей) области формы 
// в соответствии с размером фонового рисунка 
GlientWidth = back->Width; 
ClientHeight = back->Height;
// загрузить картинку 
sprite = new Graphics::TBitmap(); 
sprite->LoadFromFile("aplane.bmp"); 
sprite->Transparent = true;
// исходное положение самолета
x=-20; // чтобы самолет "вылетал" из-за левой границы окна У=20; 
}
void _fastcall TForml::FormPaint(TObject *Sender) 
{
Canvas->Draw(0,0,back);    //фон
Canvas->Draw(x,у,sprite);  // рисунок }
void__fastoall TForml::TimerlTimer(TObject *Sender)
{
TRect badRect; // положение и размер области фона, 
// которую надо восстановить
badRect = Rect(x,y,x+sprite->Width,y+sprite->Height);
// стереть самолет (восстановить "испорченный" фон) 
Canvas->CopyRect(badRect,back->Canvas,badRect);
// вычислим новые координаты спрайта (картинки)
х +=2;
if (х > ClientWidth)
{
// самолет улетел за правую границу формы
// изменим высоту и скорость полета
х = -20;
у = random(ClientHeight —30);     // высота полета"
// скорость полета  определяется периодом возникновения
// события On Timer,  который,  в свою очередь,  зависит
// от значения свойства  Interval
Timerl->Interval = random(20)   +  10;   
// скорость   "полета" меняется
// от 10 до 29 }
Canvas->Draw(х,у,sprite); 
}

Для хранения битовых образов (картинок) фона и самолета используются два объекта типа TBitmap, которые создает функция TFormi:: Formcreate (объявления этих объектов надо поместить в заголовочный файл проекта). Эта же функция загружает из файлов картинки фона (factory.bmp) и самолета (aplane.bmp).

Восстановление фона выполняется при помощи метода copyRect, который позволяет выполнить копирование прямоугольного фрагмента одного битового образа в другой. Объект, к которому применяется метод copyRect, является приемником копии битового образа. В качестве параметров методу передаются: координаты и размер области, куда должно быть выполнено копирование; поверхность, с которой должно быть выполнено копирование; положение и размер копируемой области. Информация о положении и размере восстанавливаемой (копируемой на поверхность формы) области фона находится в структуре badRect типа TRect.

Следует обратить внимание на то, что начальное значение переменной х, которая определяет положение левой верхней точки битового образа (движущейся картинки) — отрицательное число, равное ширине битового образа картинки. Поэтому в начале работы программы самолет не виден и картинка отрисовывается за границей видимой области. С каждым событием OnTimer значение координаты х увеличивается и на экране появляется та часть битового образа, координаты которой больше нуля. Таким образом, у наблюдателя создается впечатление, что самолет вылетает из-за левой границы окна.

 

Copyright legioner© intbook.info, 2007