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

Вниз

Glscene - вход в здания.   Найти похожие ветки 

 
Trof ©   (2005-01-05 17:02) [0]

Помогите мне разобраться с входом в здания. Сейчас я пытаюсь это сделать так. Сначала загружаю файл
ini с данными об внешней обстановке улицы:
procedure TForm1.FormCreate(Sender: TObject);
begin
 
 LoadMap1(ExtractFilePath(ParamStr(0)) +"saveA.ini",  MainObjects);
end;
где MainObjects - это дамми куб, куда загружаются все объекты из ini файла saveA.ini.
Потом с помощью gldcemanager я обрабатываю столкновение с дверью, после чего загружается другой ini -
saveB.ini, а все файлы из MainObjects - удаляю, чтобы не было загромождённости в памяти.
procedure TForm1.DCEManager1Collision(Sender: TObject; object1,
 object2: TGLBaseSceneObject; CollisionInfo: TDCECollision);
begin

 if object1.Name = "Player" then
 begin
   
  if object2.Name = "D" then
   begin
   Mainobjects.Children[i].Free;
   LoadMap1(ExtractFilePath(ParamStr(0)) +"saveB.ini",  GLDummyCube2);
   end;
   if object2.Name = "E" then
   begin
    GLDummyCube2.Children[i].Free;
   LoadMap1(ExtractFilePath(ParamStr(0)) +"saveA.ini",  Mainobjects);
   end;
   
 end;
end;
Где "D" - это для входа в здание, а "E" - для выхода из здания, которая загружается с saveB.ini.
Но на чинаются какие-то глюки(Access violation at address 004c6d8b in module "dceDemo.exe" Read of address 0fb900ac.), толи glscene глючит, толи я что-то не так делаю.
Подскажите может кто знает способ получше, или мне стоит исправить какие-то ошибки?


 
DeadMeat ©   (2005-01-05 17:23) [1]


>   Mainobjects.Children[i].Free;
>   GLDummyCube2.Children[i].Free;

Вот это чего такое?

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


 
Trof ©   (2005-01-05 18:52) [2]

Это я удаляю все объекты, загруженные из прежнего ini.


 
Домовенок   (2005-01-05 19:18) [3]

Хм... А где у тебя меняется значение переменной i?
Наверное правильнее было бы так:

while MainObjects.Count>0 do MainObjects.Children[0].Free;


 
Trof ©   (2005-01-05 20:06) [4]

Всё равно не получается при входе, - всё окей, но когда выхожу через "E" опять ошибка, появляется gldce.pas, строчка
FOnCollision(Self,Body.OwnerBaseSceneObject,
                    TGLBDCEBody(FClients[oi]).OwnerBaseSceneObject,ColInfo);
     if Assigned(Body.FOnCollision) then
       Body.FOnCollision(Self,TGLBDCEBody(FClients[oi]).OwnerBaseSceneObject,ColInfo);


 
Домовенок   (2005-01-05 21:42) [5]

Наверное перед уничтожением объектов стоит разбивать связи DCE менеджером.

Вообще очень трудно понять что ты делаешь, и где у тебя случается эта ошибка. Может тебе стоит превести кусок когда и указать где у тебя проблема.

ЗЫ: Мой тебе совет не используй *.ini файлы для хранения уровней.


 
Trof ©   (2005-01-05 23:12) [6]

А как лучше всего тогда хранить уровни на твой взгляд.


 
Домовенок   (2005-01-06 01:08) [7]

Самое элементарное и быстрое (на мой взгляд) работать напрямую с текстовыми файлами. Так как, на мой взгляд, *.ini файлы работают медленно.

А лучше всего конечно не поленится, потратить немного времени и написать свой формат.


 
Asteroid ©   (2005-01-06 01:14) [8]

Кстати, у INI файлов (точнее, у класса TIniFile) ограничение на размер 64К.
Свой формат безусловно лучше :) Но в крайнем случае можно взять какой-нибудь XML парсер.


 
Trof ©   (2005-01-06 08:41) [9]

Не подскажете где можно взять хорошую демку с загрузкой уровней, чтобы мне посмотреть как люди это делают?


 
Trof ©   (2005-01-06 13:38) [10]

Хоть кто-нибудь скажите в чём дело - при контакте с нужным предметом (используя dcemanager)
if object1.Name = "Player" then
begin
 
 if object2.Name = "D" then
  begin
  Mainobjects.Children[i].Free;
  LoadMap1(ExtractFilePath(ParamStr(0)) +"saveB.ini",  GLDummyCube2);
  end;
  if object2.Name = "E" then
  begin
   GLDummyCube2.Children[i].Free;
  LoadMap1(ExtractFilePath(ParamStr(0)) +"saveA.ini",  Mainobjects);
  end;
 
end;
end;

вместо того чтобы загрузить другой ini, появлятся ошибка и открывается gldce.pas и строчка
if Assigned(FOnCollision) then
       FOnCollision(Self,Body.OwnerBaseSceneObject,
                    TGLBDCEBody(FClients[oi]).OwnerBaseSceneObject,ColInfo);
     if Assigned(Body.FOnCollision) then
       Body.FOnCollision(Self,TGLBDCEBody(FClients[oi]).OwnerBaseSceneObject,ColInfo);
   end;
 end;
в чём тут ошибка, может dcemanager глючит или я торможу?


 
DeadMeat ©   (2005-01-06 14:07) [11]

Может ты все таки перечитаешь ветку?

Первое: что это опять за [i]
Второе: что это за LoadMap1
Третье: покажи весь код, а не куски непонятно откуда...

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


 
Trof ©   (2005-01-07 18:27) [12]

unit Unit1;

interface

uses ...

type
 TForm1 = class(TForm)
   GLCadencer1: TGLCadencer;
   GLBitmapHDS1: TGLBitmapHDS;
   GLSceneViewer1: TGLSceneViewer;
   Panel1: TPanel;
   cbEnemy: TCheckBox;
   cbTerrain: TCheckBox;
   cbEllipse: TCheckBox;
   cbIce: TCheckBox;
   cbBeer: TCheckBox;
   cbMap: TCheckBox;
   lbCollided: TLabel;
   lbFPS: TLabel;
   Memo1: TMemo;
   GLScene1: TGLScene;
   Beer: TGLFreeForm;
   normal: TGLArrowLine;
   Map: TGLFreeForm;
   Ellipsoid: TGLSphere;
   Enemy: TGLSphere;
   Player: TGLDummyCube;
   plBody: TGLSphere;
   GLCamera1: TGLCamera;
   GLLightSource1: TGLLightSource;
   DCEManager1: TGLDCEManager;
   Timer1: TTimer;
   GLDirectOpenGL1: TGLDirectOpenGL;
   Box: TGLCube;
   cbBox: TCheckBox;
   GLEarthSkyDome1: TGLEarthSkyDome;
   GLDummyCube1: TGLDummyCube;

   GLCube1: TGLCube;
   GLMaterialLibrary1: TGLMaterialLibrary;
 
   Mainobjects: TGLDummyCube;
   GLDummyCube2: TGLDummyCube;
   GLFireFXManager1: TGLFireFXManager;
     procedure LoadMap1(aFileName : string; aPanentGLDummyCube : TGLDummyCube;
     isLoadTerrain : Boolean = True; isMakeCollisions : Boolean = True; isAddThorEffect : Boolean = False);

   procedure FormCreate(Sender: TObject);
   procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
     newTime: Double);
   procedure DCEManager1Collision(Sender: TObject; object1,
     object2: TGLBaseSceneObject; CollisionInfo: TDCECollision);
      procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
     X, Y: Integer);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure FormKeyUp(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   TDCECollision);
     private
   { Private declarations }
 public
   { Public declarations }

   mx, my : Integer;
   LastEnemyPos: TVector;
 end;

var
 Form1: TForm1;
 CanJump: Boolean = True;
 EnemyDistance: Single = 0;
 EnemyTime: Single = 0;
 EnemyStuck: Single = 1;
  B1 : TGLBDCEBody;
  i : Integer;
   saveA,saveB : tinifile;
implementation

{$R *.dfm}
procedure TForm1.LoadMap1(aFileName : string; aPanentGLDummyCube : TGLDummyCube;
 isLoadTerrain : Boolean = True; isMakeCollisions : Boolean = True; isAddThorEffect : Boolean = False);

    procedure SetAsString(coord : TGLCoordinates; s : string);
 var
   s1, s2 : string;
   i : Integer;
   Ar1 : array [0..3] of Single;
 begin
   for i := 0 to 3 do Ar1[i] := 0;
   s1 := Copy(s, 0, Pos(")", s) -1);
   s1 := Copy(s1, Pos("(", s1) +1, High(Integer)) +";";
   i := 0;
   while (Pos(";", s1) > 0) do begin
     s2 := Copy(s1, 0, Pos(";", s1) -1);
     case i of
       0: Ar1[0] := StrToFloat(s2);
       1: Ar1[1] := StrToFloat(s2);
       2: Ar1[2] := StrToFloat(s2);
       3: Ar1[3] := StrToFloat(s2);
     end;
     s1 := Copy(s1, Pos(";", s1) +1, High(Integer));
     Inc(i);
   end;
   if coord.Style in [csPoint]  then coord.SetPoint( Ar1[0], Ar1[1], Ar1[2]);
   if coord.Style in [csVector] then coord.SetVector(Ar1[0], Ar1[1], Ar1[2]);
 end;

var
 B1 : TGLBDCEBody;
 F1 : TGLFreeForm;

 Ini   : TIniFile;
 St1   : TStrings;
 i, i1 : Integer;
 s1, aObjName : string;
begin
 if not FileExists(aFileName) then exit;

    for i := aPanentGLDummyCube.Count -1 downto 0 do
  aPanentGLDummyCube.Children[i].Free;

 Ini := TInifile.Create(aFileName);
 try
   St1 := TStringList.Create;
   try
     Ini.ReadSections(St1);
     s1 := GetCurrentDir;

     for i := 0 to St1.Count -1 do begin
       if Form1.FindComponent(St1[i]) <> nil then begin
         for i1 := 1 to 1000 do
          if Form1.FindComponent(St1[i] +"_" +IntToStr(i1)) = nil then break;
         if i1 = 1000 then continue;
         aObjName := St1[i] +"_" +IntToStr(i1);
       end else aObjName := St1[i];

       if FileExists(Ini.ReadString(St1[i], "LoadFromFile", "")) then begin
         F1 := TGLFreeForm(aPanentGLDummyCube.AddNewChild(TGLFreeform));
         F1.Name := aObjName;
         SetAsString(F1.AutoScaling, Ini.ReadString(St1[i], "AutoScaling", "(1; 1; 1)"));
         SetAsString(F1.Scale, Ini.ReadString(St1[i], "Scale", "(1; 1; 1)"));
         F1.MaterialLibrary := GLMaterialLibrary1;
         F1.LoadFromFile(Ini.ReadString(St1[i], "LoadFromFile", "Map.3ds"));
         SetAsString(F1.Up,        Ini.ReadString(St1[i], "Up",        "(0; 1; 0)"));
         SetAsString(F1.Position,  Ini.ReadString(St1[i], "Position",  "(0; 0; 0)"));
         SetAsString(F1.Direction, Ini.ReadString(St1[i], "Direction", "(0; 0; 1)"));
         f1.PitchAngle:=Ini.ReadFloat(St1[i], "pitchangle", 90);

                    if isMakeCollisions then begin
           B1 := (F1.Behaviours.GetOrCreate(TGLBDCEBody)) as TGLBDCEBody;
           B1.Manager  := DCEManager1;
           B1.Friction := Ini.ReadFloat(St1[i], "Friction", 5);
           B1.Shape    := csFreeform;
           F1.BuildOctree;
         end else begin
                         F1.TagFloat := Ini.ReadFloat(St1[i], "ObjectType", F1.TagFloat);
         end;

       end;
     end;

       SetCurrentDir(s1);
   finally
     St1.Free;
   end;
 finally
   Ini.Free;
 end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   LoadMap1(ExtractFilePath(ParamStr(0)) +"saveA.ini",  MainObjects);

 

     
procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
 newTime: Double);

begin

...
end;

procedure TForm1.DCEManager1Collision(Sender: TObject; object1,
 object2: TGLBaseSceneObject; CollisionInfo: TDCECollision);
begin
  if object1.Name = "Player" then
 begin
   
   
   if object2.Name = "D" then
   begin

   while MainObjects.Count>0 do MainObjects.Children[i].Free;

   LoadMap1(ExtractFilePath(ParamStr(0)) +"saveB.ini",  GLDummyCube2);
   end;
   if object2.Name = "E" then
   begin
     while GLDummyCube2.Count>0 do GLDummyCube2.Children[i].Free;

   LoadMap1(ExtractFilePath(ParamStr(0)) +"saveA.ini",  Mainobjects);
   end;

end;

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
 Shift: TShiftState; X, Y: Integer);
begin
 ...
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
...  
 end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
...  
end;

end.


 
DeadMeat ©   (2005-01-07 21:05) [13]

Ужас.. Тяжело было отфарматировать нормально? Я чуть глаза не сломал читая это все... Из того, что сумел понять, вот это мне не ясно почему так:


> for i := aPanentGLDummyCube.Count -1 downto 0 do
>   aPanentGLDummyCube.Children[i].Free;

Вроде как Домовенок тебе уже показал примерчик один...


>    while MainObjects.Count>0 do MainObjects.Children[i].Free;

А это я хоть ты расшибись понять не могу... Откуда у тебя i взялось та? Ну вот откуда? И к тому же смотри выше...

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


 
Trof ©   (2005-01-07 21:35) [14]

DeadMeat, напиши пожалуйста !как! мне нужно сделать правильно, а то мой тупой котелок сейчас ни фига не варит. Умоляю мучаюсь уже с этим незнамо сколько времени.


 
Trof ©   (2005-01-08 09:38) [15]

Всё равно ни чего не получилось - выскакивает ошибка и открывается gldce.pas строчка -
if Assigned(Body.FOnCollision) then
       Body.FOnCollision(Self,TGLBDCEBody(FClients[oi]).OwnerBaseSceneObject,ColInfo);
   end;
 end;


 
Домовенок   (2005-01-08 12:01) [16]

А где у тебя ошибка, ты нашел? В строчках из исходников GLScene ошибок искать нет смысла, так как там могут ошибки возникать только из-за твоих ошибок или опечаток. Внимательно смотри свой код и отслеживай работу программы построчно. Может, разберешься, где напортачил. На элементарные ошибки в твоем коде тебе уже показывали. Будь внимательнее.


 
Trof ©   (2005-01-08 16:38) [17]

Ну ладно попробуем подругому.
У меня есть определённые координаты скажем (x=10,y=3,z=30),
можно на glscene сделать так чтобы когда камера, попадает в эти координаты загружался другой фриформ?



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

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

Наверх




Память: 0.53 MB
Время: 0.025 c
1-1110474665
randomize
2005-03-10 20:11
2005.03.27
Реестр


1-1110955876
Tankist
2005-03-16 09:51
2005.03.27
LISTVIEW - Как сортировать элементы не по 1-му столбцу, а по 2-му


14-1110398834
Суслик
2005-03-09 23:07
2005.03.27
Это не про дельфи 2005, а про дельфи 6.


1-1110493444
WST
2005-03-11 01:24
2005.03.27
И снова CheckBox


1-1110456845
MGWarlock
2005-03-10 15:14
2005.03.27
Подмогните студенту! Рекурсия.