ka21k Opublikowano 30 Czerwca 2011 Udostępnij Opublikowano 30 Czerwca 2011 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 Więcej opcji udostępniania...
m@rcixxx Opublikowano 1 Lipca 2011 Udostępnij Opublikowano 1 Lipca 2011 Grafika ci się nie rozdwaja. Ustaw sobie room_speed na 1 i przeanalizuj swój kod to zobaczysz o co chodzi. Twój kod próbuje wykonać dwie czynności na raz i dlatego tak się mota. Zmień kod i użyj eventu draw ;). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 1 Lipca 2011 Udostępnij Opublikowano 1 Lipca 2011 obraz sie nie rozdwaja, tylko przez predkosc animcaji, to nam w oczach sie dwoi. Zrob jak powiedzial moj przedmowca i problem bedzie zalatwiony :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ka21k Opublikowano 4 Lipca 2011 Autor Udostępnij Opublikowano 4 Lipca 2011 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 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ę