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

Вниз

Возможно ламерский вопрос по 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.035 c
14-1117429492
Тульский
2005-05-30 09:04
2005.06.29
Игра на гитаре


4-1115318045
bc0113
2005-05-05 22:34
2005.06.29
FreeLibrary


3-1116440985
Сергей2345
2005-05-18 22:29
2005.06.29
Поможет ли Delfi?


4-1113469919
Pa5ha
2005-04-14 13:11
2005.06.29
Menu &amp; OpenDialog runTime


1-1118271217
Rico
2005-06-09 02:53
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский