Skocz do zawartości

Lina pozioma łamana łukowa pod różnym kątek + fizyka?


Rekomendowane odpowiedzi

Cześć wszystkim,

 

Próbuje stworzyć poziomą linę po której bohater przemieszcza się lewo prawo.

Ten etap udało Mi się osiągnąć...lina działa idealnie na obiektach poziomych bez załamań łuków skosów itp.

Jednak chciałbym aby ta lina działała mi również i głównie na linach łukowych i pod różnym kątem.

Czy coś takiego bez włączania fizyki w gms 1.4 można osiągnąć?

Ktoś byłby wstanie pomóc mi tak przerobić mój kod aby gracz mógł chodzić po takich linach?

za wszelką pomoc wam dziękuję z góry..

 

a tu mój obecny kod liny..

 

wiadomo

 

 

obj_gracz

create

 

lina = false;

 

obj_gracz

step

 

    //lina
  if place_meeting(x,y,obj_lina) && place_meeting(x,y,obj_lina) && place_meeting(x,y-125,obj_lina) && czas <= 0 && (key_check(key.left) || key_check(key.right) &&  wPowietrzu) {
   lina  = true;
   vspd = 0;
   hspd = 0;
  }
 
 //Chodzenie po linie
 if lina == true {
  var __hsign = keyboard_check(vk_right)-keyboard_check(vk_left);
  
    hspd = min(max(hspd+__hsign*2,-4),4);
  

  if __hsign == -1 && !place_meeting(x-40,y,obj_lina) {
   lina = false;
   hspd = -1;
  }
 

   if __hsign == 1 && !place_meeting(x+40,y,obj_lina) {
   lina = false;
   hspd = 1;
  }
 
  
if __hsign != 0 {
   image_xscale = __hsign;
  }

 
if __hsign == -1 && !wPowietrzu {
    lina = false;
  }



  if !place_meeting(x,y,obj_lina) || !place_meeting(x,y-125,obj_lina) {
   lina = false;
  }
 }

 

obj_gracz

 

step 2

 

if lina == true {
  if x == xprevious && y == yprevious {
   if sprite_index != spr_bohater_wisinalinie {
    sprite_index = spr_bohater_wisinalinie;
   }
  } else {
   if sprite_index != spr_bohater_lina {
    sprite_index = spr_bohater_lina;
   }
  }
 }
 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ale ta lina ma się pod bohaterem bujać? Jeśli nie, to jest zwykłe wchodzenie pod górkę, jeśli tak... no to jest już skomplikowana sprawa i co prawda widziałem takie rzeczy (inverse kinematics), ale nie wiem czy to wyjdzie tak jak chcesz: https://marketplace.yoyogames.com/assets/6157/inverse-kinematics

Odnośnik do komentarza
Udostępnij na innych stronach

Mam tu na myśli wspinaczkę po takich linach.Czyli chwyta się rękami takiej liny i przemieszcza lewo i w prawo.Bohater nie będzie chodził po nich tylko i wyłącznie wspinał się.

Rozumiem jak wspomniałeś,że jest to zwykłe wchodzenie pod górkę...

Tylko problem polega na tym jak zmusić bohatera żeby wspinał się po takich linach w kształcie paraboli? No i co najważniejsze żeby z nich nie spadł.

Mam w powyższym kodzie obiekt niewidoczny  obj_lina w postaci kwadratu który rościągam i nakładam na interesujący mnie obiekt na scenerii czyli na linę w kształcie paraboli,a po niej chodzi bohater.Co prawda kąt jego można zmienić ale i tak bohater spada z liny w kształcie paraboli..

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ciężko coś powiedzieć nie widząc kodu, ale to generalnie jest cieżkie zagadnienie. Chodzi o coś takiego jak w wormsach?

 

Trzeba by użyć tego co powyżej, zapamiętywać jakie są fragmenty liny przed/po obecnym, robić interpolację liniową na kolejnych fragmentach (wyliczyć ile procentowo liny się przeszło) i jak dojdziesz do 0% lub 100% przeskakiwać na kolejny fragment, oraz na tej podstawie wyliczać x/y gracza.

 

Generalnie wiec, wchodząc na linę najlepiej byłoby w ogóle niszczyć obiekt gracza i tak naprawdę sterować między wartością 0% a 100% progresją przejścia tej liny, a bohatera tylko rysować (jeśli jest na obecnym segmencie). Jak dojdzie do któregoś z końców to znów go utworzyć jako obiekt. Gracz i tak widzi to co jest rysowane, więc nie ma znaczenia zniknięcie obiektu.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie nie..w Wormsach mamy coś takiego,że robak wypuszcza linę i ta lina chwyta się skały razem z Robakiem.

Tu ja mam już narysowaną linę i na nią nakładam niewidoczny obiekt sprite..w postaci kwadratu rozciągam go i po tym wspina sięi bohater..dając wrażenie jakby wspinał się po linie

To działa dobrze na linie prostej poziomej..ale jak wspomniałem problem jest z liną łamaną a nie wspomnę jak już namalowałbym parabolę..

Te liny nie muszą się ruszać,bo to za dużo zabawy..istotne jest to,żeby gracz mógł spokojnie wspinać się po nich lewo prawo...o coś takiego mi chodzi..

 

Co do kodu liny jest wyżej w moim poście..

 

Może przydałby się też ruch Y dla zakrzywionych linii lub kabli itp obiektów podobnych wtedy mamy potencjalną kolizję z 4 stron gracza aby nie spadł musi zmienić kierunek aby pozostać na linie/przewodzie...

Tu też Gnysek ma ciekawe rozwiązanie z interpolacją liniową.

 

 

Ktoś byłby wstanie coś z was takiego  dla mnie zrobić?wykorzystując np mój kod wyżej z tego postu?

Moje pomysły się wyczerpały...nie mam takich zaawansowanych umiejętności.

Bardzo dziękuję za każdą możliwą pomoc.

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Ja bym to zrobił podobnie jak to @gnysek zaproponował, ale zamiast procentowego wskaźnika, to trzymał długości segmentów, oraz nie usuwał obiektu gracza, a w nim sterował poruszanie się po linie. np. przypuśćmy, że mamy taką linę:
sqpA5BD.png

Można podzielić ją na segmenty, np. ręcznie powstawiaj punkty, np. w kodzie i wtedy będziesz miał listę punktów z której możesz policzyć długość każdego segmentu.
1a1fIDy.png

Teraz najciekawsza rzecz - żeby pozwolić graczowi "złapać" linę, musisz policzyć jak daleko od najbliższego segmentu jest gracz. W pętli for dla każdego segmentu sprawdzaj, jak daleko gracz jest od liny. Jeżeli będzie odpowiednio blisko, to przypisz graczowi poprzez zmienną, do której liny należy, oraz na którym segmencie "zaczął się wspinać".
Możesz przerobić ten skrypt https://www.gmlscripts.com/script/point_line_distance tylko wyciągnij z niego dwie wartości jak odległość i zmienną t, bo przyda Ci się do obliczenia jak daleko na tym segmencie jest gracz.

A sama wspinaczka to co Step Event musisz ustawić gracza na odpowiedni segment linii. Np. jeżeli masz w graczu zapisaną wartość 120, to znajdujesz na którym segmencie jest gracz np. w pętli for i następnie liczysz wektor normalny z dwóch punktów tego segmentu i mnożysz przez różnicę (120 - [długość całkowita do punktu startowego segmentu na którym jest gracz]) a na koniec dodajesz wartości współrzędnych punktu startowego tego segmentu. Samo sterowanie poruszania się po linie to modyfikacja zapisanej zmiennej, możesz też tę wartość clamp-ować, żeby nie wylazł Ci poza linę.

 

1t32dfH.png

 

PS. pamiętaj, że złożoność tego rozwiązania to O(n), im mniej segmentów, tym lepiej :P 

Odnośnik do komentarza
Udostępnij na innych stronach

Konrad-GM

Bardzo fajnie to zademonstrowałeś na powyższych rysunkach;-) właśnie coś takiego mam na myśli;-)

Szczerze...trochę mnie to przeraża;-) jak mam to ogarnąć...

łatwe rzeczy nie ma problemów,ale jak przychodzi takie wyzwanie to ręce opadają..

Skrypt nie jest duży..a mógłbyś zmontować dla mnie działający przykład takiego ruchu? może być z użyciem tego rysunkowego przykładu...pod gms 1.4

Na górze jest mój kod od liny...

Będzie łatwiej mi się z tym zaznajomić i przeanalizować..Ja już sobie to poskładam w swoim kodzie gry.

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
7 godzin temu, Pogromca_kodu77 napisał:

.trochę mnie to przeraża;-) jak mam to ogarnąć...

 

Bo to nie jest prosta sprawa, dlatego piszemy ogólnikami. Nawet nam zajęłoby to pewnie cały dzień roboty.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie korzystam z GMa już od dłuższego czasu tak naprawdę, ale może spróbuj pobawić się substytutem jak GMowy path, znalazłem nawet jakieś tutoriale. Bazując na nich chyba załapiesz jak można to też rozwiązać, co prawda dalej będziesz musiał policzyć odległość od tych segmentów żeby postać mogła "złapać" linę (chyba, że GM potrafi znaleźć najbliższy punkt funkcjami path :))
https://youtu.be/OkUMpnvxS1s
https://youtu.be/fOL_VYzwDcE

 

Odnośnik do komentarza
Udostępnij na innych stronach

Nie ma problemu chłopaki..na pewno to potem zademonstruje tutaj w swoim demku pokazowym gry;-)

Poprosiłem faceta żeby mi to szczegółowo w kodzie w komentarzach opisał...sam jestem ciekaw efektu końcowego.

mam takie pytanie do was...wiem,że to błahostka..ale opiszę w skrócie o co mi chodzi..

 

W grze mój sprite bohatera zaczyna grę obrócony w prawą stronę w lewej części ekranu czy to na górze lub na dole...ale mam też kilka plansz,gdzie gracz zaczyna w prawym dolnym rogu lub w prawym górnym rogu przygodę i chciałbym żeby wtedy zaczynał ta plansze odwrócony w lewą stronę...

Wiadomo,że to jest czasowe,bo takich plansz tylko kilka jest u mnie w grze gdzie gracz powinien zaczynać planszę odwrócony w lewą stronę.

Jak to zrobić? dodać jakiś warunek w danym pokoju?

jakiś przykład?

 

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki..ale to akurat wiem...

Mi bardziej chodziło o to,że gracz jak zaczyna planszę z prawej strony ekranu to jego sprite jest odwrócony w lewo i jak zaczyna grę z lewej strony ekranu planszy to jego sprite jest odwrócony w prawo;-)

Już to ogarnąłem...

Stworzyłem coś takiego,może komuś się przyda z forumowiczów...

 

obj_bohater

create

 

//Ustaw kierunek patrzenia
twarz = dir_lewo

//Sprawdzanie pozycji gracza
if (obj_bohater.x > room_width - 100) {twarz = dir_prawo}

dir_dol= 270
dir_gora = 90
dir_lewo = 180
dir_prawo = 0

obj_bohater

draw

 

if (twarz = dir_prawo) {image_xscale = -1}

 

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