Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

интерфейс пользователя в игре   Найти похожие ветки 

 
ninja ©   (2005-03-24 09:33) [0]

ПРивет мастера!
Сейчас делаю интерфейс. Кнопочки там разные и т.д. Игра в DirectDraw. В начале игры требуется указать нацию, сложность и некоторые другие параметры. Хотел написать функцию, выдающую "диалоговое окно", но не так просто это оказалось. С формами всё было просто: ShowModal и усё. Как реализовать нечто вроде ShowModal?

Можно конечно на закрытие одного "диалогового окна" повесить процедуру открытия следующего, но это не очень красиво. Хотелось бы иметь код вида

Player[i].InputNation;
Player[i].InputStartPoints;
Player[i].Input....
и на экране одно за другим появлялись бы эти штуки.


 
cyborg ©   (2005-03-24 11:30) [1]

Смотря какая у тебя структура игры, такие и советы нужно давать. Про структуру ты ничего не сказал, как у тебя там всё организовано? Поэтому нормального совета ты не дождёшься!


 
П7   (2005-03-24 12:41) [2]

факт. Но уже сейчас можно сказть, что подход предложенный в нулевом посте - глупость. Делай нормальный GUI. Поищи в сети примеры... Или для каждого "типа ввода" (: напиши отдельную функцию...


 
ninja ©   (2005-03-24 21:59) [3]


> Но уже сейчас можно сказть, что подход предложенный в нулевом
> посте - глупость

:(


> cyborg ©   (24.03.05 11:30) [1]

вот я тоже подумал насчет структуры, наверное, придется всё переделывать, только пока неизвестно как. в общем, оконная функция ловит всякие сообщения, нажатие клавишь и действия с мышью передаются в engine. У engine есть свойство gamescreen класса tgmscreen, оно хранит текущий "экран": для главного меню, например, поверхность-задник и "компоненты".

вот:

 TEngine = class    
  private
   window:      HWND;       //window handle
   LMous,
   RMous:       boolean;       //состояние кнопок мышы
   Keys:        set of Byte;   //нажатые клавишы
   DD:          IDirectDraw7;  //графические объекты
   Primary:     IDirectDrawSurface7;
   Buff:        IDirectDrawSurface7;
   Gamma:       IDirectDrawGammaControl;    
   Gamma1,
   Gamma2:      TDDGammaRamp;        
   ScrMode:     TScrMode;
   .....
  public
   procedure    DoIt;                                        
   constructor  Create(hWindow: dword; width, height, depth: word);  
   Mess:        TMessageScreen;   //текущее сообщение
   GameScreen:  TGMScreen;   //текущий игровой экран
   ......
 end;

в общем TMessageScreen это потомок TGMScreen, практически то же самое. если вылазит сообщение, информация о кнопках идёт в него, а экран который сзади - только перерисовывается.

 TGMScreen = class     //класс игрового экрана
  private
   fading:    boolean;
   bkGround:  TSurf;  
   Controls:  array of TControl1;   //управляющие элементы
   Downed:    WORD;  //номер прижатого (на к-ром был моусдаун)
   PrevLMous: Boolean;  
   PrevRMous: Boolean;
   .......
  public
   procedure Draw; virtual;
   function  UnderMouse(x,y: WORD): WORD;  //№ элемента под мышью
   procedure AddControl(control: TControl1);
   procedure Process(Keys: TByteSet; var LMous,RMous: boolean); virtual; //обработка клавиш
   ......
 end;

вот так оно...


 
П7   (2005-03-25 15:44) [4]

на сайте DelphiGFX есть пример реализации GUI под OpenGL, но если переписать процедуры отрисовки, то сами структуры можно передрать полностью (:


 
Omar2002 ©   (2005-03-27 11:54) [5]

Я делал так:
1) создаешь структуры TBtm, TEdt, TLbl. (Соответственно кнопки, едиты и лабелы).
2)создаешь массивы кнопок, едитов и лабелов этих типов. Ну и все собсно.
3)Выводишь их на экран и обрабатываешь нажатия на них мышью.

Я типы создавал такие:


type TBtn    = record
              Caption:string[10];    //Текст на кнопке
              Pic:integer;           //Номер картинки этой кнопки
              Pos:TXY;               //Положение кнопки
              Razmer:TRazmer;        //Размеры кнопки
              Lay:byte;              //на какой поверхности лежит кнопка
              Visible:byte;          //видна ли кнопка?
              end;


Короче говоря. это же уже твоя работа - можешь делать кнопки любых размеров. Очень удобно было сделать не просто Pic, а масив из 4 картинок для 4 состояний кнопки:
- Свободная кнопка
- Кнопка, на которую наведен курсор
- Кнопка, которая нажата в данный момент
- Неактивная кнопка
Учти еще тот факт, что кнопки можно делать любой формы, ну например - круглой. Но сложности возникнут с определением - лежит ли курсор на кнопке. Ну я думаю красивый интерфейс стоит того, чтобы помучиться над такой, впрочм и не такой уж и сложной, задачей.



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
1-1117905329
sofs
2005-06-04 21:15
2005.06.29
как записать в мемо какой либо символ из кодовой таблицы Windows?


3-1115954496
Елена
2005-05-13 07:21
2005.06.29
Обнулениеячейки в пародоксовской табличке.


3-1116522241
PalladinA
2005-05-19 21:04
2005.06.29
Похоронил ли Delphi 2005 технологию BDE?


1-1118032882
dp200
2005-06-06 08:41
2005.06.29
OpenDialog1


14-1117707479
12DFBDDh
2005-06-02 14:17
2005.06.29
Он лайн библиотека "Архивариуса"