Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.042 c
4-1114937615
Dozer
2005-05-01 12:53
2005.06.29
Драйвер сетевой карты на Delphi


1-1117605664
mmms
2005-06-01 10:01
2005.06.29
Помогите разобрать строку, нужно взять только цифры с "конца"


1-1118082192
capkoh
2005-06-06 22:23
2005.06.29
Массив указателей или компонентов?


9-1111237106
Xeno
2005-03-19 15:58
2005.06.29
Проблемы с камерой


1-1117635667
Aleksandr.
2005-06-01 18:21
2005.06.29
Есть какие-то готовые технологии для градиента цветов?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский