- •Оглавление
- •Введение
- •Глава 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.3.3. Проект «Движение компонента tImage
по окружности»
Постановка задачи. Реализовать движение картинки, загруженной в TImage, по окружности.
Реализация. Нарисуйте в редакторе Paint небольшую картинку, например, шарик и сохраните ее. Положите на форму две кнопки «Старт» и «Выход», таймер и один TImage. Найдите свойство Picture у компонента TImage и загрузите туда нарисованную картинку. Вид формы приведен на рис. 15.
Рис. 15. Форма для проекта
Для удобства рассмотрения напишем процедуру krug, рисующую окружность, или можем использовать готовый метод ellipse. Введём следующие глобальные переменные:
u0, v0, mx, my, rad : integer;
dfi, fi : real;
procedure xytouv(x,y:real; var u,v:integer);
begin
u:=u0+round(x*mx);
v:=v0-round(y*my);
end;
procedure krug(u0,v0,rad:integer);
var x,y:real;
u,v:integer;
begin
Form1.Canvas.Pen.Color:=ClRed;
fi:=0;
dfi:=0.01;
x:=rad;
y:=0;
xytouv(x,y,u,v);
while fi<=2*pi do
begin
Form1.Canvas.MoveTo(u,v);
x:=rad*cos(fi);
y:=rad*sin(fi);
xytouv(x,y,u,v);
Form1.Canvas.LineTo(u,v);
fi:=fi+dfi;
end;
end;
Далее дан код остальных процедур, а момент движения нарисован на рис. 16.
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
mx:=1;
my:=1;
u0:=130;
v0:=130;
rad:=100;
Image1.Transparent:=true;
Image1.Left:=u0+rad+20;
Image1.Top:=v0-20;
Timer1.Enabled:=false;
fi:=0;
dfi:=0.01;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// Меняем координаты компонента TImage
Image1.Left:=u0+round((rad+20)*cos(fi));
Image1.Top:=v0-20-round((rad+20)*sin(fi));
fi:=fi+dfi;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
krug( u0,v0,rad);
end;
Рис. 16. Движение шарика по окружности
Задание. Создайте проект «Движение компонента TImage по фоновому рисунку». Пусть на форме лежит картинка, например, пейзаж, а вторая небольшая картинка, например птичка, будет летать слева направо и обратно. Используйте свойство Picture компонентов TImage для загрузки в него картинок.
Глава 3
Реакция на события от мыши и клавиатуры
3.1. События от мыши
3.1.1. Проект «Попади в мишень»
Постановка задачи. В случайном месте формы рисуется небольшой кружок заданного радиуса и произвольного цвета. Одновременно запускается таймер, и играющий должен успеть щелкнуть по кружку. Число попаданий и число щелчков подсчитываются. Игра продолжается до 10 щелчков.
Реализация. Положите на форму таймер, установите подходящий интервал. Положите одну кнопку «Старт». Кнопка сначала видна, по ее нажатию обнуляются счетчики, и запускается таймер, а также свойству Button1.Visible присваивается значение false. Во время игры кнопка уже не видна. После 10 выстрелов форма очищается, и кнопка вновь видна. Число попаданий и выстрелов будем выводить в строке Form1.Caption (рис. 17).
Рис. 17. Форма проекта «Попади в мишень»
Потребуется написать процедуру mishen рисования кружка заданного цвета с использованием стандартного метода Ellipse. Используем следующие глобальные переменные
var cw,ch,rad, a,b:integer;
vist, popal:integer;
c:TColor;
procedure mishen(x,y:integer;rad:integer;c:TColor);
begin
with Form1.Canvas do
begin
Pen.Color:=c;
Brush.Color:=c;
Ellipse(x,y,x+2*rad,y+2*rad);
end;
end;
Ниже приведен код FormCreate, Timer1Timer, FormMouseDown и Button1Click.
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
cw:=ClientWidth; // Ширина формы
ch:=ClientHeight; // Высота формы
rad:=10;
Timer1.Enabled:=false;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
c:=Form1.Color; // Закрашиваем мишень цветом формы
mishen(a,b,rad,c);
c:=RGB(random(256),random(256),random(256));
a:=1+random(cw-2*rad);
b:=1+random(ch-2*rad);
mishen(a,b,rad,c); // Рисуем мишень в новом месте
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var x1,y1:integer;
begin
vist:=vist+1;
{Переменные х, у – «экранные» координаты точки щелчка, поэтому пересчитаем их так, чтобы значения х1, у1 «были» внутри мишени }
x1:=abs(x-a)-rad div 2;
y1:=abs(y-b)-rad div 2;
if (x1*x1+y1*y1<=rad*rad) then
// Указатель мыши внутри мишени
begin
popal:=popal+1;
end;
Form1.Caption:='Выстрелов: '+IntToStr(vist)+
' Попаданий: '+IntToStr(popal);
if vist = 10 then
Begin
Timer1.Enabled:=false;
with Canvas do
begin
Font.Size:=24;
Font.Color:=ClTeal;
Brush.Color:=Form1.Color;
TextOut(70,80,'Игра окончена');
end;
Button1.Visible:=true; // Можем начать сначала
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
vist:=0;
popal:=0;
// Очистим форму
with Canvas do
begin
Pen.Color:=Form1.Color;
Brush.Color:=Form1.Color;
Rectangle(0,0,cw,ch);
end;
Timer1.Enabled:=true;
Button1.Visible:=false; // Кнопка невидима
end;
На рис. 18 нарисован «один миг» из игры.
Рис. 18. Игра «Попади в мишень»
Задание. Вместо кружка нарисуйте симпатичную картинку, создайте переменную класса TBitMap и загрузите картинку в эту переменную с помощью метода LoadFromFile. «Стирать» картинку можно рисованием прямоугольника цветом формы.