Kolizja sprite'ów - przypadek nadzwyczajny

0

Witam!
Uprzedzam, że z większością podobnych tematów z innych forów zapoznałem się i nie rozwiązały one mojego problemu. Dokładnie chodzi mi o kolizję między dwoma Sprite'ami(jeden stoi, druga rusza się za pomocą DoMove), w której pierwszy Sprite ma możliwość pójścia w inną stronę, która nie jest zablokowana przez tego drugiego Sprite'a, który jest "powielony"(pochodzi z tablicy) i tworzy labirynt... Oczywiście opieram się na procedurze DoCollision, ale w zupełności nie mogę wymyślić, jak nasz "ludek" ma iść w stronę niezablokowaną...Mniej więcej tak moja procedura wyglądała...

procedure TGracz.DoCollision(Sprite: TSprite; var Done: Boolean);
var a2,b2:smallint;
begin
If (Sprite is TKlocek) then
begin
for a2:=1 to 16 do
for b2:=1 to 10 do
begin
if mapa[a2,b2]=true then
begin
If (Klocek[a2,b2].x+x1=Gracz.X) or (Klocek[a2,b2].X=Gracz.X+x1) or
(Klocek[a2,b2].Y+y1=Gracz.Y) or (Klocek[a2,b2].Y=Gracz.Y+y1) then
Gracz.Collisioned:=true;
end;
end;
end;
end;

Jakby mapa jest tablicą boolean, za pomocą której stworzyłem z pliku tekstowego typu 0-1 kształt mojej mapki...

Załączam także wygląd dotychczasowy wygląd mojej gry :)

Z góry dziękuje za pomoc i sorki za "informatyczne kolokwializmy" i pewnie jakieś durne błędy, ale po prostu dopiero zaczynam :)

P.S. Korzystam z delphixu bo jest najprostszy :)

0

Jak rozumiem spritem poruszasz za pomocą np. strzałek, więc sprawdź który kierunek został ostatnio wybrany i ten zablokuj.

0

Udało mi się z znalezieniem ostatniego kierunku, ale nie mogę wykombinować, co trzeba zrobić, aby nie obslugiwał strzałek... Jest na to jakaś procedura?

0

Po prostu do sprita dodaj pola CanMoveX typu boolean i ustaw je na false. Przy obsłudze klawiszy sprawdzaj (czy_wcisniety_klawisz && CanMoveX) gdzie X to np. Left.

0

*Do gracza nie sprita

0
procedure TGracz.DoCollision(Sprite: TSprite; var Done: Boolean);
 var a2,b2:smallint;
begin
  If (Sprite is TKlocek) then
    begin
      for a2:=1 to 16 do
      for b2:=1 to 10 do
      begin
      if mapa[a2,b2]=true then
      begin
        If (Klocek[a2,b2].x+x1<>Gracz.X) then
          begin
            CanMoveX:=true;
          end;
        If (Klocek[a2,b2].x<>Gracz.X+x1) then
          begin
            CanMoveX:=true;
          end;
        If (Klocek[a2,b2].y+y1<>Gracz.Y) then
          begin
            CanMoveY:=true;
          end;
        If (Klocek[a2,b2].y<>Gracz.Y+y1) then
          begin
            CanMoveY:=true;
          end;
      end;
    end;
    end;
end;

procedure TGracz.DoMove(MoveCount: Integer);
begin
  Form1.DXInput1.Update;

  If (isLeft in Form1.DXInput1.States) and(Gracz.X>=x1+x1) and (CanMoveX)
  then
      begin
      X:= X-x1;
      Collision;
      end;
  If (isRight in Form1.DXInput1.States) and
  (Gracz.X<=Form1.Width-Gracz.Width-x1-x1) and (CanMoveX)
  then
      begin
      x:= X+x1;
      Collision;
      end;
  If (isUp in
  Form1.DXInput1.States) and (Gracz.Y>=y1+y1) 
  and (CanMoveY) then
      begin
      Y:= Y-y1;
      Collision;
      end;
  If (isDown in Form1.DXInput1.States) and
  (Gracz.Y<=Form1.Height-Gracz.Height-y1-y1)  and (CanMoveY)
  then
      begin
      Y:= Y+y1
      Collision;
      end;
end; 

Z tym kodem gostek mi się zupełnie nie rusza :) Jakby co CanMoveX i CanMoveY w graczu jest na false... Czy błąd może tkwić w pętli użytej w DoCollision czy w sprawdzaniu kolizji w DoMove ? I jeszcze jedno, ostatnie pytanko... czy w przypadku kolizji te dwa sprite mogą być wyświetlane przez jednego DxSpriteEngine czy przez dwa tego typu obiekty ?

0

Ojejku, mam nadzieję że uda rozwiązać ci sie ten problem!

0

Będąc u skraju wytrzymałości, jednak proszę o specjalistyczną pomoc w rozwiązaniu tego problemu ;)

0

Przez to X mialem na mysli bys zrobil 4 różne zmienne LEFT RIGHT UP DOWN odpowiednio dla kazdego ruchu. Tak to blokujac ruch w lewo blokujesz tez w prawo

0

Ogolnie to przed sprawdzeniem kolizji ustaw wszystkie na true, a potem jak jakas kolizje wykryjesz przestawiaj na false. No co w tym trudnego. Nie dam gotowca bo nie ogarniam jezykow "pascalopodobnych"

0
(Gracz.X>=x1+x1)

co to to x1 ?

0

x1 to szerokość klocka uzależniona od rozdzielczości ekranu... y1 to wysokość.

1

Ok z tego co mi się wydaje to ty poruszasz sie na kaflach;
Wiec w sumie to wystarczy zrobic cos takiego: jak masz pozycje gracza na planszy w postaci gracz.x + gracz.y;
to sprawdzasz czy gracz.x - jesli nie jest na intach to zaokraglasz w dol i robisz tak:

 
 if ( Wdol(gracz.x) >= 2 && map[Wdol(gracz.y), Wdol(gracz.x) - 1] == false ) CanMoveLeft = false;
//itd.

Jak masz jeszcze inaczej to zrobione no to przykro mi :P

1

wydaje mi się, że coś przekombinowałeś w tym projekcie. Masz gotowca, przerabiaj do woli:
Ludek.rar

nie ważne, czy ten gracz ma iść powoli czy szybko czy skakać czy spadać, zapisuj sobie gdzie aktualnie się znajduje lub z którego pola na które się porusza to będziesz miał ułatwione życie.

0

Dziękuje bardzo wam obydwu za pomoc... Spróbuje wykorzystać obie "paczki wiedzy" do poprawy mojej pracy :)

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