скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Создание кнопок (не спрайтовых) для использования в игре



Оформил: XVeL
Автор: Spose

Вторая статья по игре "В ОСАДЕ" поясняющая, каким образом в игре появились кнопки!
Итак, компонент Игровой Кнопки (MGIB) находится в файле Unit2.pas в исходнике игры. Рассматривать его мы не будем, будем рассматривать только то как он работает!
Вся игра у нас делится на сцены. Каждая сцена делится на три части:
1.Загрузка сцены (выполняется один раз перед самой сценой)
2.Отрисовка/Обработка сцены (выполняется столько раз в секунду сколько у вас FPS, до тех пор пока не см.3)
3.Завершение сцены (освобождает память, один раз после окончания Отрисовки/Обработки сцены, только в том случае если игрок покинул игру или грузится другая сцена)
Подробнее в других статьях.
На загрузку сцены пишем:
var
   form1:TForm;
   ml:Tlist;

procedure startsceneMenu;
begin
   ml:=Tlist.Create; //Создаем список (где будут кнопки)
   {Добавляем кнопки в список}
   ml.Add(mgib.Create); //Создаем кнопку в списке
   with mgib(ml[ml.Count-1]) do //С ней делаем
   begin
      caption:='Новая игра'; //Рисуемый на ней текст
      image:=il.Items.Find('btn20'); //Название изображения в DxImageList'е
      width:=image.Width; //Ширина (нужна чтобы на кнопку можно было нажать)
      height:=image.Height; //Высота (тоже нужна как и ширина)
      x:=288; //Координаты левого верхнего угла (ЛВУ) по оси ИКС
      y:=350; //Координаты ЛВУ по оси ИГРИК
   end;
end;
В отрисовку сцены добавляем:
.....................
var
.....................
   I:integer;
begin
.....................
   for i:=0 to ml.items.count-1 do //Просто рисуем кнопки из списка
   mgib(ml.items[i]).dodraw;
.....................
end;
Но чтобы кнопки действовали нужно ещё сделать обработчик на Движение/Нажатие/Отжатие мыши и её кнопок.
Вот они:
procedure Tform1.DXDrawMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
   i: integer;
begin
   bk:=255; //Номер нажатой кнопки, чтобы определить какая кнопка была нажатой (255 ставится для того чтобы при нажатии мимо кнопки не нажималась кнопка номер 0)
   for i:=0 to ml.Count-1 do //Если мышь над кнопкой то выделяем кнопку, и указывем номер выделеной кнопки
   if mgib(ml[i]).HighLighted then
   begin
      mgib(ml[i]).Selected:=true;
      bk:=i;
   end;
end;

procedure Tform1.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Var
   i: integer;
   MousePoint: TPoint;
begin
   MousePoint:=Point(x,y);
   for i:=0 to ml.Count-1 do //Если мышинный курсор над кнопкой, то выделяем текст на ней болдом(это в свойствах компонента называется Highlighted)
   if ptinrect(mgib(ml[i]).BoundsRect,mousepoint) then
      mgib(ml[i]).HighLighted:=true else mgib(ml[i]).HighLighted:=false;
end;

procedure Tform1.DXDrawMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
i,z:integer;
begin
   case bk of //Если номер нажатой кнопки не равен 255 то, проверяем какая же кнопка была нажата, и выполняем записаные на неё действия.
   0:begin //На кнопку 0 (Новая игра) записано: сделать кнопку невыделеной(чтобы не повторять эту процедуру до бесконечности) и начать сцену игры.
         mgib(ml[0]).selected:=false;
         startscene(gsgame);
      end;
   end;
end;
И на завершение сцены ставим:

.....................
var
.....................
   I:integer;
begin
.....................
   for i:=0 to ml.items.count-1 do //Просто очищаем список от кнопок
   mgib(ml.items[i]).free;
   ml.free; //И убираем вообще этот список
.....................
end;
Вот в принципе и всё.





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook