Форум: "Игры";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
ВнизФатальная ошибка при вызове CollisionManager.CheckCollisions Найти похожие ветки
← →
Fosgen (2005-07-20 09:06) [0]Вопрос:
Никто не сталкивался с появлением ошибки Access Violation при вызовеCollisionManager.CheckCollisions
после перехода на более "свежие" версии GLScene? Ошибка возникает даже если обработчик CheckCollisions - "пустой" - т.е. кроме комментарием междуbegin ... end;
ничего нет.
Подробности:
В столкновениях участвуют FreeForms с построенным Octree (BuildOctree). Для определения конкретной точки соприкосновения объектов. При рассчитанных Octree отладчик стопорится в модуле VectorLists.
При отключении расчета Octree отладчик вообще не указывает какое-либо место. Просто возникает Access Violation.
В обоих случаях:
Обработчик CheckCollision - пустой.
Если даже по счастливому совпадению программа запустилась - идут страшные тормоза (видюха - GF6800GT PCI-Ex, P-3000, 1Gb RAM) - порядка 2 FPS!!! При выходе из программы корректным способом - возникает все тот же Access Violation.
Помогите, кто чем может! Заранее - спасибо!
← →
Fosgen (2005-07-20 09:55) [1]Еще хотелось бы добавить - под старой версией GLScene (в которой еще не было GLLensFlare, GLTrail и PerlinGFX) весь имеющийся алгоритм совершенно корректно работал и давал порядка 170 FPS. Проблемы начались именно после перехода на более "совершенную" версию. :(((
← →
DeadMeat © (2005-07-20 10:17) [2]Код..? И если можно цели.. Может есть другой способ..
← →
Fosgen (2005-07-20 11:01) [3]
procedure TForm1.GLCadencer1Progress(Sender: TObject; DeltaTime,
NewTime: Double);
begin
MissileCollision.CheckCollision;
end;
procedure TForm1.MisCollision(Sender: TObject; object1,
object2: TGLBaseSceneObject);
var i: Byte;
Dis1, Dis2: Single;
rayStart, rayVector, iPoint, iNormal: TVector;
CurrentObj: TGLFreeForm;
CurrentShield: TShield;
begin
// GLCadencer1.Enabled:=False;
if Sender=MissileCollision then
begin
//===Missile=================================================================
if (object2.ClassName = "TMissileForm") and (object1.ClassName <> "TShotForm") and (object1.ClassName <> "TGLPlane") and (Missile[object2.Tag] <> nil) then
begin
if (object1.ClassName = "TShield") then
begin
CurrentShield := object1 as TShield;
if (CurrentShield.RaceOwner <> Missile[object2.tag].RaceOwner) then
begin
Missile[object2.tag].Detonate := True;
Missile[object2.tag].HitedObj := object1 as TGLCustomSceneObject;
//CurrentShield.FlashHit(CurrentShield.ShieldPower - Missile[object2.tag].Power);
AddHit(iPoint, iNormal, tsPlasma, 40, True);
CurrentShield.ShieldPower := CurrentShield.ShieldPower - Missile[object2.tag].Power;
if CurrentShield.ShieldPower <= 0 then
with TGLBCollision(CurrentShield.Behaviours.GetByClass(TGLBCollision)) do
GroupIndex := -1;
end;
end else
begin
Missile[object2.tag].Detonate := True;
Missile[object2.tag].HitedObj := object1 as TGLCustomSceneObject;
end;
end;
//=====Shot=======================================================================
if (object2.ClassName = "TShotForm") and (object1.ClassName <> "TShotForm") and (object1.ClassName <> "TMissileForm") and (object1.ClassName <> "TGLPlane") and (Shot[object2.Tag] <> nil) then
begin
Shot[object2.Tag].HitedObj := object1 as TGLCustomSceneObject;
rayStart := object2.AbsolutePosition;
rayVector := object2.Direction.AsVector;
NegateVector(rayVector);
NormalizeVector(rayVector);
CurrentObj := object1 as TGLFreeForm;
if CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal) then
begin
NormalizeVector(iNormal);
if (object1.ClassName = "TShield") then
begin
CurrentShield := object1 as TShield;
if (CurrentShield.RaceOwner <> Shot[object2.tag].RaceOwner) then
begin
AddHit(iPoint, iNormal, tsPlasma, 40, True);
Shot[object2.tag].Detonate := True;
Shot[object2.tag].fmodel.Visible := False;
//CurrentShield.FlashHit(CurrentShield.ShieldPower - Shot[object2.tag].Power);
CurrentShield.ShieldPower := CurrentShield.ShieldPower - Shot[object2.tag].Power;
if CurrentShield.ShieldPower <= 0 then
with CurrentShield.Behaviours.Behaviour[0] as TGLBCollision do
GroupIndex := -1;
end;
end else
begin
AddHit(iPoint, iNormal, tsPlasma, 40, False);
Shot[object2.tag].Detonate := True;
Shot[object2.tag].fmodel.Visible := False;
end;
end;
end;
//======Beam======================================================================
if (object1.ClassName = "TBeamForm") and (object2.ClassName <> "TBeamForm") and (object2.ClassName <> "TShotForm") and (object2.ClassName <> "TGLPlane") and (object2.ClassName <> "TGLSprite") then
begin
if Beam[object1.tag] <> nil then begin
SetVector(rayStart, Beam[object1.tag].StartVector);
SetVector(rayVector, Beam[object1.tag].TrgVector);
{NormalizeVector(RayVector);
//ScaleVector(RayVector, 15);
AddVector(rayVector, rayStart);
SetVector(rayVector, object1.AbsoluteDirection); }
//ScaleVector(rayVector,991);
CurrentObj := object2 as TGLFreeForm;
if (not Beam[object1.tag].Detonate) and (CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal)) then
begin
NormalizeVector(iNormal);
with Beam[object1.tag] do begin
Beam[object1.Tag].HitedObj := object2 as TGLCustomSceneObject;
tdummy := TGLDummyCube(GLcadencer1.Scene.Objects.AddNewChild(TGLDummyCube));
tdummy.Position.AsVector := iPoint;
tdummy.Direction.AsVector := iNormal;
Detonate := True;
Hit;
with Beam[object1.tag].fHitSprite do begin //Creating flare of firing
Material.BlendingMode := bmAdditive;
Material.MaterialLibrary := Sfx_Textures;
Material.LibMaterialName := "beamHit";
ObjectsSorting := osNone;
end;
end;
end;
end;
end;
if (object2.ClassName = "TBeamForm") and (object1.ClassName <> "TBeamForm") and (object1.ClassName <> "TShotForm") and (object1.ClassName <> "TGLPlane") and (object1.ClassName <> "TGLSprite") then
begin
if Beam[object2.tag] <> nil then begin
SetVector(rayStart, Beam[object2.tag].helper.AbsolutePosition);
SetVector(rayVector, Beam[object2.tag].TrgVector);
{NormalizeVector(RayVector);
ScaleVector(RayVector, 15);
AddVector(rayVector, rayStart);
SetVector(rayVector, object2.AbsoluteDirection);
ScaleVector(rayVector,991); }
CurrentObj := object1 as TGLFreeForm;
if (not Beam[object2.Tag].Detonate) and (CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal)) then
begin
NormalizeVector(iNormal);
with Beam[object2.tag] do begin
Beam[object2.Tag].HitedObj := object1 as TGLCustomSceneObject;
tdummy := TGLDummyCube(GLcadencer1.Scene.Objects.AddNewChild(TGLDummyCube));
tdummy.Position.AsVector := iPoint;
tdummy.Direction.AsVector := iNormal;
Detonate := True;
Hit;
with Beam[object2.tag].fHitSprite do begin //Creating flare of firing
Material.BlendingMode := bmAdditive;
Material.MaterialLibrary := Sfx_Textures;
Material.LibMaterialName := "beamHit";
ObjectsSorting := osNone;
end;
end;
end;
end;
end;
// GLCadencer1.Enabled:=True; }
end;
end;
Цели:
Через CollisionManager - определяется факт столкновения и взаимодейстующие объекты. Потом через OctreeRayCastIntersect - точка столкновения и нормаль для создания "спецэффектов".
Повторюсь - под старой версией GLScene все работало. Отлажены были блоки Shot и Missile. После "апгрейда" GLScene престали отрабатывать столкновения и стало безумно тормозить. Работает 1 раз из 10-ти, с указанными проблемами. Я был, мягко говоря, неприятно удивлен. Думаю проблема в "доработке" поздней версии.
← →
Fosgen (2005-07-20 11:03) [4]Насчет "пустого" обработчика TForm1.MisCollision(Sender: TObject; object1,
object2: TGLBaseSceneObject); - Если закоментировать ВСЕ что есть между begin...end; - ничего в работе кода не меняется.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c