
- •Оглавление
- •Введение
- •Глава 1
- •Использование компонентов общего назначения: tLabel, tButton, tEdit, tShape, tTimer, tPanel
- •1.1.1. Проект «Калькулятор»
- •1.1.2. Проект «Таймер»
- •1.1.3. Проект «Светофор»
- •1.1.4. Проект «Движение шарика tShape с отражением»
- •Глава 2
- •2.1. Класс tCanvas, его свойства и методы
- •2.1.1. Рисование узоров
- •2.1.2. Рисование поля для различных игр
- •2.1.3. Рисование координатной сетки
- •2.1.4. Построение графиков элементарных функций
- •2.2. Класс tBitmap и работа с растровыми рисунками
- •2.2.1. Рисование на поле растрового рисунка
- •2.2.2. Движение двоичного образа по фоновой картинке
- •2.3. Компонент tImage и его использование
- •2.3.1. Проект «Движение компонента tImage»
- •2.3.2. Перемещение картинок
- •2.3.3. Проект «Движение компонента tImage
- •Глава 3
- •3.1. События от мыши
- •3.1.1. Проект «Попади в мишень»
- •3.1.2. Проект «Снежинки»
- •3.1.3. Проект «Крестики-нолики»
- •3.1.4. Движение образа по удерживанию левой кнопки мыши
- •3.1.5. Проект «Жизнь клеток»
- •3.2. События от клавиатуры
- •3.2.1. Код клавиши
- •3.2.2. Управляемое движение образа
- •3.2.3. Совмещение управляемого и неуправляемого движений.
- •Глава 4
- •4.1. Проект «Простейший графический редактор»
- •Глава 5
- •5.1. Создание кнопок
- •5.1.1. Проект «Лохотрон»
- •5.1.2. Игра «Пятнадцать»
- •5.2. Создание компонентов tImage
- •5.2.1. Проект «Угадай картинку»
- •5.2.2. Проект «Собери картинку»
- •Глава 6
- •6.1. Компоненты tStringGrid и tDrawGrid
- •6.1.1. Сортировка массива
- •6.1.2. Проект «Таблица успеваемости»
- •6.1.3. Система предварительной продажи билетов
- •6.1.4. Проект «Таблица рисунков»
- •6.1.5. Рисование в таблице tDrawGrid
- •6.2. Компоненты tListBox, tCombobox ,
- •6.2.1. Прорисовка изображений в списке tListBox
- •6.2.2. Проект «Зоомагазин»
- •6.2.3. Проект «Шуточная игра»
- •6.2.4. Проект «Редактирование списка вопросов»
- •Глава 7
- •7.1. Тест «Знаете ли вы загадки?»
- •7.2. Проект «Исторические даты»
- •Глава 8
- •8.1. Компоненты tOpenDialog, tSaveDialog – диалоги
- •8.1.1. Просмотр текстовых файлов
- •8.2. Добавление и удаление записей в файл и из файла
- •8.2.1. Проект «Журнал группы»
- •8.3. Файлы для проекта «Судоку»
- •Глава 9
- •9.1. Просмотр видеофильма с использованием
- •9.2. Простейшая мультипликация
- •Глава 10
- •10.1. Пример использования try… except
- •Глава 11
- •11.1. Оформление проекта
- •11.1.1. Проект «Бегущая строка»
- •11.1.2. Проект «Титры»
- •11.1.3. Общие рекомендации по оформлению
- •11.2. Рекомендации для отчета по проекту
- •11.3. Темы проектов
- •11.3.1. Головоломка «Сквэрворд»
- •11.3.2. Задача «Путешествие по маршруту»
- •11.3.3. Головоломка «Ходом коня»
- •11.3.4. Задача «Извилистый путь»
- •11.3.5. Головоломка «Фишки на поле»
- •Список литературы
- •630058, Новосибирск, ул. Русская, 35
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;
Задание. Видоизмените проект так, чтобы движение образа было в разных направлениях.