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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.044 c
14-1109190443
DevPortal
2005-02-23 23:27
2005.03.27
Портал Разработчика (DevPortal)


11-1093384077
Алексей
2004-08-25 01:47
2005.03.27
Юникод


4-1108454861
Morf
2005-02-15 11:07
2005.03.27
Как найти значение в памяти любого приложения?


14-1110374841
Yanis
2005-03-09 16:27
2005.03.27
Толковый словарь


3-1109531308
Nikita--
2005-02-27 22:08
2005.03.27
как заперетить добаление(изменение) значений в столбец DBGrid a..





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский