Создаем
игровое меню.
Данная тема будет интересна и нужна практически всем
разработчикам игр на делфи. Без игрового меню могут обойтись лишь небольшие и
недорогие игры типа «Крестики нолики», «Сапер», «Косынка» и подобные им игры. А
вот игры слегка сложнее типа «Марио», «Танчики» и подобные без меню представить
невозможно.
Вообще для чего нужно игровое меню и в чем его
предназначение? Во-первых меню служит виртуальной обверткой нашей игры. Ведь
первое что видит пользователь, запустивший наше приложение – это меню игры.
Именно поэтому разработчики стараются сделать меню очень красочным: ставят
красивые фоновые рисунки, сопровождающая музыка и звуки тоже очень важны,
рисуются спец-эффекты при нажатии или активировании кнопочек.
Но самое главное предназначение меню – выбор игровых
режимов. К режимам можно отнести игру по локальной сети и через интернет,
одиночную игру, игровые настройки, просмотр всевозможных рейтингов и многое
другое. Конечно можно это реализовать в виде выпадающих списков вверху на
панели, как это сделано в той же «Косынке» или «Сапере», но это не всегда
удобно и не так красочно. Поэтому нужно Вам игровое меню решайте сами.
А теперь приступим непосредственно к созданию игрового
меню в среде программирования Делфи. Перед тем, как мы начнем нужно нарисовать
все кнопочки, которые мы будем использовать в меню. Причем нужно каждую
кнопочку рисовать 2 раза. Первый вариант – это как будет выглядеть не
активированная кнопка (на нее не наведена мышка, она не выбрана стрелочками
клавиатуры и на нее никто не нажал), а второй вариант – это активированная
модель нашей кнопки.
После того, как кнопки созданы, приступаем к
программированию. Как обычно создаем проект (точнее он сам создается при
запуске Delphi). Сохраняем его в любую удобную для нас папку.
Далее объявляем переменные и процедуры, которые нам
понадобятся:
var
Buf:TBitmap;
Path:String;
Button:Array[1..14]
of TBitmap;
procedure DownGraf;
procedure DrawMenu;
Game:TGame;
И создаем запись с именем «игра» чисто для удобства
обращения к переменным:
type
TGame=record
Rezhim:String;
ActivBut:integer;
end;
Теперь в событии при создании формы пишем:
procedure
TForm1.FormCreate(Sender: TObject);
begin
Game.Rezhim:='Menu';
Game.ActivBut:=1;
DownGraf;
end;
Тоесть при запуске игры мы сразу задаем режим игрового
меню (именно оно должно рисоваться первым). Активной делаем первую кнопку по
умолчанию. А далее запускаем процедуру загрузки графики (картинок). И сразу же
предлагаю ее и написать:
procedure DownGraf;
var i:integer;
begin
Buf:=TBitmap.Create;
Buf.Height:=1000;
Buf.Width:=1000;
Path:=ExtractFileDir(Application.ExeName);
for i:=1 to 7 do
begin
Button[i]:=TBitmap.Create;
Button[i].Transparent:=true;
Button[i].LoadFromFile(path+'\img\button\'+inttostr(i)+'.bmp');
end;
for i:=8 to 14 do
begin
Button[i]:=TBitmap.Create;
Button[i].Transparent:=true;
Button[i].LoadFromFile(path+'\img\button\'+inttostr(i-7)+'1.bmp');
end;
end;
В этой процедуре мы создаем графический буфер. Он
необходим для того, чтобы не мерцали картинки при прорисовке сразу на форму. То
есть мы сначала все рисуем на буфер, а потом этот буфер как одна картинка
рисуется сразу на форму. А так бы мы рисовали каждую картинку по отдельности на
форму, и все мигало бы, если картинки начинали перекрывать друг друга.
Затем в переменную
Path мы записываем путь к папке в которую мы сохранили наш
проект. Нужна эта переменная также чисто для удобства написания пути при загрузке
картинок.
Теперь опишем процедуру прорисовки нашего меню:
procedure DrawMenu;
var i:integer;
begin
Buf.Canvas.Brush.Color:=clBlack;
Buf.Canvas.Rectangle(0,0,800,800);
for i:=1 to 7 do
begin
if i=Game.ActivBut then Buf.Canvas.Draw(170,50+i*70,Button[i+7])
else
Buf.Canvas.Draw(170,50+i*70,Button[i]);
end;
Form1.Canvas.Draw(0,0,Buf);
end;
В єтой процедуре мы устанавливаем
заливку фона черным цветом (в виде огромного
черного квадрата), а затем поверх фона рисуем наши 7 кнопочек.
Далее в событие таймера мы должны
написать проверку что рисовать на форме в каком режиме:
if Game.Rezhim='RandomOne' then
DrawMap;
if Game.Rezhim='Menu' then
DrawMenu;
При режиме RandomOne (можно
придумать любой другой) будем выполняться какая-то процедура. Эту строку можно
закоментировать или убрать потому, что делать ту процедуру мы не будем. Вторая
строка отвечает за выполнение процедуры прорисовки игрового меню при
режиме Menu.
Можно запустить программу и вы
уже увидите готовое меню. Но он опока только рисуется. Предлагаю тепер сделать
управление кнопочками в меню игры. Сделаем это в событии формы OnKeyUp (при отпускании кнопки). Тоесть когда кнопка была
нажата, а затем отпущена:
if
(Game.Rezhim='Menu') and (Key=40) then
begin
Game.ActivBut:=Game.ActivBut+1;
If Game.ActivBut>7 then Game.ActivBut:=1;
end;
if (Game.Rezhim='Menu') and (Key=38) then
begin
Game.ActivBut:=Game.ActivBut-1;
If Game.ActivBut<1 then Game.ActivBut:=7;
end;
if (Game.Rezhim='Menu') and (Key=13) then
begin
case Game.ActivBut of
1:begin
Game.Rezhim:='RandomOne';
end;
7:begin
Form1.Close;
end;
end;
end;
В этой процедуре мы проверяем клавиши 38 (стрелка
вверх) и 40 (стрелка вниз). При нажатии вверх мы делаем активной кнопочку,
которая выше, а при нажатии вниз наоборот – кнопку с большим номером.
Затем идет проверка нажатия клавиши 13 (Enter). При нажатии Enter на 7 кнопке программа будет закрыта. При нажатии на первую будет установлен
какой-то режим (придуманный нами). Таким же образом можно придумать и режимы
для других кнопок.
Но поскольку не всегда управление клавишами является
очень удобным – нужно запрограммировать и управление с помощью мыши. Сначала
будем отслеживать координаты мыши и активировать кнопки, на которые мы наводим.
Делается это в событии формы OnMouseMove:
procedure
TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
Var
MX,MY:integer;
begin
MX:=Mouse.CursorPos.X-Form1.Left;
MY:=Mouse.CursorPos.y-Form1.Top-25;
if (MX>=170) and (MX<=170+320)
and (MY>=120) and (MY<=120+64) then
Game.ActivBut:=1;
if (MX>=170) and (MX<=170+320)
and (MY>=190) and (MY<=190+64) then
Game.ActivBut:=2;
if (MX>=170) and (MX<=170+320)
and (MY>=260) and (MY<=260+64) then
Game.ActivBut:=3;
if (MX>=170) and (MX<=170+320)
and (MY>=330) and (MY<=330+64) then
Game.ActivBut:=4;
if (MX>=170) and (MX<=170+320)
and (MY>=400) and (MY<=400+64) then
Game.ActivBut:=5;
if (MX>=170) and (MX<=170+320)
and (MY>=470) and (MY<=470+64) then
Game.ActivBut:=6;
if (MX>=170) and (MX<=170+320)
and (MY>=540) and (MY<=540+64) then
Game.ActivBut:=7;
end;
А теперь сделаем чтобы кнопки реагировали на клики
мышкой по ним. Напишем следующий исходный код в событии формы OnClick:
if
(Game.Rezhim='Menu') then
begin
case Game.ActivBut of
1:begin
Game.Rezhim:='RandomOne';
end;
7:begin
Form1.Close;
end;
end;
end;
При клике на 1-й кнопке поять мы
активируем какой-то режим, а при клике по 7-й кнопке – закрываем программу. Можно тепер запустить программу и
насладиться нашим творением. Теперь работает и управление мішкой, и управление
клавиатурой. Ну вот в об щем-то и все! Желаю всем успехов в Ваших начинаниях
программирования игр.
Источник: delgame.at.ua
|