ZyperPL Opublikowano 17 Maja 2011 Udostępnij Opublikowano 17 Maja 2011 Witam, ten temat wiąże się trochę z moim poprzednim. Mam problem znowu z kolizją. GML // zapisanie informacji o kącie zderzenia var dir; dir = point_direction(x, y, other.x, other.y); // podział na poszczególne reakcje if ((dir >= 45 && dir <= 135) || (dir >= 225 && dir <= 315)) y += abs(vspeed)*sin(degtorad(dir)); if ((dir >= 135 && dir <= 225) || (dir >= 315 || dir <= 45)) x -= abs(hspeed)*cos(degtorad(dir)); Użyłem tego kodu Rudego. Ale nie działa on jak powinien. Próbowałem zmieniać go na różne sposoby, jedne bardziej pomagały, drugie nie. Kod działa przez chwilę, a następnie postać przesuwa się do przodu o jeden pixel i się blokuje. Jakieś pomysły? Problem być może jest dlatego, że moja ściana, składa się z kilku bloków. Więc nie jest to jeden obiekt z którym postać koliduje, ale po koleji kilka. Proszę o pomoc ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 17 Maja 2011 Udostępnij Opublikowano 17 Maja 2011 GML y += abs(vspeed)*sin(degtorad(dir)); czy to nie to samo co y+=lengthdir_y(dir,vspeed) ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rudy Opublikowano 17 Maja 2011 Udostępnij Opublikowano 17 Maja 2011 GML y += abs(vspeed)*sin(degtorad(dir)); czy to nie to samo co y+=lengthdir_y(dir,vspeed) ? Nie do końca, dokładniej cos takiego: y -= lengthdir_y(dir,abs(vspeed)); znak minus, bo y się zmniejsza w górę. No i abs, bo tak do działania wejdą nam dwa minusy, a nam potrzebny tylko jeden (z sin, lub lengthdir). Co do tematu: Hmmm... najcudowniej by było dostać twój projekt. Wtedy wszystko byłoby jasno i wyraźnie pokazane. Na chwilę obecną mogę ci powiedzieć tak: - o ile te bloki nie nachodzą na siebie wszystko jest ok. - originy sprite'ów muszą być na środku i obiekt (a właściwie maska) powinien mieć kształt kwadratu. Jeśli originy nie masz na miejscu, a przestawianie to kupa roboty (np ze względu na gotową mapę) dodaj za other.x i other.y tyle pikseli (x i y) ile powinien mieć origin, wyjdzie na 0. (czyli ...x, y, other.x+16, other.y+16...) Jeśli maska nie ma kształtu kwadratu (np z powodu zaokrąglonych rogów sprite'a) trzeba ją ustawić: - jeśli ogólnie ściana ma kształt kwadratu (dokładniej, Bounding Box tworzy kwadrat), usuń ticka z Precise Collision Checking w opcjach sprite'a ściany - jeśli ściana ma kształt prostokąta: umieść tutaj wygląd tej ściany, zmieni sie wtedy kąty sprawdzania kierunku. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZyperPL Opublikowano 18 Maja 2011 Autor Udostępnij Opublikowano 18 Maja 2011 Robiąc projekt dla Ciebie, pobawiłem się trochę i odznaczyłem solid w blocku. Teraz jest trochę inaczej. Ale i tak źle, wysyłam link: http://www.speedyshare.com/files/28525718/warkolizja.gmk Proszę o pomoc ;P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rudy Opublikowano 18 Maja 2011 Udostępnij Opublikowano 18 Maja 2011 Poprawiona wersja Pozwoliłem sobie na parę większych zmian, wszystkie są opisane. Przejrzyj, zanalizuj, zrozum, działaj ;) . Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZyperPL Opublikowano 19 Maja 2011 Autor Udostępnij Opublikowano 19 Maja 2011 Wielkie dzięki, tylko nie umiem za bardzo naprawić tego wchodzenia na chama w ścianę. Niby mnożę razy 1.05, ale postać może wejść przez róg ściany do środka. Jak zrobić, że gdy np. jest w rogu to się po prostu zatrzymuje? (x=xprevious itd.) Ps. Viewa nie ma w roomie, bo usunąłem kontrolera z przykładu i ogóle wszystko wyciąłem :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Fronia1996 Opublikowano 19 Maja 2011 Udostępnij Opublikowano 19 Maja 2011 to zamykaj :lol2: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rudy Opublikowano 19 Maja 2011 Udostępnij Opublikowano 19 Maja 2011 Temat chyba nie skończony... w każdym razie nie dla mnie :D Przebudowałem trochę kod, teraz działa na innej zasadzie, ale działa prawie idealnie, sprawdź: Przebudowana wersja Stara wersja niestety nie pozwalała na naprawę tych przeskoków. Może lepiej, teraz masz lepszy kod :) . Koniecznie przeczytaj komentarze, jak twoja gra wygląda inaczej. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZyperPL Opublikowano 19 Maja 2011 Autor Udostępnij Opublikowano 19 Maja 2011 Wielkie dzięki! Brak mi słów, wszystko działa perfekcyjnie. To się do przykładów nadaje, brawo. Jeśli gra powstanie to oczywiście masz creditsy (choć nie wiem czy to nie wstyd mieć credisty w takiej grze) :D Trochę obawiam się tego while, ale jakby co to zmienię na if i jakoś pokombinuję. Wielkie dzięki Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi