Piedro Opublikowano 10 Września 2009 Udostępnij Opublikowano 10 Września 2009 Witam. mam problem z grawitacją w moim remake NSMB (New Super Mario Bros.). Od jakiegoś czasu przestała mi się podobać grawitacja "domyślna" typu GML if place_free(x,y+1) {gravity = 1} else {gravity = 0} Czy dało by radę zrobić tak aby wartość grawitacji była stała? Za pomoc wielkie DZIĘKI :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 10 Września 2009 Udostępnij Opublikowano 10 Września 2009 W tym wypadku wartość grawitacji jest stała. :| Chodzi ci chyba o prędkość spadania (to co innego jest). Zamiast gravity użyj zmiennej vspeed. ED: Tylko kod nie rób tan sam. Musiz to zrobić w trochę inny sposób Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Piedro Opublikowano 10 Września 2009 Autor Udostępnij Opublikowano 10 Września 2009 W tym wypadku wartość grawitacji jest stała. :| Chodzi ci chyba o prędkość spadania (to co innego jest). Zamiast gravity użyj zmiennej vspeed. ED: Tylko kod nie rób tan sam. Musiz to zrobić w trochę inny sposób O to mi chodziło ZeroXbot. Tylko ja sam próbowałem coś takiego zrobić już parę dni temu ale mi nie idzie <_< Proszę o jakąkolwiek pomoc. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 10 Września 2009 Udostępnij Opublikowano 10 Września 2009 Robisz np. tak: GML //create maxvs=2; //maksymalna predkość spadania //step if (place_free(x,y+1)) { if(vspeed<maxvs) vspeed+=0.25; } else {vspeed = 0} Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Platyna Opublikowano 10 Września 2009 Udostępnij Opublikowano 10 Września 2009 Jeśli on chciał zrobić ogranicznik prędkości tylko do jakiegoś maxa to można to było inaczej. Zostawiając te grawitację itp. Ale on chce chyba by zawsze z tą samą prędkością spadał. GML if place_free(x,y+1) {vspeed= 10} else {vspeed= 0} Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 10 Września 2009 Udostępnij Opublikowano 10 Września 2009 heh, tylko widzisz, jeżeli spełni warunek place free to mu ustawi vspeed na 10, czyli jeśli podskoczy, to w następnym stepie już spełni warunek i zrzuci go na ziemię ;/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 10 Września 2009 Udostępnij Opublikowano 10 Września 2009 Dajesz sobie jakiś kodzik typu: GML vspd += grav; hspd = min(maxhspd, max(hspd, minhspd)); vspd = min(maxvspd, max(vspd, minvspd)); if(vspd > 0) { vspd_round += vspd-floor(vspd); if(vspd_round >= 1) { repeat(floor(vspd)+1) { if(place_free(x, y+1)){ y += 1; }else{ vspd = 0; } } vspd_round -= 1; } else { repeat(floor(vspd)) { if(place_free(x, y+1)){ y += 1; }else{ vspd = 0; } } } } else if(vspd < 0) { vspd_round += abs(vspd)-floor(abs(vspd)); if(vspd_round >= 1) { repeat(floor(abs(vspd))+1) { if(place_free(x, y-1)){ y -= 1; }else{ vspd = 0; } } vspd_round -= 1; } else { repeat(floor(abs(vspd))) { if(place_free(x, y-1)){ y -= 1; }else{ vspd = 0; } } } } if(hspd > 0) { hspd_round += hspd-floor(hspd); if(hspd_round >= 1) { repeat(floor(hspd)+1) { if(place_free(x+1, y)){ x += 1; }else{ hspd = 0; } } hspd_round -= 1; } else { repeat(floor(hspd)) { if(place_free(x+1, y)){ x += 1; }else{ hspd = 0; } } } } else if(hspd < 0) { hspd_round += abs(hspd)-floor(abs(hspd)); if(hspd_round >= 1) { repeat(floor(abs(hspd))+1) { if(place_free(x-1, y)){ x -= 1; }else{ hspd = 0; } } hspd_round -= 1; } else { repeat(floor(abs(hspd))) { if(place_free(x-1, y)){ x -= 1; }else{ hspd = 0; } } } } W Create zadeklaruj odpowiednie zmienne. Ogólny bajerek jest taki, że te jeśli sobie ustawisz np. hspd (odpowiednik hspeed) na 100, to postać zatrzyma się i tak co do piksela na przeszkodzie. Inaczej mówiąc - nawet, jeśli postać cały czas będzie miała np. vspd równy 10, to i tak zatrzyma się na "podłodze". No. Zrobienie ruchu platformowego na tym to aż ustawienie grav, i manipulacja hspd/vspd, dla poruszania się i skoków. PS: Wiem, że kod zarypiście niezoptymalizowany i długi - mam go na kompie od chyba 2 lat, ale jakoś nie chce mi się go poprawiać... xd Ed: Jakbyś się nie skapnął - to na końcu Stepa albo w End Stepie, jak Ci bardziej pasuje. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Platyna Opublikowano 10 Września 2009 Udostępnij Opublikowano 10 Września 2009 heh, tylko widzisz, jeżeli spełni warunek place free to mu ustawi vspeed na 10, czyli jeśli podskoczy, to w następnym stepie już spełni warunek i zrzuci go na ziemię ;/ Ach przepraszam. Wiedziałem, że coś będzie be, ale jakoś już dzisiaj mi się nie chciało myśleć. Po odrabianiu prac domowych Mimka :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Piedro Opublikowano 12 Września 2009 Autor Udostępnij Opublikowano 12 Września 2009 Próbowałem kod Dawiddsa, ale mi nie wyszedł. Jaki zmienne mam zadeklarować w CREATE?? :confused: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marek.S Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 vspd = 0 vspd_round = 0 hspd = 0 hspd_round = 0 podziałało? :) E: Chyba jeszcze grav maxhspd minhspd maxvspd minvspd ale to już ty ustal wartości :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Assassin Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 floor(vspd)+1 A nie można po prostu użyć ceil(vspd) -__- ? Lol. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 Sorry, że tak trochę mało na temat, ale: UP: PS: Wiem, że kod zarypiście niezoptymalizowany i długi - mam go na kompie od chyba 2 lat, ale jakoś nie chce mi się go poprawiać... xd Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 O LOL. Nie mam pojęcia co mną kierowało podczas pisania tego kodu :> Musiałem nie wiedzieć o istnieniu funkcji ceil, czy coś... xd W każdym razie, to musi działać (korzystam z tego w moim aktualnym projekcie) :P Ed: Eh. Napisałem ten post nie patrząc na sam kod... :x Tak MA być. floor(x)+1 != ceil(x) dla całkowitego x. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 W evencie Step napisz: GML var grav_max,grav_przys; grav_max = 5 //Maksymalna prędkość spadania grav_przys = 0.1 //Przyspieszenie spadania if(place_free(x,y+1)) { if(vspeed < grav_max) { vspeed += grav_przys } } else vspeed = 0 Proste i czytelne :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 Muczek, następnym razem przeczytaj temat, ja podałem prawie taki sam kod, a Dawidds cały ruch platformowy, więc nie rozumiem, dlaczego to napisałeś :| Pozatym po co za każdym razem deklarować zmienne, jak to mozna raz w create. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 Napisałem to dlatego, że Piedro jeszcze nie rozwiązał swojego problemu (przynajmniej nie napisał, że rozwiązał). Poza tym, w evencie Create zaśmieca pamięć, więc lepiej zrobić to jako "var" w Stepie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 Tak, a w twoim kodzie co step robi dwie zmienne, których wartości nie można zmienić w czasie gry, bo co step się resetują :| więc przynajmniej w tym wypadku twojego kodu bym nie używał. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Assassin Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 floor(x)+1 != ceil(x) dla całkowitego x. Rzeczywiście :P . Tutaj się pomyliłem :] . Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 A czy na Ziemi grawitacja się zmienia??? :) PS: Nie mogę wysłać do Ciebie prywatnej wiadomości, dlaczego? PS2: Zresztą... Już nieważne. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 12 Września 2009 Udostępnij Opublikowano 12 Września 2009 Gra to nie Ziemia, fizyka nie musi być realna i nie wiadomo co autor gry będzie chciał zrobić, np. zmniejszy grawitację gdy postać będzie w wodzie, żeby zrobić fałszywy efekt oporu (nie wiem czy dobrze napisałem, ale chyba każdy wie o co chodzi). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 13 Września 2009 Udostępnij Opublikowano 13 Września 2009 Poza tym, w evencie Create zaśmieca pamięć, więc lepiej zrobić to jako "var" w Stepie.Teraz to dowaliłeś... =| Pusty room, bez żadnego obiektu - 10,304K pamięci Room z obj_test, w którym w Create deklarujemy tablicę posiadającą 10 tysięcy elementów - 10,556K pamięci. 252K różnicy. A dodam, że chyba żaden idiota nie będzie deklarował tak dużej tablicy - my tu mówimy max 10 zmiennych, a nie 10 tysiącach. Ale niech będzie. 1 instancja obj_test w roomie, która ma w stepie kod: "var test; test = sin(sqrt(2))" - 10,324K To samo, ale zmienna test deklarowana w Create - 10,320K. Ten sam test dla 575 instancji obj_test w roomie: Deklarowane w Create - 10,324K W stepie jako tymczasowa - 10,348K Przynajmniej u mnie, jak nie wierzysz to sobie sprawdź. Zresztą, nawet jeśli dla Twojego sposobu wyjdzie mniej pamięci - czytelność kodu i tak jest ważniejsza. A poza tym - Twoje rozwiązanie jest napewno mniej wydajne (znaczy pod względem użycia procesora). Otóż po kija CO STEPA tworzyć zmienną tymczasową i nadawać jej nową wartość, jeśli można to zrobić RAZ :X ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Piedro Opublikowano 13 Września 2009 Autor Udostępnij Opublikowano 13 Września 2009 W evencie Step napisz: GML var grav_max,grav_przys; grav_max = 5 //Maksymalna prędkość spadania grav_przys = 0.1 //Przyspieszenie spadania if(place_free(x,y+1)) { if(vspeed < grav_max) { vspeed += grav_przys } } else vspeed = 0 Proste i czytelne :) Wstawiłem ten kod ale postać nie odrywa się od ziemi. Co zrobiłem źle? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 13 Września 2009 Udostępnij Opublikowano 13 Września 2009 Pewnie wstawiłeś ten kod po kodzie na skakanie i dlatego przestawia Ci vspeed na 0 bo jesczcze się nie oderwał, a warunek place_free sprawdził. Pozatym pisaliśmy, że jego kod nie jest zbyt optymalny, więc wykorzystaj ten Dawiddsa, w ostateczności mój. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 13 Września 2009 Udostępnij Opublikowano 13 Września 2009 http://eportal.boo.pl/upload/file.php?id=platform.gmk Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Assassin Opublikowano 13 Września 2009 Udostępnij Opublikowano 13 Września 2009 Mam za starą wersję GM'a na to :( . Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Jaklub Opublikowano 13 Września 2009 Udostępnij Opublikowano 13 Września 2009 mówisz, że 5.0 jest staroć, a sam GM7 nie używasz? wstydź siee!!!!!!1111jedenjeden użyj LateralGM do konwersji na gm6. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Assassin Opublikowano 13 Września 2009 Udostępnij Opublikowano 13 Września 2009 Nie chce mi się xD . Mam 6.1 :D , ale lepiej nie mówić na temat "POSIADANIA" GM'a ;) . Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 13 Września 2009 Udostępnij Opublikowano 13 Września 2009 ... GML if (vspeed>10) { vspeed=10; } :| ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 14 Września 2009 Udostępnij Opublikowano 14 Września 2009 if (vspeed>10) { vspeed=10; } Nie no nie mogłem się powstrzymać... :| A jak już to vspeed=min(vspeed, 10). Co do tamtego ruchu: GML //Create vspd = 0; hspd = 0; vspd_round = 0; hspd_round = 0; grav = 0.16; minhspd = -5; maxhspd = 5; minvspd = -6; maxvspd = 6; //Step - Motion if(!place_free(x, y+1)) //Jesli stoje na ziemii { if(keyboard_check(vk_up)) //Skok { vspd = -5.68; } if(keyboard_check(vk_left)) //Ruch na ziemii { hspd -= 0.5; } if(keyboard_check(vk_right)) { hspd += 0.5; } if(!keyboard_check(vk_left) && !keyboard_check(vk_right)) //Jesli nie wciskam zadnego klawisza { if(hspd>0) //...to zwalniam { hspd-=0.5; if(hspd<0){ hspd=0; } } if(hspd<0) { hspd+=0.5; if(hspd>0){ hspd=0; } } } } else //Jesli jestem w powietrzu { if(keyboard_check(vk_left)) //Ruch w powietrzu { hspd -= 0.2; } if(keyboard_check(vk_right)) { hspd += 0.2; } if(!keyboard_check(vk_left) && !keyboard_check(vk_right)) //Tu tez "zwalniam" { if(hspd>0) { hspd-=0.1; if(hspd<0){ hspd=0; } } if(hspd<0) { hspd+=0.1; if(hspd>0){ hspd=0; } } } } //Step - Physics vspd += grav; hspd = min(maxhspd, max(hspd, minhspd)); vspd = min(maxvspd, max(vspd, minvspd)); if(vspd > 0) { vspd_round += vspd-floor(vspd); if(vspd_round >= 1) { repeat(floor(vspd)+1) { if(place_free(x, y+1)){ y += 1; }else{ vspd = 0; } } vspd_round -= 1; } else { repeat(floor(vspd)) { if(place_free(x, y+1)){ y += 1; }else{ vspd = 0; } } } } else if(vspd < 0) { vspd_round += abs(vspd)-floor(abs(vspd)); if(vspd_round >= 1) { repeat(floor(abs(vspd))+1) { if(place_free(x, y-1)){ y -= 1; }else{ vspd = 0; } } vspd_round -= 1; } else { repeat(floor(abs(vspd))) { if(place_free(x, y-1)){ y -= 1; }else{ vspd = 0; } } } } if(hspd > 0) { hspd_round += hspd-floor(hspd); if(hspd_round >= 1) { repeat(floor(hspd)+1) { if(place_free(x+1, y)){ x += 1; }else{ hspd = 0; } } hspd_round -= 1; } else { repeat(floor(hspd)) { if(place_free(x+1, y)){ x += 1; }else{ hspd = 0; } } } } else if(hspd < 0) { hspd_round += abs(hspd)-floor(abs(hspd)); if(hspd_round >= 1) { repeat(floor(abs(hspd))+1) { if(place_free(x-1, y)){ x -= 1; }else{ hspd = 0; } } hspd_round -= 1; } else { repeat(floor(abs(hspd))) { if(place_free(x-1, y)){ x -= 1; }else{ hspd = 0; } } } } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Assassin Opublikowano 14 Września 2009 Udostępnij Opublikowano 14 Września 2009 A co z ruchem pod różnym kątem - na ukos, górki itp. ? :) Chociaż to trochę nie na temat... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi