Witam. Niedawno zacząłem bawić się z DelphiX i mam kilka prostych pytań odnośnie kolizji sprite'ów. Przedstawię problem na przykładzie: chcę zrobić 'grę' a'la pacman - na ekranie jest żółty pacman i kilka duchów (to z jakiegoś tutoriala ;)). Tworzę dwa typy:
TPacman = class(TImageSprite)
public
procedure DoMove(MoveCount: Integer); override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
end;
TGhost = class(TImageSprite)
private
procedure Hit;
end;
Oczywiście dwie zmienne: żółty pac typu TPacman i wrogie duchy typu TGhost.
Nie wiem czy jest to najlepszy sposób na wykonywanie kolizji (wszystko biorę z przykładów), no ale dalej: Procedura na kolizję:
procedure TPacman.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is TGhost then
TGhost(Sprite).Hit;
Done := False;
end;
- I tu mam pierwsze pytanie: co daje linijka Done := False; ? Czy musi tam być?
Procedura uderzenia ducha (chcę żeby po uderzeniu została odtworzona animacja)
procedure TGhost.Hit;
begin
Collisioned := False;
Image := Form1.DXImageList.Items.Find('Explode');
Width := 28;
Height := Image.Height;
AnimCount := 5;
AnimLooped := False;
AnimSpeed := 50/1000;
AnimStart := 0;
end;
- Kolejne pytanie: po co zmieniać Collisioned := False; ?
A teraz najgorsze: chciałem dodać efekt animacji - eksplozji po zjedzeniu ducha.
Kody animacji są wyżej, niby OK, ale po odtworzeniu animacji sprite nie znika z pamięci (chciałem ptoem policzyć ilość sprite'ów na ektranie metodą DXSpriteEngine.Engine.AllCount). No dobra, dodaję polecenie Dead; w procedurze TGhost.Hit; a gdzieś w procedurze OnTimer takie coś:
DXSpriteEngine.Dead;
edit1.text:=inttostr(DXSpriteEngine.Engine.DrawCount);
Teraz wszystko ładnie, tylko duch znika zanim odtworzy się cała animacja eksplozji. Wygląda na to że polecenie DXSpriteEngine.Dead; ściąga go z ekranu w momencie odtwarzania animacji (bo bez tego polecenia animacja jest odtwarzana, ale nie zmniejsza się ilość duchów w liczniku).
3. Co z tym zrobić?
- Czy jest jakaś właściwość określająca ilość sprite'ów danego typu na ekranie? (coś jak DXSpriteEngine.Engine.AllCount)? Chciałbym policzyć ilość sprite'ów typu TGhost.
Z góry dziękujęza każdą odpowiedź...