Skocz do zawartości

Problem


kapcior7

Rekomendowane odpowiedzi

witam ...Mam problem z kolizją w języku C ...

 

Otuż mam bohatera o rozmiarach 16x16 i wall też 16x16...

 

ruch bohatera mam zrobiony itp...ALe gdy chcialem dodac aby sie zatrzymywal na

przed wallem zaczeły sie schody .. Tzn.. zatrzymywal sie tylko na ramce.. a na reszcie np.w srodku romu byl klocek juz nie chcial ;/ oto kod

 

GML
const iwall=109;

 

wall[0..109][1]=16;//xmurku np.16

wall[0..109][2]=16;//ymurku np.16

player1_x=96;//xgracza

player2_y=32;//ygracza</span>

 

 

ps.oczywiscie tych kropek nie ma tylko wspolrzedne mam wpisane recznie ale nie widze sensu dawac te 109 tablic.;/

 

noi kod na kolizje mam taki:

GML
if ((pad & PAD_LEFT) > 0)

{

for(i=1; i!=iwall; i++)

if ( (player1_x>=wall[1]+20) && (player1_y>=wall[2]+18) )

ilosc_blokow++;

 

if (ilosc_blokow>0)

{

player1_x -= 2;

ilosc_blokow=0;

}

 

}

 

 

 

if ((pad & PAD_RIGHT) > 0)

{

for(i=1; i!=iwall; i++)

if ( (player1_x<=wall[1]-18) && (player1_y>=wall[2]+18) )

ilosc_blokow++;

 

if (ilosc_blokow>0)

{

player1_x += 2;

ilosc_blokow=0;

}

}

 

if ((pad & PAD_UP) > 0)

{

for(i=1; i!=iwall; i++)

if ( (player1_x>=wall[1]+16) && (player1_y>=wall[2]+20) )

ilosc_blokow++;

 

if (ilosc_blokow>0)

{

player1_y -= 2;

ilosc_blokow=0;

}

}

 

if ((pad & PAD_DOWN) > 0)

{

for(i=1; i!=iwall; i++)

if ( (player1_x>=wall[1]+18) && (player1_y<=wall[2]-18) )

ilosc_blokow++;

 

if (ilosc_blokow>0)

{

player1_y += 2;

ilosc_blokow=0;

}

}

 

ilosc_blokow-zmienna pomocznica bo inaczej w petli sie gracz przesowa

pad-odczyt pada_1

 

 

i PAD_UP ,PAD_DOWN,PAD_LEFT,PAD_RIGHT to wiadome chyba... Noi ta kolizja tylko na ramce dziala dlaczego??;/

Odnośnik do komentarza
Udostępnij na innych stronach

na

przed wallem zaczeły sie schody"

 

To na czy przed?

 

ps.oczywiscie tych kropek nie ma tylko wspolrzedne mam wpisane recznie ale nie widze sensu dawac te 109 tablic.;/

0.0

 

 

Nie chcę mi się rozszyfrowywać tego makaronu. Napisz po ludzku o co chodzi(bez próbek kodu), wtedy będzie można coś poradzić.

Odnośnik do komentarza
Udostępnij na innych stronach

No wiec Chodzi o To ze Pisze Gre w C Na PSX'a taką prostą.

 

W ktorej sie bedzie chodzic i strzelac na 2 graczy.

 

65314419071805910476.jpg

 

To niebieskie to Gracz a zielone klocki to Murek i wlasnie jak zrobic kolizje

 

gdy ide w lewo i blok jest x-2 to Gracz ma sie zatrzymac przed scianą ... ;/

 

noi wiem ze kolizje trzeba w pętli zrobic bo Sciana jest tak zrobiona

wall[nr_sciany][1]=x;

wall[nr_sciany][2]=y;

 

 

tylko jak ... Wszystkie Sprity są 16x16 a ich orginy 0x0 ...

Odnośnik do komentarza
Udostępnij na innych stronach

Najlepiej będzie kiedy sam wymyślisz rozwiązanie bo nie jest to skomplikowana sprawa.

 

Support: Pomyśl kiedy następuje kolizja między dwoma kwadratami? Wtedy kiedy jeden z jego "rogów" znajduje się w drugim(nachodzi na niego). Czyli rozważ na początku kolizje kwadrat vs punkt. Kiedy to rozwiążesz zauważ, że kwadrat definiowany jest przez 4 różne punkty, mając algorytm kwadrat vs punkt łatwo przekształcisz go na wersje kwadrat vs kwadrat.

 

Co do kolizji kwadrat vs punkt. Rozrysuj to sobie w układzie współrzędnym jak w szkole i przyjrzyj się osią x i y. Łatwo zauważysz jakie warunki musi spełniać punkt aby uznać jego kolizje z kwadratem jako: True.

 

Ten kod co masz usuń i napisz od zera. Mapę definiuj nie z ręki tylko z pętli. Zauważ, że jedyne co musisz podać to ściany blokujące na środku planszy, reszta bez ręcznego wypełniania. Np:

addWall(int posX,posY, int kier, int dlugosc);

pozycja początku ściany, kierunek w jakim się rozciąga i jej długość. Ułatwiaj sobie życie.

 

EDIT:

 

Ewentualnie jeśli chcesz pozostać przy poruszaniu kwadratowym, że tak to ujmę możesz po prostu sprawdzać index w tablicy czyli:

 

gracz daje lewy przycisk>> czy coś jest po lewej stronie w tablicy? ->

 

tak: nie pozwalamy tam iść

nie: obieramy nowy kierunek i poruszamy graczem.

 

Zasada bardzo prosta ale trzeba pamiętać aby nie pozwolić ustalić nowego kierunku ruchu dopóki gracz nie dotrze do kolejnej "kratki".

 

Można trzymać obecny stan gracza jako moving=true/false. Jeśli gracz jest już w drodze do kolejnej kratki zapisujemy tylko jeśli gracz wciśnie nowy kierunek ruchu w jakiejś zmiennej i używamy jej do kolejnego ruchu dopiero jak gracz dojdzie do docelowej kratki. W takim rozwiązaniu kolizja opiera się tylko na sprawdzaniu położenia obiektu w tablicy. Ten system działa oczywiście tylko jeśli gracz może chodzi jedynie po wyznaczonych kratkach jak wieża w szachach.

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi o to ze wiem jak sprawdzic kolizje bo patrz mam sobie 2 kwadraty jeden to obj_player drugi to obj_wall i patrz

 

if ( (obj_player_x>=obj_wall_x-2) && (obj_player_x<=obj_wall_x+18) && (obj_player_y>=obj_wall_y-2) && (obj_player_y<=obj_wall_y+18) )

{

//to jest kod na kolizje patrz mam obj_wall i zamiast jednego punktu

 

//jest kwadrat 20x20 czyli punkt obj_player ma kolizje z kwadratem i to dziala w 100%

 

//pokombinuje jeszce cos moze cos sie uda jak nie to nie wiem...

 

}

 

A tym ze sobie utrudniam zycie to bym sie kolocil bo napisalem sobie edytor poziomow w GM i on tworzy mi liste klockow do pliku potem kopjuje i wklejam i smiga ;p

 

denerwuje mnie to powoli troche...Bo niby kolizje mam i naokolo ekranu dziala wszystko(taka ramka zebym nie mogl wyjsc poza room) a klocki ktore są w roomie tak jagby je omijało jakies glupie to... ;/ A jesli chodzi o uklad wspolrzednych itp to ja to umiem i wiem jak sie wykrywa kolizje ...tylko wlasnie powalone to jest... ;/

Odnośnik do komentarza
Udostępnij na innych stronach

Kod to kod. Jak się go napisze jak należy do działa a jak nie.. no cóż.

 

Nie wnikam w twój kod, podałem Ci dwa rozwiązania, które zadziałają na 100% w zależności od wybranego sposobu poruszania. Można znaleźć z tuzin podobnych pomysłów, ważne aby działało. Jak chcesz męczyć to co masz, użyj debuggera i znajdź "problem".

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...