Отправляет email-рассылки с помощью сервиса Sendsay

Уроки по Delphi

  Все выпуски  

Уроки по Delphi


Информационный Канал Subscribe.Ru


Исходники лежат тут: Delphi::WAP::Moto E-365

*Номер 11* (2004-04-24)

Урок 12.

Задание: Совершенствуем игру.

Давайте начнем. Добавляем новую форму, сохраняем ее как "u63.pas" и еще одну как "u64.pas". У формы3 в "Инспекторе Объектов" выставляем параметры:
Borderstyle="bsSingle," Caption = 'Настройка', Height = 240, Width = 540. В разделе "BorderIcon" все параметры выставляем в "False".
На форму добавляем три "Label", три "TrackBar", одну "RadioGroup1" и кнопку. Расположите их по своему усмотрению, но чтобы параметр "Top" был не менее 30. Сверху мы будем рисовать. Параметры "TrackBar" установите как и на Форме1. У "" ставьте параметры: Caption = ' Мишень '; Columns = 4; ItemIndex = 0, Items = 'Черная', 'Красная', 'Зеленая', 'Желтая'. У кнопки Caption = 'Ok'.
Теперь программируем. В разделе "type" объявляем процедуру "procedure ImPik". Текст процедуры:

procedure TForm3.ImPik;
begin
canvas.Brush.Color := RGB(StrToInt(Label1.Caption),
StrToInt(Label2.Caption), StrToInt(Label3.Caption));
canvas.Pen.Color := canvas.Brush.Color;
Form1.Scol := canvas.Brush.Color;
canvas.Rectangle(25, 10, 520, 30);
canvas.Pen.Color := Form1.MCol;
canvas.Ellipse(225, 10, 245, 30);
Label1.Font.Color := RGB(StrToInt(Label1.Caption), 0, 0);
Label2.Font.Color := RGB(0, StrToInt(Label1.Caption), 0);
Label3.Font.Color := RGB(0, 0, StrToInt(Label1.Caption));
end;

Пишем остальные процедуры. Для автоматического создания шаблонов надо дважды нажать на соответствующий элемент:

procedure TForm3.TrackBar3Change(Sender: TObject);
begin
Label3.Caption := IntToStr(TrackBar3.Position);
ImPik;
end;

procedure TForm3.TrackBar2Change(Sender: TObject);
begin
Label2.Caption := IntToStr(TrackBar2.Position);
ImPik;
end;

procedure TForm3.TrackBar1Change(Sender: TObject);
begin
Label1.Caption := IntToStr(TrackBar1.Position);
ImPik;
end;

procedure TForm3.FormActivate(Sender: TObject);
begin
ImPik;
end;

procedure TForm3.RadioGroup1Click(Sender: TObject);
begin
// По умолчанию выставляем цвет = черному
Form1.MCol := ClBlack;
// Если выбран 2 пункт ("Красный"), то присваиваем этот цвет
if RadioGroup1.ItemIndex = 1 then
Form1.MCol := ClRed;
// Зеленый
if RadioGroup1.ItemIndex = 2 then
Form1.MCol := ClGreen;
// Желтый
if RadioGroup1.ItemIndex = 3 then
Form1.MCol := clYellow;
// Рисуем изменения
ImPik;

end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.ImPik;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
Close;
end;


Теперь переходим к форме4. В ней надо разместить Лейбл, Едит и Кнопку. Ставим параметры: Borderstyle="bsSingle." В разделе "BorderIcon" все параметры выставляем в "False". Остальные параметры и размеры выставляем по усмотрению. Пишем обработчик кнопки:

procedure TForm4.Button1Click(Sender: TObject);
begin
Form1.Lst[10].Name:=Edit1.Text;
Close;
end;

Вот и все. Теперь давайте вернемся к Форме1. В ней будут существенные изменения. Удаляем "TrackBar". Все три. Удаляем "Label" под номерами 3, 4 и 5. Эти элементы переехали на Форму3.

Начну с самого верха кода. Давайте прибавим к очкам, еще и звание. Для этого в нашу запись добавим новую переменную. Запись выглядит:

type
TLs = record // TLs - название записи
Name: string; // Имя игрока
Nagr: string; // Звание игрока
score: Integer; // Набранные очки
end;

Раздел "public" будет таким:

public
{ Public declarations }
// Объявление массива, состоящего из записей
Lst: array[0..10] of TLs;
MCol, Scol: TColor;
Nagr:Array[0..11] of string;
end;

Глобальные переменные стали такие:

var
Form1: TForm1;
x, y, Fire, score: Integer;

Процедуру "FormCreate" преобразуем:

procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
BGBitmap := TBitmap.Create; // Создали буфер
BGBitmap.Width := 560; // Задали ширину
BGBitmap.Height := 350; // Задали высоту
// Название формы
Form1.Caption := 'Гаубица';
// Заносим начальные значения имен и количества очков
for i := 1 to 10 do
begin
Lst[i].Name := 'Yura';
Lst[i].score := i * 100;
end;
LoadScore;
// Запускаем генератор случайных чисел
randomize;
// Числа х и у задают центр мишени
// Заносим в х случайное число, лежащее в пределах от 200 до 480
x := random(280) + 200;
// Заносим в у случайное число, лежащее в пределах от 0 до 250
y := random(250);
MCol := ClBlack;
Scol := ClBlack;
// Очищаем Image1.
ImCl;
score := 0;
Nagr[0]:='Рядовой';
Nagr[1]:='мл.сержант |';
Nagr[2]:='сержант ||';
Nagr[3]:='ст.сержант |||';
Nagr[4]:='мл.лейтинант .';
Nagr[5]:='лейтинант :';
Nagr[6]:='ст.лейтинант :.';
Nagr[7]:='капитан :..';
Nagr[8]:='майор ,';
Nagr[9]:='подполковник ;';
Nagr[10]:='полковник ;.';
end;

Т.к. задание цвета сетки мы перенесли на Форму3, то меняем процедуру "ImPik":

procedure TForm1.ImPik;
var
i, j: Integer;
PCol: TColor;
a: string;
begin
// Запоминаем текущий цвет пера. В конце процедуры, мы
// вернем его назад.
PCol := BGBitmap.Canvas.Pen.Color;
// Теперь цвет сетки берем в переменной Scol, а в нее записываем из Формы3
BGBitmap.Canvas.Pen.Color := Scol;
// Далее рисуем прямоугольник, ограничивающий зону обстрела
// Переносим начальную позицию пера в точку (10, 300)
BGBitmap.Canvas.MoveTo(10, 300);
// Рисуем линию из текущей позиции до точки (559, 300)
// и автоматически переносим текущую позицию пера
BGBitmap.Canvas.LineTo(559, 300);
BGBitmap.Canvas.LineTo(559, 0);
BGBitmap.Canvas.LineTo(10, 0);
BGBitmap.Canvas.LineTo(10, 300);
// Рисуем прицельные дуги
for i := 1 to 20 do
begin
j := i * 30;
BGBitmap.Canvas.Arc(10 - j, 300 - j, 10 + j, 300 + j, 550, 300, 10, 10);
end;
// Далее выводим цвет сетки в шестнадцатеричной форме
// Для начала стираем предыдущую надпись
BGBitmap.Canvas.Pen.Color := clBtnFace;
BGBitmap.Canvas.Rectangle(10, 309, 55, 325);
// Устанавливаем цвет пера, сохраненный в начале процедуры
BGBitmap.Canvas.Pen.Color := MCol;
// Рисуем цель в виде эллипса, с центром в (х,у) и диаметром 20 пикселей
BGBitmap.Canvas.ellipse(x, 300 - y, 20 + x, 300 - (y + 20));
// Устанавливаем цвет пера, сохраненный в начале процедуры
BGBitmap.Canvas.Pen.Color := PCol;
Canvas.Draw(0, 10, BGBitmap);
end;

Для того чтобы можно было присваивать звания, изменяем "Button3Click":

procedure TForm1.Button3Click(Sender: TObject);
var
i: Integer;
begin
// Проверяем набрал ли пользователь больше очков,
// чем самый низкий результат в таблице
if score > Lst[10].score then
begin
// Если да, то старый результат заменяем на новый
Lst[10].score := score;
Lst[10].Name := 'New';
score := 0;
Label7.Caption := 'Очки: ' + IntToStr(score);
Form4.ShowModal;
end;
// Сортируем таблицу очков, т.к. пользователь мог
// набрать очков, достаточных для более высокого
// места, чем десятое
Sorting;
for i := 1 to 10 do
begin
if Lst[i].score <= 300 then
Lst[i].Nagr := Nagr[0];
if Lst[i].score > 300 then
Lst[i].Nagr := Nagr[1];
if Lst[i].score > 700 then
Lst[i].Nagr := Nagr[2];
if Lst[i].score > 1000 then
Lst[i].Nagr := Nagr[3];
if Lst[i].score > 1300 then
Lst[i].Nagr := Nagr[4];
if Lst[i].score > 1700 then
Lst[i].Nagr := Nagr[5];
if Lst[i].score > 2000 then
Lst[i].Nagr := Nagr[6];
if Lst[i].score > 2300 then
Lst[i].Nagr := Nagr[7];
if Lst[i].score > 2700 then
Lst[i].Nagr := Nagr[8];
if Lst[i].score > 3000 then
Lst[i].Nagr := Nagr[9];
if Lst[i].score > 3300 then
Lst[i].Nagr := Nagr[10];
if Lst[i].score > 3700 then
Lst[i].Nagr := Nagr[11];
end;
SaveScore;
// Показываем Форму2
Form2.ShowModal;
end;

В функцию "SaveScore" добавляем строчку:

Ini.WriteString('Score', 'Nagr[' + IntToStr(i) + ']', Lst[i].Nagr);

В функцию "LoadScore" добавляем строчку:

Lst[i].Nagr := Ini.Readstring('Score', 'Nagr[' + IntToStr(i) + ']', Nagr[0]);

И на последок, пишем еще 2 функции:

procedure TForm1.N9Click(Sender: TObject);
begin
Form3.ShowModal;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
ImPik;
end;

"N9Click" - Показывает форму для настройки цвета. А "FormPaint" - перерисовывает сетку.

Вот на сегодня и все! Спасибо за внимание.
Тексты всех предыдущих уроков и самих исходников
можно скачать с http://mywap-f1.h12.ru
Если у Вас возникли вопросы, идеи, предложения или какие-либо мысли, пишите, не стесняйтесь!

© Юрий М. Крылов, 2004.®(11)

Рассылка comp.soft.prog.delphibegin (c)2003-2004 Крылов Ю.М.
Выпуск 11 от 2004-04-24
Подписчиков - 8
Рассылки Subscribe.Ru
Новости сайта My.WAP.F1

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное