[DelphiX] .PixelCheck

0

Uzywam pakietu DelphiX i chce wykryć kolizję pixel/pixel. Napisałem se własną funkcję wykrywania kolizji:

Function Kolizja(Jeden: TSprite; Dwa: TSprite):Boolean;
begin

   if (Jeden.X + Jeden.Width > Dwa.X) and
      (Jeden.X < Dwa.X+Dwa.Width) and
      (Jeden.Y + Jeden.Height > Dwa.Y) and
      (Jeden.Y < Dwa.Y+Dwa.Height) then
      result:= true
      else result:= false;
      
end;

Ale po ustawieniu 
```delphi
.PixelCheck:=True; 

sprita terz to nie zbardzo daje... Słyszałem że Dx ma procedure DoCollision ale nie potrafię jej użyć a we wszystkich poradnikach nie moge znaleźć opisu. Jak ktoś może opisać jak łatwo wykryć kolizję p/p albo dokladny opis procedury DoCollision to bardzo proszę. Pozr!

0

Witaj,

Pixelcheck nie bardzo zdaje chociazby dlatego, ze Twoja metoda kolizji nie wykorzystuje wlasciwosci Pixelcheck.

No ale zacznijmy od poczatku. DelphiX posiada wlasne metody do wykrywania kolizji, wystarczy ze spojrzysz na folder Samples/Sprite/Basic i wszystko staje sie jasne. Jesli nie, to postaram sie pokrotce wyjasnic.

Stworz sobie nowa klase, na przyklad:

  TMySprite = class(TImageSprite) 
  public 
    procedure DoMove(MoveCount: Integer); override; 
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override; 
  end; 

Jak widzisz przelamujemy w niej oryginalne metody. Jedna bedzie odpowiadala za poruszanie sie spirtea a druga za obsluge kolizji. Ich wnetrze wyglada tak:

procedure TMySprite.DoCollision(Sprite: TSprite; var Done: Boolean); 
begin 
  inherited; 
//tutaj sprawdzamy z jakim spritem nastapila kolizja i po prostu teleportujemy spritea gdziestam
  if Sprite is TImageSprite then     
    X:=300; 
end; 

W metodzie DoMove zakazdym razem musisz dokonywac testu na kolizje, czyli
wstaw Collision;

procedure TMySmallSprite.DoMove(MoveCount: Integer); 
begin 
  inherited; 
// tutaj wstaw jakis ruch spritea np x:=x+1;
  Collision; 
end; 

Stworz sobie teraz dwa spritey, podepnij je pod DXEngineSprite i testuj;)
Przyklad tworzenia spritea:

  MySprite:=TMySmallSprite.Create(DXSpriteEngine1.Engine); 
  with MySmallSprite do 
  begin 
    Image := DXImageList1.Items.Find('1'); 
    X:=300; 
    Y:=150; 
    Z := 1; 
    Width := Image.Width; 
    Height := Image.Height; 
    PixelCheck:=True; 
  end;

Pamietaj ze Pixelcheck jest wolny. Moze on tez CI niedzialac gdyz niektore wersje DelphiX zawieraja bledy z tym zwiazane. Pojawilo sie jednak juz kilka nowszych, niektore obsluguja akceleracje sprzetowa...

Pozdrawiam,

Wodzu

1 użytkowników online, w tym zalogowanych: 0, gości: 1