Skocz do zawartości

Rozwarstwiająca się grafika.


ka21k

Rekomendowane odpowiedzi

Witam.

W ramach ćwiczeń z programowania w GML postanowiłem stworzyć sobie prostego robota którym można poruszać za pomocą myszy.

Na razie stworzyłem części potrzebna mi do testowania połączeń jego podstawy(proste grafiki).

Zamiar jest taki, aby jego nogi poruszane były za pomocą siłowników, a każdy siłownik reagował na wychylenia korpusu i podstaw jak i wzajemnie na siebie.

Problem jest następujący (na razie warunki obliczane są tylko dla prawego siłownika)

Gdy robot jest w powietrzu (nie dotyka podłoża) można nim poruszać za pomocą myszki we wszystkie strony - to już działa.

Gdy jedna z jego podstaw dotknie podłoża to zostaje w tym miejscu, ale nadal można poruszać resztą korpusu (siłowniki wychylają się) - to tez działa.

Gdy poruszamy korpus stojący na podłożu to siłowniki zaczynają swoją pracę w cylindrach (chowają się i wysuwają z cylindrów w zależności od ruchów myszki) - to też działa.

Gdy zbytnio obniżymy korpus i jeden z siłowników wsunie się maksymalnie do cylindra to nie powinno się już dać obniżyć bardziej korpusu (wsunąć go bardziej), ale nadal można poruszać korpusem- to też działa.

Problem:

Gdy mimo wszystko przesuwamy korpusem (wsuwając tłok do cylindra) Obiekty jak gdyby rozdwajają się i widać dwa obrazy.

Jeden w poprawnej pozycji, a drugi nadal podążający za myszką.

Nie wiem jak to poprawić.

 

Załączam przykładowy plik żebyście mogli sami zobaczyć o co mi chodzi.

przykład pracy cylindrów

Odnośnik do komentarza
Udostępnij na innych stronach

Witam.

Pokombinowałem i udało się usunąć problem z rozdwajającą się grafiką.

Teraz pozostał inny którego nie mogę rozgryźć i tu liczę na Waszą pomoc.

Mianowicie:

Jeśli jestem w pozycji w której tłoki są schowane to współrzędne mojego kadłuba pozostają w takiej odległości, że nie da się już więcej wsunąć tłoka.

Jednak powinno się dać poruszać całym korpusem w lewo lub w prawo. Niestety u mnie to nie działa.

Opiszę od początku jak wyliczane są współrzędne w programie.

 

GML
//pobranie wspolrzednych myszy

kadlub_x=mouse_x;

kadlub_y=mouse_y;

 

//obliczanie polozenia podstawy nogi prawej

noga_p_x=kadlub_x+lengthdir_x(point_distance(kadlub_x,kadlub_y,kadlub_x+101,kadlub_y+200),point_direction(kadlub_x,kadlub_y,kadlub_x+101,kadlub_y+200));

noga_p_y=kadlub_y+lengthdir_y(point_distance(kadlub_x,kadlub_y,kadlub_x+101,kadlub_y+200),point_direction(kadlub_x,kadlub_y,kadlub_x+101,kadlub_y+200));

with(noga_p)

{

if(!place_free(kadlub.noga_p_x,kadlub.noga_p_y+1))

{

move_contact_solid(270,4);

kadlub.noga_p_y=y;

kadlub.noga_p_x=x;

}

}

 

//obliczanie polozenia podstawy nogi lewej

noga_l_x=kadlub_x+lengthdir_x(point_distance(kadlub_x,kadlub_y,kadlub_x-101,kadlub_y+200),point_direction(kadlub_x,kadlub_y,kadlub_x-101,kadlub_y+200));

noga_l_y=kadlub_y+lengthdir_y(point_distance(kadlub_x,kadlub_y,kadlub_x-101,kadlub_y+200),point_direction(kadlub_x,kadlub_y,kadlub_x-101,kadlub_y+200));

with(noga_l)

{

if(!place_free(kadlub.noga_l_x,kadlub.noga_l_y+1))

{

move_contact_solid(270,4);

kadlub.noga_l_y=y;

kadlub.noga_l_x=x;

}

}

 

//wspolzedne dla tlokow

tlok_p_x=noga_p_x;

tlok_p_y=noga_p_y-25;

tlok_l_x=noga_l_x;

tlok_l_y=noga_l_y-25;

//wspolrzedne dla cylindrow

cylinder_p_x=kadlub_x+lengthdir_x(point_distance(kadlub_x,kadlub_y,kadlub_x+101,kadlub_y+31),point_direction(kadlub_x,kadlub_y,kadlub_x+101,kadlub_y+31));

cylinder_p_y=kadlub_y+lengthdir_y(point_distance(kadlub_x,kadlub_y,kadlub_x+101,kadlub_y+31),point_direction(kadlub_x,kadlub_y,kadlub_x+101,kadlub_y+31));

cylinder_l_x=kadlub_x+lengthdir_x(point_distance(kadlub_x,kadlub_y,kadlub_x-101,kadlub_y+31),point_direction(kadlub_x,kadlub_y,kadlub_x-101,kadlub_y+31));

cylinder_l_y=kadlub_y+lengthdir_y(point_distance(kadlub_x,kadlub_y,kadlub_x-101,kadlub_y+31),point_direction(kadlub_x,kadlub_y,kadlub_x-101,kadlub_y+31));

 

//sprawdzenie jak daleko wysuniety jest tlok

tlok_p_cyl_p=point_distance(tlok_p_x,tlok_p_y,cylinder_p_x,cylinder_p_y);

tlok_l_cyl_l=point_distance(tlok_l_x,tlok_l_y,cylinder_l_x,cylinder_l_y);

 

//sprawdzenie czy tlok nie jest za bardzo wsuniety do cylindra

if((tlok_p_cyl_p<115)||(tlok_l_cyl_l<115))//czy ktorykolwiek tlok jest wsuniety

{

if(tlok_p_cyl_p<115)&&(tlok_l_cyl_l>115)//jesli wsuniety jest tylko tlok prawy ale nie lewy

{

kadlub_x=tlok_p_x+lengthdir_x(116,cylinder_p.image_angle-180)+lengthdir_x(cyl_p_len,cyl_p_dir);

kadlub_y=tlok_p_y+lengthdir_y(116,cylinder_p.image_angle-180)+lengthdir_y(cyl_p_len,cyl_p_dir);

}

else if(tlok_l_cyl_l<115)&&(tlok_p_cyl_p>115)//jesli wsuniety jest tylko tlok lewy ale nie prawy

{

kadlub_x=tlok_l_x+lengthdir_x(116,cylinder_l.image_angle-180)+lengthdir_x(cyl_l_len,cyl_l_dir);

kadlub_y=tlok_l_y+lengthdir_y(116,cylinder_l.image_angle-180)+lengthdir_y(cyl_l_len,cyl_l_dir);

}

if((tlok_p_cyl_p<115)&&(tlok_l_cyl_l<115))//jesli oba tloki sa rownoczesnie wsuniete

{

if(noga_p.y<noga_l.y)//sprawdzanie ktora podstawa jest nizej

{//obliczanie pozycji kadluba w oparciu o noge prawa

kadlub_x=tlok_p_x+lengthdir_x(116,cylinder_p.image_angle-180)+lengthdir_x(cyl_p_len,cyl_p_dir);

kadlub_y=tlok_p_y+lengthdir_y(116,cylinder_p.image_angle-180)+lengthdir_y(cyl_p_len,cyl_p_dir);

}

else

{//obliczanie pozycji kadluba w oparciu o noge lewa

kadlub_x=tlok_l_x+lengthdir_x(116,cylinder_l.image_angle-180)+lengthdir_x(cyl_l_len,cyl_l_dir);

kadlub_y=tlok_l_y+lengthdir_y(116,cylinder_l.image_angle-180)+lengthdir_y(cyl_l_len,cyl_l_dir);

}

}

}

 

Po tym mam wyliczenia odnośnie wszystkich pozostałych części.

Wiem, że błąd polega na tym iż w momencie gdy którykolwiek z tłoków zostanie wsunięty na maksa to współrzędne dla korpusu są ustawione na sztywno w zależności od ostatniej wartości kąta cylindra w którym nastąpiło zdarzenie i od tego momentu nie ma możliwości poruszania korpusem bo kąt tego cylindra się już nie zmienia.

Nie wiem jak uzależnić kąt cylindrów w zależności od położenia myszki.

Tu chyba wkracza zasada odwróconej kinematyki.

Jak to poprawić.

Plik z przykładem do pobrania w pierwszym poście.

Liczę na pomoc w rozgryzieniu tej łamigłówki.

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