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

Вниз

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

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

Наверх





Память: 0.48 MB
Время: 0.011 c
4-1118591508
Asdweb
2005-06-12 19:51
2005.08.14
Как открать файл


1-1122402394
iskatel
2005-07-26 22:26
2005.08.14
как сжать поток


3-1120744873
fens
2005-07-07 18:01
2005.08.14
скроллинг текста


4-1117105255
Greg123
2005-05-26 15:00
2005.08.14
работа с окнами через WinApi в Windows 2000


1-1122455645
Begin
2005-07-27 13:14
2005.08.14
TPanel и Canvas. Можно ли рисовать по TPanel ?





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