![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возможно ламерский вопрос по 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...