Форум: "Игры";
Текущий архив: 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