Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возможно ламерский вопрос по GLScene [Delphi, Windows]


Fosgen ©   (2005-03-19 19:07:00) 

Приветствую. Извиняюсь за предположительно дурацкий вопрос. Вопрос в том что для создания некольких графических экранов в игре на GLScene (например экран с основным меню, основной игровой, экран карты и т.д.) треба как-то их заранее генерить, а опосля в процессе - переключаться. Вот как это более-менее разумно сделать в GLScene - ума не приложу. Понимаю что туплю и скорее всего это - просто. Но как именно? Подскажите, плиз. Буду очень благодарен. Заранее спасибо.


Fosgen   (2005-03-22 20:36:00) [1]

Однако, залил - можна тянуть. ТОлько за "дизайн" сайта просьба не пинать - это был первый мой сайт и я им не занимался уже года два...


Fosgen   (2005-03-22 20:17:00) [2]

2Домовенок -
Да у меня на платном даже есть: http://adm.trening-omsk.ruтолько туда же еще выложить надо, а у меня АТС не очень - заливать тяжко... Попробую сегодня, но только в архиве...


Домовенок   (2005-03-22 17:36:00) [3]

Лучше заведи сайт на бесплатном хостинге выложи туда картинки, и оставь ссылки на них здесь... Кому интересно будет, те посмотрят :)


Домовенок   (2005-03-22 17:31:00) [4]

Лучше заведи сайт на бесплатном хостинге выложи туда картинки, и оставь ссылки на них здесь... Кому интересно будет, те посмотрят :)


Fosgen   (2005-03-22 17:02:00) [5]

Вот тут подумал - я всякие вопросы задаю, а о чем... Так что ежли кому интересно - могу кинуть мылом архивчик скриншотов того что делаю. 132 кб. JPEG 1024x768...


Fosgen   (2005-03-22 06:01:00) [6]

Ну RayCast разумеется из того объекта с которым произошло столкновение. Но т.к. таких объектов в сцене у меня много и вообще таковым может оказаться почти каждый - конкретного списка объектов - нету. Вот код:
procedure TForm1.MissileCollisionCollision(Sender: TObject; object1,
 object2: TGLBaseSceneObject);
Var i : Byte;
   Dis1, Dis2 : Single;
   rayStart, rayVector, iPoint, iNormal : TVector;
   CurrentObj : TFreeForm;
   Pos1,Pos2:Byte;
begin
   Pos1:=0;
   Pos2:=0;
   {if Missile[object1.tag]<>nil then Pos1:=Pos('_Shield'+IntToStr(Missile[object1.tag].RaceOwner),object2.Name);
   if Missile[object2.tag]<>nil then Pos2:=Pos('_Shield'+IntToStr(Missile[object2.tag].RaceOwner),object1.Name);}
   if (Pos('Missile',object1.Name)<>0)And(Pos('Shot',object2.Name)=0)And(object2.ClassName<>'TPlane') then
   begin
               Missile[object1.tag].Detonate:=True;
   end;
   if (Pos('Missile',object2.Name)<>0)And(Pos('Shot',object1.Name)=0)And(object1.ClassName<>'TPlane') then
   begin
               Missile[object2.tag].Detonate:=True;
   end;
   {if Shot[object1.tag]<>nil then Pos1:=Pos('_Shield'+IntToStr(Shot[object1.tag].RaceOwner),object2.Name);
   if Shot[object2.tag]<>nil then Pos2:=Pos('_Shield'+IntToStr(Shot[object2.tag].RaceOwner),object1.Name);}
   if (Pos('Shot',object1.Name)<>0)And(Pos('Shot',object2.Name)=0)And(Pos('Missile',object1.Name)=0)And(object2.ClassName<>'TP lane') then
   begin
       if Shot[object1.Tag]<>nil then
          Shot[object1.Tag].HitedObj:=object2 as TGLCustomSceneObject;
       rayStart:=object1.AbsolutePosition;
       rayVector:=object1.Direction.AsVector;
       NegateVector(rayVector);
       NormalizeVector(rayVector);

       CurrentObj:=object2 as TFreeForm;
       if CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal)then
       begin
          NormalizeVector(iNormal);
          AddHit(iPoint,iNormal,tsPlasma,40);
          Shot[object1.tag].Detonate:=True;
       end;
   end;
   if (Pos('Shot',object2.Name)<>0)And(Pos('Shot',object1.Name)=0)And(Pos('Missile',object1.Name)=0)And(object1.ClassName<>'TP lane') then
   begin
       if Shot[object2.Tag]<>nil then
          Shot[object2.Tag].HitedObj:=object1 as TGLCustomSceneObject;
       rayStart:=object2.AbsolutePosition;
       rayVector:=object2.Direction.AsVector;
       NegateVector(rayVector);
       NormalizeVector(rayVector);

       CurrentObj:=object1 as TFreeForm;
       if CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal)then
       begin
          NormalizeVector(iNormal);
          AddHit(iPoint,iNormal,tsPlasma,40);
          Shot[object2.tag].Detonate:=True;
       end;
   end;
   {if Beam[object1.tag]<>nil then Pos1:=Pos('_Shield'+IntToStr(Beam[object1.tag].RaceOwner),object2.Name);
   if Beam[object2.tag]<>nil then Pos2:=Pos('_Shield'+IntToStr(Beam[object2.tag].RaceOwner),object1.Name);}
  ///_____________________________________________________________________
   if (Pos('Beam',object1.Name)<>0)And(Pos('Shot',object2.Name)=0)And(Pos('Beam',object2.Name)=0)And(Pos('Missile',object2.Nam e)=0)And(object2.ClassName<>'TPlane')And(object2.ClassName<>'TSprite') then
   begin
     if Beam[object1.tag]<>nil then begin
       SetVector(rayStart, object1.AbsolutePosition);
       SetVector(rayVector, object1.Direction.AsVector);
       ScaleVector(rayVector,800);
       if Beam[object1.Tag]<>nil then
          Beam[object1.Tag].HitedObj:=object2 as TGLCustomSceneObject;
       CurrentObj:=object2 as TFreeForm;
       if CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal) then
       begin
         NormalizeVector(iNormal);
         with Beam[object1.tag] do begin
             tdummy:=TDummyCube(GLcadencer1.Scene.Objects.AddNewChild(TDummyCube));
             tdummy.Position.AsVector:=iPoint;
             tdummy.Direction.AsVector:=iNormal;
             Detonate:=True;
             Hit;
         end;
         with Beam[object1.tag].fplane do begin                     //Creating flare of firing
             Material.BlendingMode:=bmAdditive;
             Material.MaterialLibrary:=Sfx_Textures;
             Material.LibMaterialName:='beamHit';
             ObjectsSorting:=osNone;
         end;
       end;
     end;
   end;
   if (Pos('Beam',object2.Name)<>0)And(Pos('Shot',object1.Name)=0)And(Pos('Beam',object1.Name)=0)And(Pos('Missile',object1.Nam e)=0)And(object1.ClassName<>'TPlane')And(object1.ClassName<>'TSprite') then
   begin
     if Beam[object2.tag]<>nil then begin
       SetVector(rayStart, object2.AbsolutePosition);
       SetVector(rayVector, object2.Direction.AsVector);
       ScaleVector(rayVector,800);//без этого почему-то не работает
       
       if Beam[object2.Tag]<>nil then
          Beam[object2.Tag].HitedObj:=object1 as TGLCustomSceneObject;
       
       CurrentObj:=object1 as TFreeForm;
       if CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal) then
       begin
         NormalizeVector(iNormal);
         with Beam[object2.tag] do begin
             tdummy:=TDummyCube(GLcadencer1.Scene.Objects.AddNewChild(TDummyCube));
             tdummy.Position.AsVector:=iPoint;
             tdummy.Direction.AsVector:=iNormal;
             Detonate:=True;
             Hit;
         end;
         {with Beam[object2.tag].fplane do begin                     //Creating flare of firing
             Material.BlendingMode:=bmAdditive;
             Material.MaterialLibrary:=Sfx_Textures;
             Material.LibMaterialName:='beamHit';
             ObjectsSorting:=osNone;
         end; }
       end;
     end;
   end;
end;


Как писано в хелпе - каким объектом какой будет - первым или вторым - заранее неизвестно - посему приходится проверять по два раза. Правда статистика показывает что более динамичные объекты оказываются под номером два. Некоторые проверки нужны для определения - что за объект и на всякий-пожарный - отключения столкновений со спрайтами (взрывов допустим) и нек. другими объектами (типа ракет). Вот с "Shot" и "Missile" все работает, а с "Beam" - какая-то фигня... Точнее - так как луч непрерывен от точки испускания до точки попадания, то и сталкивается на всем своем протяжении... И как это обойти элегантным способом - пока мне непонятно.


DeadMeat   (2005-03-22 01:33:00) [7]

Откуда делаешь RayCast..?
Из какого объекта?

---
...Death Is Only The Begining...


Fosgen   (2005-03-21 20:56:00) [8]

Я делаю коллизии в два этапа - сначала CollisionManager определяет факт коллизии и объекты, столкнувшиеся. А потом через OctreeRayCastIntersect - точку столкновения.


DeadMeat   (2005-03-21 20:24:00) [9]


> И еще одно - может это уже не в тему, да и по коллизиям
> много веток,

А ты чем коллизии проверяешь?
Просто так похоже на RayCastIntersect.. А вот GroupIndex сбивает вроде как на CollisionManager...

---
...Death Is Only The Begining...


Fosgen   (2005-03-21 18:43:00) [10]


> Эээ... Это когда началось такое? При мне не было.

В ветке озаглавленной: "Проблема при переносе проги из оконного в полный экран в GLScene" выяснилось что такое тоже возможно.
На текущий момент я многоэкранность реализовываю след. образом:
делаю несколько вьюверов, со своими TGLScene - как было рекомендовано в первом ответе. По мне - оказалось наиболее реализуемый вариант, потому как грузить-выгружать сцены при переключении экранов в игрром процессе - несколько тормознуто (хотя может я не так подошел к этому вопросу), а реализовывать меню в той же сцене и таскать за собой - у меня организация сцены не позволяет. Переключаю вьюверы обычным образом по свойствам Enabled и Visible. Когда требуется стопорю Cadencer и Timer свойством Enabled. Вроде все работает. Спасибо за советы.

И еще одно - может это уже не в тему, да и по коллизиям много веток, но я столкнулся со следующим - реализация коллизии луча- меша (ну как ионные пушки в Homeworld), на в произвольной точке по всей его длине, с учетом того что объект-родитель для меша
тоже обрабатывает столкновения. В общем у меня луч упорно сталкивается с самой пушкой, из которой он выстреливается. GroupIndex в данном случае не помогает -он один и у пушки-родителя и у цели... Вот такая ерундистика... С остальными столкновениями я разобрался, побродив по многим веткам этого форума, за что преогромное спасибо как модераторам, так и посетителям.


Da Stranger   (2005-03-21 16:48:00) [11]

Интересно, как реализована менюшка... Нельзя ли просто её перемещять за камерой и показывать/скрывать, когда юзеру понадобится? Если это glForm, то и перемещать не надо будет...


Xeno   (2005-03-21 08:05:00) [12]

>mr_Coder
Я сделал аналогично, для меню отдельная камера привязанная к объекту на котором отображается само меню :-)


mr_Coder   (2005-03-19 23:58:00) [13]

А я для одного вьювера сделал несколько сцен, в одно меню, в другом - игра...
При необходимости у вьювера меняю камеру :)


DeadMeat   (2005-03-19 22:24:00) [14]


> А с формами - как GLFullScreenViewer переключать, коли он
> берет рендер с первого GLSceneViewer'а?

Эээ... Это когда началось такое? При мне не было.

Раз в полном экране, попробуй переключать камеру у вьюера... Сделай разные камеры на игру и на меню. Когда надо, переключай.
И лучше сделай их в разных TGLScene объектах... Так проще будет.

---
...Death Is Only The Begining...


Fosgen   (2005-03-19 22:03:00) [15]

Хотелось-то без обращений к винту обойтись... А с формами - как GLFullScreenViewer переключать, коли он берет рендер с первого GLSceneViewer'а? Я же в полноэкранке...


DeadMeat   (2005-03-19 21:27:00) [16]

А в чем именно проблема?
Разве нельзя сделать две разные формы и на них уже лепить что надо?
Еще можно сделать их отдельными модулями (DLL) и их грузить...
Также вполне реально на одной форме сделать два GLSceneViewer-а и показывать нужный...
У каждого свой TGLScene. Cadencer можно один оставить и переключать по мере надобности.

---
...Death Is Only The Begining...


Fosgen   (2005-03-19 20:02:00) [17]

Извиняюсь за настойчивость - это опять я... Я ужо который день бьюсь над этим вопросом - переключение экранов с разными сценами в полноэкранном режиме - помогите кто-нить. Плиз!


Fosgen   (2005-03-19 19:23:00) [18]

На одной форме - да. Видны ли одновременно - нет. Пример: При заргузке - главная менюшка. Из нее - переключаешься в основной игровой экран - совсем другая сцена и т.д. Из основного GLViewera переключаешься в вспомогательной экран - допустим тогрговля ну или что-то подобное...


DeadMeat   (2005-03-19 19:16:00) [19]


> как-то их заранее генерить, а опосля в процессе - переключаться

Кого генерить и на что переключаться...?
Они одновременно видны или как?
Они на одной форме или как?

---
...Death Is Only The Begining...


Наверх

Титульная страница Поиск, карта сайта Написать письмо