Xender Opublikowano 21 Października 2013 Udostępnij Opublikowano 21 Października 2013 Tworzę platformową grę, na razie jestem na etapie dodawania animacji, osobno dla biegu, stania i spadania. Kolizja i poruszanie działa bez błędnie. Oto kod: Jest to kod dla postaci gracza dla eventu Create: GML vsp = 0; //vertical speed initialization hsp = 0; //horizontal speed initalization grounded = 0; //1 - object touch ground, 0 - not touching grav = 0.5; Natomiast to dla eventu Step: GML Key_W = keyboard_check_direct(ord("W")); Key_S = keyboard_check_direct(ord("S")); Key_A = keyboard_check_direct(ord("A")); Key_D = keyboard_check_direct(ord("D")); //Move left and right if(Key_A) { hsp = -4; image_xscale = -1; } if(Key_D) { hsp = 4; image_xscale = 1; } if((Key_A && Key_D) or (!Key_A && !Key_D)) { hsp = 0; anim = 0; } //Jumping if(Key_W) { if(grounded) { vsp = -12; grounded = 0; } } vsp += grav; //Vertical Collision if (place_meeting(x, y + vsp, par_wall) and vsp > 0) { while (!place_meeting(x, y+1, par_wall)) y += 1; vsp = 0 grounded = 1; } //Ceiling Collision if (place_meeting(x, y + vsp, par_wall) and vsp < 0) { while(!place_meeting(x, y-1, par_wall)) y -= 1; vsp =0 } //Horizontal Collision if (place_meeting(x + hsp, y, par_wall)) { while (!place_meeting(x + sign(hsp), y, par_wall)) x += sign(hsp); hsp = 0; } //Commit to movement x += hsp; y += vsp; //Animation if(grounded) { if (hsp != 0) { sprite_index = run; } else { sprite_index = stand; } } else { if (vsp < 0) { sprite_index = jump; } else { sprite_index = fall; } } Wszystkie sprite'y zmieniają się poprawnie poza sytuacją gdy swobodnie spadam bez wcześniejszego podskoczenia. Na przykład: gdy podejdę do krawędzi i nie wykonując skoku po prostu z niej spadnę. Dzieje się tak ponieważ zmienna grounded (określa czy znajduję się na ziemi czy nie) nie przestawia się na 0 (czyli jestem w powietrzu) przez co nie wchodzi do bloku który zmienia animacje na jump lub fall. Niestety gdy blok odpowiedzialny za zmianę jump i fall zrobię jako niezależny od grounded, to podczas lądowania na ziemi animacja zmienia się kilka razy między animacją stand i fall przez co postać wygląda jak by się telepała. Jak to rozwiązać? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 21 Października 2013 Udostępnij Opublikowano 21 Października 2013 nieczytalem teraz dokladnie, dlatego napisze tylko tak bylejak, wiec moze byc blad sproboj do vertical colision dodac ustawienia zmiennej grounded na 0 GML //Vertical Collision if (place_meeting(x, y + vsp, par_wall) and vsp > 0) { while (!place_meeting(x, y+1, par_wall)) y += 1; vsp = 0 grounded = 1; } else {grounded = 0; }; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Xender Opublikowano 22 Października 2013 Autor Udostępnij Opublikowano 22 Października 2013 Sprawdzałem już tą opcję niestety nic to nie dało. Zasadniczo w takiej sytuacji w momencie gdy postać jest kilka pxieli nad gruntem to sprite zmienia się kilkukrotnie między staniem w miejscu a opdaniem. Jak wywalam to else grounded = 0; to wszystko działa poprawnie, z tym że w sytuacji gdy swobodnie opadam to niestety nie ma animacji opadania, tylko gdy wcześniej skoczę. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 22 Października 2013 Udostępnij Opublikowano 22 Października 2013 w GML //Jumping if(Key_W) { if(grounded) { vsp = -12; grounded = 0; } } vsp += grav; wywal GML grounded = 0; a w GML //Vertical Collision if (place_meeting(x, y + vsp, par_wall) and vsp > 0) { while (!place_meeting(x, y+1, par_wall)) y += 1; vsp = 0 grounded = 1; } usun GML grounded = 1 Na poczatku kodu(zaraz pod przypisaniem klawiszy) daj GML if place_meeting(x, y+1, par_wall) then grounded = 1; else grounded = 0; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Xender Opublikowano 22 Października 2013 Autor Udostępnij Opublikowano 22 Października 2013 Działa, dzięki :D mam jeszcze jedno pytanie co do spriteów, czy różne sprite'y ruchu dla jednego obiektu muszą mieć ten sam rozmiar czy mogą być różne? Problem jest taki że gdy mam sprite od stania w miejscu i biegania to gdy uaktywnia się stanie to postać się blokuje. Jak poprawnie ustawić Origin żeby nie było z tym problemu? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Maximal Opublikowano 22 Października 2013 Udostępnij Opublikowano 22 Października 2013 Mogą być różne. Wystarczy ustawić origin blokującego się sprite'a odpowiednio niżej. Ile niżej to już zależy od Twoich grafik. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Xender Opublikowano 22 Października 2013 Autor Udostępnij Opublikowano 22 Października 2013 Problem w tym że nie mogę odpowiednio ustawić origin, jak dam za wysoko to się blokuję, jak za nisko to przełącza mi cały czas sprite. Może powinienem włączyć te opcje precyzyjnej kolizji? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Maximal Opublikowano 22 Października 2013 Udostępnij Opublikowano 22 Października 2013 Jeżeli teraz nie korzystasz z "Precise collision checking" to zobacz jak są poustawiane maski kolizji (Bounding Box) i ew. pobaw się nimi. Ciężko stwierdzić co tu dokładnie stanowi problem, ale rozwiązanie to kwestia poeksperymentowania z tymi ustawieniami. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 23 Października 2013 Udostępnij Opublikowano 23 Października 2013 Ustal jakich wymiarów ma być bounding box i we wszystkich spritach ustaw na manual i zrób tych samych wymiarów ( typ box, NIE PRECISE ) Jeżeli sprite'y są różnych wymiarów ustaw wszędzie origin w tym samym punkcie na postaci, np. na środku twarzy lub między stopami pod kroczem(jakkolwiek to brzmi to krocze zawsze będzie na środkowej szerokości postaci więc jest dobrym punktem odniesienia dla pozycji X) 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ę