Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачи_Делфи.docx
Скачиваний:
9
Добавлен:
14.08.2019
Размер:
1.17 Mб
Скачать

2.2. Класс tBitmap и работа с растровыми рисунками

2.2.1. Рисование на поле растрового рисунка

в случайных местах

Постановка задачи. Требуется на поле в клеточку вывести определенное число растровых рисунков. Например, на поле 5 х 5 выведите 6 одинаковых рисунков в случайном месте. Примерный вид картинки приведен на рис. 13.

Реализация. В стандартном графическом редакторе Paint нарисуйте два или три небольших рисунка размером, например, 30 на 30 пикселей. Сохраните их в папке «Рисунки», в ней же сохраните проект. Допустим, наш рисунок сохранен в файле ris.bmp.

Рис.13. Растровый рисунок на поле

Опишем глобальные переменные.

const n=5;

x0=10;

y0=10;

Type Tpole=array[1..n,1..n] of integer;

var a:TPole;

bit1:TBitmap;

dx,dy:integer;

Напишем процедуру сlear для заполнения массива нулями и процедуру zapoln для заполнения массива m единицами.

procedure clear(var b:TPole);

var i,j:integer;

begin

for i:=1 to n do

for j:=1 to n do

b[i,j]:=0;

end;

procedure zapoln(var b:TPole; m:integer);

// m – число единичек в массиве b

var i,j,k:integer;

begin

for i:=1 to m do

begin

repeat

k:=1+random(n);

j:=1+random(n);

until b[k,j]=0;

b[k,j]:=1;

end;

end;

Процедура copy_ris копирует растровый рисунок в клетку поля, именно в ту клетку, которой соответствует ненулевой элемент массива.

procedure copy_ris;

var i,j,x,y:integer;

begin

for i:=1 to n do

for j:=1 to n do

begin

x:=x0+(j-1)*dx;

y:=y0+(i-1)*dy;

case a[i,j] of

1:Form1.Canvas.Draw(x+6,y+8,bit1);

end;

end;

end;

В процедуре FormCreate создаем растровый рисунок (переменная bit1) и загружаем в выделенную память его двоичное представление из файла. Не забудьте инициировать событие формы OnPaint, а в нем выбрать строку FormCreate.

procedure TForm1.FormCreate(Sender: TObject);

begin

randomize;

bit1:=TBitmap.Create; // Создание переменной bit1,

// присвоение ей адреса в динамической памяти

Bit1.LoadFromFile('ris.bmp'); // Загрузка двоичного

// образа из файла по выделенному адресу

Bit1.Transparent:=true; // Значение true делает область

// вывода рисунка на форму прозрачной

dx:=40;

dy:=40;

DrawPole (n, dx, x0, y0); // Поле состоит из квадратиков

clear(a);

zapoln(a,6);

copy_ris;

end;

Задание 1. Нарисуйте второй рисунок, поставьте ему в соответствие элемент массива, равный 2. Также выведите его на поле в случайные клетки.

Задание 2. Проект «Угадай, сколько гепардов» на тренировку памяти. Положите на форму таймер и окно редактора TEdit. Через 3 сек. закрасьте всех гепардов (для этого можно снова вызвать процедуру DrawPole), и программа должна напечатать вопрос «Сколько было гепардов?» Ответ пишите в окне редактора. Организуйте проверку: угадал или не угадал.

2.2.2. Движение двоичного образа по фоновой картинке

П остановка задачи. Проект должен реализовать движение небольшого изображения по фоновой картинке, лежащей на форме (рис. 14).

Рис. 14. Движение пчелы

Реализация. Заготовьте два рисунка с расширением bmp, положите файлы в папку, в которой будет сохранен проект. Положите на форму две кнопки «Старт» и «Выход», а также таймер. При создании формы установите размер формы, равным размеру фонового изображения. С помощью метода Draw скопируйте фоновый рисунок на форму, а рисунок пчелы – левее формы (в начальный момент его не видим).

Код процедуры TForm1.FormCreate:

procedure TForm1.FormCreate(Sender: TObject);

begin

// создать два объекта - битовых образа

fon := TBitmap.Create; // фон

fish:= TBitmap.Create; // картинка

// загрузить и вывести фон

fon.LoadFromFile('Роза.bmp');

Form1.Width := fon.Width+8;

Form1.Height := fon.Height;

Form1.Left:=0;

Form1.Top:=0;

cw:=Form1.Width;

ch:=Form1.Height;

button1.Left:=cw-60;

button1.Top:=ch-110;

button2.Left:=cw-60;

button2.Top:=ch-80;

// загрузить картинку, которая будет двигаться

fish.LoadFromFile('Пчела.bmp');

W := fish.Width;

H := fish.Height;

// определим "прозрачный" цвет

fish.Transparent := True;

// начальное положение картинки

x := -5;

y := ch div 4;

dx:=10;

// определим сохраняемую область фона

Rct:=Bounds(x,y,W,H);

Timer1.Enabled:=false;

end;

В этой процедуре использованы следующие глобальные переменные:

fon, fish: TBitMap; // фон и картинка

x,y,dx : integer; // текущее положение картинки

W, H: integer; // размеры картинки

cw, ch: integer; // размеры формы

Rct : TRect; // положение и размер области фона,

// которая должна быть восстановлена

По кнопке «Старт» запускается таймер, и пчела начинает двигаться направо, а потом налево и т. д.

Имитация движения картинки основана на следующем. Сначала с помощью функции bounds определяем размеры области фона, равной размерам картинки. Затем организуем цикл в обработчике TForm1.Timer1Timer, и в этом цикле реализуем буквально следующее: «стираем пчелу, меняем ее координаты, копируем ее в новом месте». «Стирание» пчелы – это восстановление фона. Все это реализуется с помощью метода Canvas.CopyRect.

procedure TForm1.Timer1Timer(Sender: TObject);

begin

//Копируем прямоугольник фона

Canvas.CopyRect(Rct, fon.Canvas, Rct);

x:=x+dx; // Горизонтальное движение с отражением

if (x+w> cw)or(x<0) then

dx:=-dx;

// Определим сохраняемую область фона в измененных координатах

Rct:=Bounds(x,y,W,H);

// выведем рисунок

Canvas.Draw(x,y, fish);

end;

Ниже приведен код остальных процедур.

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

// Освободим память, выделенную

// для хранения битовых образов

fon.Free;

br.Free;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Timer1.Enabled:=true;

end;

procedure TForm1.FormPaint(Sender: TObject);

begin

Canvas.Draw(0,0,fon);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Close;

end;

Задание. Видоизмените проект так, чтобы движение образа было в разных направлениях.