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