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

Вниз

Проблемы с выстрелами, а вернее, с убийством себе подобных.   Найти похожие ветки 

 
[EViL]   (2005-04-22 19:09) [0]

Народ, помогите с двиглом! Ничего не могу поделать!
Вот целый список проблем, с которыми я столкнулся:
1) Пуля летит рывками, а не плавно.
2) [Самое страшное :(] При убийстве врага происходит Access Violation.
Я не очень хорошо работаю с TList`ом, поэтому мне кажется, что все проблемы из за него.
Вот линк на исходник: http://pages.plotinka.ru/~ustalov_d/files/ZeroDivide_22apr2005.zip (1,4Мб)
Линк на RemObjects Pascal Script (на его основе сделан скриптинг): http://pages.plotinka.ru/~ustalov_d/files/RemObjects.zip
P.S: в архиве лежат низкокачественные текстуры в целях уменьшения размера.
P.P.S: используется последняя версия GLScene с CVS.


 
Fosgen   (2005-04-22 20:38) [1]

Приветствую.
Ты бы лучше кусок кода, отвечающий за перемещение пули сюда бы запостил, а то думаешь всем интересно в твоем исходнике ковыряться?
То же самое - как у тебя уничтожается супостат? Наверное при Object.Free али Object.Destroy - и происходит твое Access Violation?


 
Fosgen   (2005-04-22 20:39) [2]

Тем более что у тебя исходник в полтора метра - мне например просто тяжко через свой коннект тянуть...


 
[EViL]   (2005-04-22 20:59) [3]

Вот код (КОРЯВЕЙШИЙ :)):

procedure TfrmMain.CadencerProgress(Sender: TObject; const deltaTime, newTime: Double);
begin
 {...}
 TurnBullets;
end;



procedure TurnBullets;
var
 _Index: integer;
begin
 if not Assigned(BulletsList) then Exit;
 DelList.Clear;
 for _Index := 0 to BulletsList.Count - 1 do
   if not TBullet(BulletsList[_Index]).DummyCube.Visible
     then DelList.Add(IntToStr(_Index));
 for _Index := 0 to DelList.Count - 1 do begin
   TBullet(BulletsList[StrToInt(DelList[_Index])]).Free;
   BulletsList.Delete(StrToInt(DelList[_Index]));
 end;
 DelList.Clear;
 with frmMain do
   for _Index := 0 to BulletsList.Count - 1 do
     if Assigned(TBullet(BulletsList[_Index])) and Assigned(TBullet(BulletsList[_Index]).TargetObject) then
     if TBullet(BulletsList[_Index]).DummyCube.Visible and TBullet(BulletsList[_Index]).TargetObject.DummyCube.Visible then begin
       TBullet(BulletsList[_Index]).DummyCube.PointTo(TBullet(BulletsList[_Index]).TargetObject.VectorPosition, YHMgVector);
       TBullet(BulletsList[_Index]).DummyCube.Move(Cadencer.CurrentTime * TBullet(BulletsList[_Index]).Speed);

       TBullet(BulletsList[_Index]).CurrentDistance := TBullet(BulletsList[_Index]).CurrentDistance + Cadencer.CurrentTime * TBullet(BulletsList[_Index]).Speed;
       if TBullet(BulletsList[_Index]).CurrentDistance >= TBullet(BulletsList[_Index]).MaxDistance
         then TBullet(BulletsList[_Index]).DummyCube.Visible := false;

       if Abs(VectorDistance(TBullet(BulletsList[_Index]).DummyCube.Position.AsVector, TBullet(BulletsList[_Index]).TargetObject.VectorPosition)) < Bullet_EndRadius then begin
         TBullet(BulletsList[_Index]).TargetObject.Health := TBullet(BulletsList[_Index]).TargetObject.Health - TBullet(BulletsList[_Index]).Attack;
         if TBullet(BulletsList[_Index]).TargetObject.Health <= 0 then begin
           TBullet(BulletsList[_Index]).TargetObject.DummyCube.Visible := false;
           DelList.Add(IntToStr(_Index));
           PlaySound("die.wav");
         end else PlaySound("damaged.wav");
         TBullet(BulletsList[_Index]).DummyCube.Visible := false;
       end;
     end;
 for _Index := 0 to DelList.Count - 1 do TBullet(BulletsList[_Index]).TargetObject.Free;
end;

Теперь - описание TBullet и TEnemy:

 TGameChar = class // Основной класс игрового объекта
   protected
     FActorFileName: string;
     procedure ActorFileNameChange(AValue: string);
     function GetPosition: TVector4f;
   public
     DummyCube: TGLDummyCube;
     Actor: TGLActor;
     Name: string;
     constructor Create(UniqueName: string; APosition: TVector4f; AActorFileName: string);
     property VectorPosition: TVector4f read GetPosition;
     procedure ChangeAnimation(AAnimationName: string);
     function GetAnimation: string;
     property ActorFileName: string read FActorFileName write ActorFileNameChange;
     destructor Destroy; override;
   end;

 TWeaponedGameChar = class(TGameChar) // Класс вооруженного игрового объекта
   private
     FWeaponFileName: string;
     procedure WeaponFileNameChange(AValue: string);
   public
     Weapon: TGLActor;
     constructor Create(UniqueName: string; APosition: TVector4f; AActorFileName, AWeaponFileName: string);
     property WeaponFileName: string read FWeaponFileName write WeaponFileNameChange;
     destructor Destroy; override;
 end;

 TEnemy = class(TWeaponedGameChar) // Класс противника
   public
     Health: integer;
     constructor Create(UniqueName: string; APosition: TVector4f; AActorFileName, AWeaponFileName: string; AHealth: integer);
     destructor Destroy; override;
 end;

 TBullet = class // Класс пули
   private
     ParticleFX: TGLParticleFXRenderer;
     FXManager: TGLPerlinPFXManager;
     Sphere: TGLSphere;
   public
     DummyCube: TGLDummyCube;
     Speed, CurrentDistance, MaxDistance: Single;
     Attack: integer;
     TargetObject: TEnemy;
     constructor Create(AStartVector: TVector4f; AMaxDistance: Single; ATargetObject: TEnemy);
     destructor Destroy; override;
 end;

 const Bullet_EndRadius = 0.3;


Щас наверно, выкину текстуры из исходника и сообщу вам, чем их заменить.


 
[EViL]   (2005-04-22 21:00) [4]

Ах да!!!
DelList: TStringList;
BulletsList, ObjectsList: TList;


 
[EViL]   (2005-04-22 21:14) [5]

Вот линк на ТОЛЬКО ИСХОДНИК: http://pages.plotinka.ru/~ustalov_d/files/ZeroDivide_22apr_2005_src_only.zip (40кб).
приложены файлы README, которые помогут вам восстановить удалённые текстуры и модели.
--
Заранее спасибо за помощь.


 
Fosgen   (2005-04-23 17:38) [6]

Сразу - несколько советов:
1. Попробуй сделать перемещение не через готовую фнкцию Move, а через коррекцию координат - AbsoluteDirection*Speed*Deltatime.
2. Выключи отображение объектов типа TGLDummyCube - жрут ресурсов до дури - уже это может помочь.

Посмотрю исходник - мож еще чего скажу.


 
[EViL]   (2005-04-23 18:10) [7]

1. Надо попробовать...
2. У всех TGLDummyCube`ов свойство VisibleAtRunTime установлено в FALSE.


 
_sHaDe_ ©   (2005-04-24 12:25) [8]

1) Пуля летит рывками, а не плавно.
У меня пуля двигалась рывками если я считал не в каденсере, а через таймер.


 
[EViL]   (2005-04-24 13:40) [9]

_sHaDe_: всё идёт в каденсере.
Fosgen: что-то ты долго не отвечаешь... Запутался в моей ахинее? :) Отзовись plz.



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

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

Наверх




Память: 0.5 MB
Время: 0.038 c
14-1122230370
Chuvak
2005-07-24 22:39
2005.08.14
Посоветуйте цифровик...


14-1122024136
asdqwer
2005-07-22 13:22
2005.08.14
SMS Email Gateway


1-1121805177
Adolf
2005-07-20 00:32
2005.08.14
Процедура в библи-ке


1-1122008024
serega78
2005-07-22 08:53
2005.08.14
Как отловить событие Close [x] на форме?


1-1122518346
npr2
2005-07-28 06:39
2005.08.14
печать отчкта в crystal reports