Skocz do zawartości

Pierwsze banalne pytania


SockPuppet

Rekomendowane odpowiedzi

Dzień dobry. Jestem zupełnie świeżą i zieloną osobą, ale od jakiegoś czasu próbowałam się zabrać za zrobienie gierki z użyciem tego cudownego programu, konkretnie platformówki. Mniej-więcej obczaiłam już, jak zrobić ludzika i platformy, po których będzie skakał. Jak na razie jest cudownie, jednakowoż jeden problem nie daje się rozwiązać. Mianowicie, ludzik potrafi skakać, ale no właśnie. Może też ponawiać skoki, będąc w powietrzu, a tak chyba nie powinno być. To znaczy, nauczyłam go już, żeby spadał, a nawet żeby lądował, ale uważam, że powinien móc skakać tylko będąc akurat na ziemi, inaczej trochę mija się z celem. Na pewno jest jakiś dający się ogarnąć sposób, by uniemożliwić mu tą osobliwą lewitację. 2 Inny problem polega na tym, że ludzik, zamiast lądować idealnie na platformie, to ląduje gdzieś "wewnątrz" platformy, a nawet uwiesza się gdzieś na dole. No i jeszcze 3 - potrafi przeskoczyć platformę od dołu, a uważam, że powinien się jednak zderzyć z nią łebkiem. Jeśli ktoś w prosty, łopatologiczny sposób mógł pomóc mi z tymi bolączkami będę dozgonnie wdzięczna.

Odnośnik do komentarza
Udostępnij na innych stronach

No właśnie nie wiem, jak sprawdzić, czy jest podłoga. Proszę o wybaczenie, ale jestem momentami trochę nieogarnięta jeśli chodzi o takie niektóre rzeczy. Rozumiem, że jeśli pod spodem nie będzie podłogi, to mam mu kazać nie skakać. Czyli zrobić takie dwie opcje.

 

Tak, wszystkie platformy i podłoga są solidne.

Odnośnik do komentarza
Udostępnij na innych stronach

Blokowanie skoku w powietrzu jest najłatwiejszym z twoich problemów. Skoro podłoga jest solid to aby sprawdzić czy postać stoi na niej musisz wykonać prosty test. Czy jak przesunę postać o 1px w dół to będzie kolizja? Wystarczy do tego sprawdzenie tego place_free(x, y+1).

 

Natomiast twoje problemy z kolizją mogą być rozwiązane na kilka sposobów. Pierwszy sposób który od razu zadziała to po wykryciu że postać jest wewnątrz podłogi musisz ją z tamtąd wyjąć. Funkcja move_outside_solid() to rozwiąże. Niestety ten sposób może czasem powodować poważne błędy (zależy od designu mapy).

Drugi sposób to wykrywanie czy za chwilę (następny step) dojdzie do kolizji i zmianie ruchu w taki sposób aby do niej nie doszło. Ten sposób będzie częściej działać. Pewnie gdzieś masz kod od grawitacji wyglądający tak:

GML
if(place_free(x,y+1))

{

gravity=0.1

}

else

{

gravity=0

}

Musisz go zmienić w coś takiego:

GML
if(place_free(x,y+1))

{

gravity=0.1

}

else

{

gravity=0

move_contact_solid(270,0)

}

 

Sposób ten działa na zasadzie nie pozwolenia postaci na wskoczenie "wewnątrz" podłogi, a zamiast tego przesuwa ją jak najbliżej.

Odnośnik do komentarza
Udostępnij na innych stronach

No tak. Problem z wskakiwaniem wewnątrz podłogi już rozwiązany (bardzo dziękuję) natomiast skakanie jak na razie mnie przerasta. Rozumiem, że mam wpisać kod if(place_free(x,y+1))...a potem co? I czy ten kod ma być wpisany w evencie skakania? No i jeszcze jest coś - kiedy w trakcie chodzenia w lewo czy w prawo każę mu skoczyć, to chciałabym, żeby skakał po skosie, tak jakby wypadkową kierunku biegu i skakania, a skacze mi wtedy idealnie do góry. A poza tym robi coraz dziwniejsze rzeczy. Znika, nagle z niczego przeskakuje przez podłogę jak za długo na niej postoi, zatrzymuje się w powietrzu...

Odnośnik do komentarza
Udostępnij na innych stronach

Mam to wpisać przed poleceniem skoku? Bo jak na razie problem pozostaje nie do ruszenia. Chyba jestem na tyle durna, że potrzebuję tłumaczenia niektórych rzeczy krok po kroku.

 

A co gorsza, mój ludzik podejrzanie "klei się" do boków platform, a powinien się "kleić" tylko do górnej części. Chyba spaprałam coś z kodem, ale nie wiem, jak to rozwiązać.

Odnośnik do komentarza
Udostępnij na innych stronach

Właściwie to nawet nie wiem, gdzie mam wpisać ten kod. Zasadniczo wpisałam w evencie pres <Space> (bo skakanie chcę na spacji) jump to position (0, 50) i zaznaczyłam relative. Próbowałam wpisywać różne kody, kazałam mu opadać na ziemię przy puszczeniu spacji, ale nic to nie daje. Rozumiem, że w evencie skoku powinnam wpisać jakiś execute code przed albo po samej akcji skakania...I nie wiem, czy dodać tam jeszcze jakieś akcje?

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję. Wcześniej chyba przeoczyłam ten podpunkt. Te problemy już chyba rozwiązałam. Natomiast nurtuje mnie teraz jeszcze jedna kwestia - mianowicie zrobiłam sobie ruchome platformy - jeżdżą sobie w lewo i w prawo i teraz pytanie: co mam zrobić, żeby ludzik jeździł razem z platformą, a nie ześlizgiwał się z niej?

Odnośnik do komentarza
Udostępnij na innych stronach

Platformy już załatwione. Teraz moim wielkim problemem jest animacja ludzika. Mam sobie kod, że powinien przebierać nogami w lewo, jak idzie w lewo, w prawo, jak idzie w prawo i nie przebierać, jak stoi. No i coś musiałam spaprać, bo on caaaały czas wygląda jakby chodził w lewo, nawet jak stoi, nawet, jak idzie w prawo. Kod wygląda tak:

{if vspeed=0

sprite_index=ludzik_stand1

 

{if (keyboard_check(vk_left) and place_free(x-6,y))

{x-=6}

sprite_index=ludzik_walk

if (keyboard_check(vk_right) and place_free(x+6,y))

{x+=6}

sprite_index=ludzik_walk2

if (keyboard_check(vk_up) and ! place_free(x,y+1) and vspeed=0)

{vspeed-=10}

 

image_speed=0.3;

}

 

if place_free(x,y+1)

{gravity = 0.5}

else

{gravity = 0}

}

 

Co z nim jest nie tak? Jak mogę go poprawić?

Odnośnik do komentarza
Udostępnij na innych stronach

Poprawnie robić klamry. One służą do oddzielania bloków kodu. Jeżeli wstawisz przed blokiem if (funkcję warunkową) to blok wykona się tylko gdy będzie spełniony warunek.

 

W twoim wypadku kod odpowiadający za zmianę grafiki jest za każdym razem poza blokiem, a przez to zawsze się wykonuje i w efekcie brany pod uwagę jest tylko ostatnie wykonanie tego kodu.

Odnośnik do komentarza
Udostępnij na innych stronach

Zwróć też uwagę na estetykę kodu, raz piszesz nawiasy po if a raz nie. Raz stawiasz średniki a raz nie.

GML
if ( vspeed == 0 )

sprite_index = ludzik_stand1;

 

if ( keyboard_check(vk_left) and place_free(x-6,y) )

{

x -= 6;

sprite_index = ludzik_walk;

}

 

if ( keyboard_check(vk_right) and place_free(x+6,y) )

{

x += 6;

sprite_index = ludzik_walk2;

}

 

if ( keyboard_check(vk_up) and !place_free(x,y+1) and vspeed == 0 )

{

vspeed -= 10;

image_speed = 0.3;

}

 

if ( place_free(x,y+1) )

{

gravity = 0.5;

}

else

{

gravity = 0;

}

Odnośnik do komentarza
Udostępnij na innych stronach

Przebiera nóżkami w miejscu, a nie rusza, jakby podłoga go trzymała.

Bardzo dobra dedukcja. Właśnie to się dzieje.

 

Teraz pytanie czy ja dobrze zrozumiałem. Jak ludzik chce iść to nie może, ale jak podskoczy i wyląduje to może już chodzić? Jeżeli tak to po prostu źle został umieszczony w edytorze room.

Ale jeżeli po wylądowaniu też nie może chodzić (albo czasami tylko może) to wciąż jest błąd z kodem sprawdzającym kolizje.

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli nie wiadomo, jak to naprawić? Bo szukałam już we wszystkich możliwych opcjach i nadal nic. Czy taki problem jest wam znany? Co mogę jeszcze zrobić? Dodam, że kiedy stoi, to na powierzchni platformy, ale kiedy zaczyna bezradnie przebierać nóżkami żeby ruszyć, to tak jakby zachodzi na samą platformę.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Wyłącz precyzyjne maski w sprite i sprawdź, czy rozmiary masek się zgadzają na sprite'ach i klatkach - bo tam, gdzie są nogi w ruchu mogą być krótsze, obiekt opada, a w kolejnej klatce zachodzi na obiekty :)

Odnośnik do komentarza
Udostępnij na innych stronach

Twój błąd może być z maskami. W create wstaw:

GML
mask_index=sprite_index
, a w grafice postaci odznacz "Precise collision checking"

 

Jak to nie pomoże to spróbuj tak jak pisałem 10 dni temu i dodaj

GML
move_outside_solid(90,0)

Jak to też nie zadziała to prześlij mi w prywatnej wiadomości cały kod postaci i zobaczę co da się zrobić.

Odnośnik do komentarza
Udostępnij na innych stronach

Pomogło mask index równa się sprite index. Teraz mam kolejną zagwozdkę: chciałabym mieć platformę, na którą można by było wejść od spodu np. po drabinie, a od góry, żebym mogła na niej stać. Jak taką zrobić? Żeby przy wchodzeniu na nią od dołu nie była ~solidna~, a od góry była? Ach, i skoro mowa o drabinie - jak ją zrobić?

 

Wiem, że strasznie marudzę, ale gdy próbuję korzystać z angielskich tutoriali, to zawsze coś idzie nie tak i ile bym nie próbowała, coś jest zawsze źle.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, czyli pierwotnym problemem było to że maski miały różne rozmiary. :)

 

A co do nowego pytania:

Jest to bardzo trudne zagadnienie które można zrobić na wiele sposobów. Zazwyczaj unikam odsyłania ludzi do tutoriali na YT ale ten w tym wypadku się sprawdzi.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 tygodnie później...

Dziękuję. Tylko problemem okazuje się być to, że platformy...yyy...są "solidne" z dołu do góry", a przepuszczają z góry w dół, czyli się spada, a powinno być odwrotnie...Nie wiem, jak to odkręcić. W ogóle jak uzależnić daną akcję od tego, czy ludzik styka się z obiektem od góry czy od dołu? Jest na to jakiś kod?

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ę...