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

Вниз

Возможно ламерский вопрос по GLScene   Найти похожие ветки 

 
Fosgen   (2005-03-19 19:07) [0]

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


 
DeadMeat ©   (2005-03-19 19:16) [1]


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

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

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


 
Fosgen   (2005-03-19 19:23) [2]

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


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

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


 
DeadMeat ©   (2005-03-19 21:27) [4]

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

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


 
Fosgen   (2005-03-19 22:03) [5]

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


 
DeadMeat ©   (2005-03-19 22:24) [6]


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

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

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

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


 
mr_Coder ©   (2005-03-19 23:58) [7]

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


 
Xeno ©   (2005-03-21 08:05) [8]

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


 
Da Stranger ©   (2005-03-21 16:48) [9]

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


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


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

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

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


 
DeadMeat ©   (2005-03-21 20:24) [11]


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

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

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


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

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


 
DeadMeat ©   (2005-03-22 01:33) [13]

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

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


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

Ну 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" - какая-то фигня... Точнее - так как луч непрерывен от точки испускания до точки попадания, то и сталкивается на всем своем протяжении... И как это обойти элегантным способом - пока мне непонятно.


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

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


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

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


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

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


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

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


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

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



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

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

Наверх




Память: 0.53 MB
Время: 0.066 c
14-1117510118
Магнум
2005-05-31 07:28
2005.06.29
Microsoft Outlook


14-1117898334
Juice
2005-06-04 19:18
2005.06.29
NTFS ный диск под 98 ой


4-1115404206
Switer
2005-05-06 22:30
2005.06.29
Блокировка клавиш


9-1107804770
Micke
2005-02-07 22:32
2005.06.29
2D движок. Третья демка. Очередная :)


1-1117624080
Anics
2005-06-01 15:08
2005.06.29
Как отловить событие внутри родительской формы MDI приложен