kapcior7 Opublikowano 20 Maja 2012 Udostępnij Opublikowano 20 Maja 2012 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 Więcej opcji udostępniania...
Will Opublikowano 20 Maja 2012 Udostępnij Opublikowano 20 Maja 2012 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 Więcej opcji udostępniania...
kapcior7 Opublikowano 20 Maja 2012 Autor Udostępnij Opublikowano 20 Maja 2012 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. 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 Więcej opcji udostępniania...
Will Opublikowano 20 Maja 2012 Udostępnij Opublikowano 20 Maja 2012 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 Więcej opcji udostępniania...
kapcior7 Opublikowano 20 Maja 2012 Autor Udostępnij Opublikowano 20 Maja 2012 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 Więcej opcji udostępniania...
Will Opublikowano 20 Maja 2012 Udostępnij Opublikowano 20 Maja 2012 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę