Skocz do zawartości

ka21k

Użytkownicy
  • Postów

    22
  • Dołączył

  • Ostatnia wizyta

Osiągnięcia ka21k

Chicken

Chicken (1/13)

0

Reputacja

  1. Jeżeli te rampy są złożone z obiektów o prostych odcinkach nachylonych pod różnymi kątami to może mógłbyś w każdym takim obiekcie dodać indywidualną zmienną z kątem nachylenia rampy, a później w zdarzeniu kolizji z tym obiektem sprawdzać tą zmienną i obracać klocek zgodnie z jej informacją. w COLLISION swojego klocka wpisał byś tylko: image_angle=other.nachylenie; gdzie "nachylenie" zawierało by informacje o kącie. Mam nadzieję, że pomogłem.
  2. 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.
  3. 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
  4. Jak sam napisales jeden punkt z Timeline na jedna klatke wiec wracamy do punktu wyjscia. Pisac 50 punktow w Timeline z tym samym kodem chyba raczej bez sensu, a za drugiej strony mozna by wywolac 50 razy ten sam punkt w Timeline, ale do tego juz potrzeba osobnej instrukcji IF i zmiennej do zliczania tych wywolan. Wiec nadal stoimy w tym samym miejscu. Zastanawialem sie czy nie mozna by bylo napisac jakiegos dll z taka funkcja? Tym czasem pozostaje kombinowac inaczej. Swoja droga mogliby dodac taka funkcje w nastepnych odslonach GM. Co wy na to?
  5. Poczytalem troche o tych Timelines i tak czy inaczej musialbym kozystac z instrukcji warunkowych zeby rozdzielic wykonywanie kodu do pojedynczych STEPow. Samo umieszczenie kodu w sekwencji timelines spowoduje tylko wykonanie go w odpowiednim czasie, ale nadal stanie sie to wszystko w jednej klatce. Musialbym napisac jakis skrypt np: REPEAT_STEP (ilosc wykonan) {instrukcje}; ktorym wykonywalby sie raz na STEP w programie az ilosc wykonan osiagnela by 0. Jak to zrobic?
  6. Sprawdzilem i rzeczywiście. Nie pomyślałem o tym wcześniej. Byłem pewny, że skoro robię odwołanie do obiektu cylinder_p w obiekcie w którym stworzyłem zmienną tlok_p to nie trzeba się bedzie już odwoływać do samego siebie, aby dostać się do "x" czy "y" tej zmiennej. poprawny kod musi wyglądać w ten sposób: GML image_angle=point_direction(x,y,kadlub.tlok_p.x,kadlub.tlok_p.y); Dzięki za trafną podpowiedź.
  7. W roomie umieściłem obiekt "kadłub", a w nim mam taki kod: dla CREATE: GML cylinder_p=instance_create(x+101,y+31,obj_cylinder); tlok_p=instance_create(x+150,y+100,obj_tlok); dla STEP: GML with(cylinder_p) { x=kadlub.x+101; y=kadlub.y+31; image_angle=point_direction(x,y,tlok_p.x,tlok_p.y); } Przy próbie uruchomienia wyskakuje mi komunikat: ERROR in action number 1 of Step Event for object kadlub: Error in code at line 5: image_angle=point_direction(x,y,tlok_p.x,tlok_p.y); ^ at position 35: Unknown variable tlok_p Co robię źle? Jak dostać się do zmiennych x i y obiektu tlok_p? Proszę o pomoc.
  8. Tak. To rozwiązanie było by dobre tylko dla jednej czynności, ale co gdybym zechciał zrobić sekwencje ruchów obiektów? Można by za każdym razem inicjować zmienną "a", ale wtedy ten IF wykonywał by się także. Za drugiej strony mógłbym napisać kilkadziesiąt IFów dla poszczególnych obiektów tylko ile wtedy potrzebowałbym zmiennych? To stało by się niepraktyczne jeśli zechciałbym sterować w ten sposób kilkoma obiektami na raz.
  9. Witam. Rozmyślałem właśnie nad tym jak napisać kod podobny do REPEAT, ale żeby powtarzał mi dany blok programu co jeden step. Wiadomo, że REPEAT czy pętla FOR wykonuje cały kod w jednym STEPie więc jeśli chciałbym żeby coś poruszyło się powiedzmy o 50 pikseli płynnie w prawo o jeden piksel co STEP to te funkcje nie zadziałają tak jak bym tego oczekiwał i przesuną obiekt o 50 pikseli za jednym zamachem. Jak rozpisać kod który zadziała jak REPEAT (to było by najbardziej funkcjonalne i proste w użyciu dla mnie)? Mam nadzieję, że temat nie okaże się zbyt trudny do rozgryzienia i macie jakieś pomysły na jego rozwiązanie. Pozdrawiam.
  10. ka21k

    [WYNIKI!] OxGames Challenge 3

    Trudno. Może będę miał okazję wystartować w następnym. Poza tym będzie więcej czasu na udoskonalenia i dokończenie mojej gry. Więc nie ma tego złego co by na dobre nie wyszło. Bardzo jestem ciekawy jakie projekty już zostały zgłoszone. Rozstrzygnięcie konkursu już wkrótce więc czekam z niecierpliwością.
  11. ka21k

    [WYNIKI!] OxGames Challenge 3

    Czy ja też mógłbym wystartować w tym konkursie? Zacząłem swój projekt już po tym gdy wystartował konkurs niestety nie wiedziałem o tym i umieściłem swoje demko w dziale Dema Gier i Programów. Dopiero tam któryś z użytkowników zwrócił moją uwagę, że gra nadawała by się na ten konkurs. Czy nie złamie to regulaminu konkursu gdy wyślę swój projekt? Tak pytam z ciekawości.
  12. Spróbuj wstawić : GML if keyboard_check_released(ord('I')) zamiast GML if keyboard_check_direct(ord('I')) Powinno działać.
  13. Ja przerobil bym troche kod Rokulci, aby potworek chodzil za mna nawet jak bedzie dalej niz 300. W STEP potworka: GML if (distance_to_object(ludzik) >0)//0 = dystans od ludzika move_towards_point(ludzik.x,ludzik.y,6); Mozesz zmieniac dystans od ludzika w IF. Wszystko zalezy od tego czy ma cie dogonic czy tylko chodzic za toba.
  14. Witam. Bardzo dziękuję za szybką pomoc, ale mam pewne zastrzeżenia co do działania przykładu kolegi Muuuuczek567 jak i podanego przez ediepl . Rozumiem, że: i.speed - to w moim przypadku prędkość najbliższej instancji, speed - to moja własna prędkość W takim razie gdy mój obiekt stoi w miejscu zachodzi dzielenie przez zero co wywala słusznie komunikat z błędem gdyż nie można dzielić przez zero. Problem w tym, że obiekt który strzela zawsze będzie stał w miejscu i tego zmienić nie mogę. Dodatkowo niektóre obiekty do których celuję też mogą stać w miejscu, ale tutaj konfliktu w obliczeniach być nie powinno ponieważ mnożyć przez zero to już można. Jak zatem sformułować wzór na trafienie? Zaznaczam, że sam usilnie nad tym pracuję i nie czekam na gotowca. Jeśli tylko zdołam wymyślić działający wzór natychmiast go przedstawię. Jednakże liczę także na waszą pomoc w tej kwestii. Edit: Okazało się, że zarówno kod kolegi Muuuuczek567 jak i podany przez ediepl jest poprawny. Speed - to nie prędkość obiektu który strzela tylko pocisku który leci w cel. Założyłem, że kod odnosi się do obiektu który celuje a nie do samego pocisku dlatego mi nie działało. Jeszcze raz wielkie dzięki za pomoc. Teraz pozostało mi jeszcze napisać kod który będzie wysyłał pociski tylko wtedy gdy cel będzie w odpowiednim polu widzenia, ale kod na to już widziałem gdzieś w otchłani tematów dla początkujących. Pozdrawiam.
  15. Witam. Chciałbym jakoś zapisać w GML warunek na podstawie którego mój obiekt namierza inny obiekt który się porusza. W zasadzie z samym namierzaniem nie ma większego problemu natomiast trafienie w cel to już inna historia. Mam taki kod na ustawienie mojego obiektu w kierunku celu: GML //po rozlaczeniu statek2 samodzielnie wybiera najblizsze cele i ostrzeliwuje sie w kolo if(global.polaczenie==1 && global.wspolnie==2) { //jesli na planszy sa obiekty if(instance_exists(parent_wrog)) { najblizszy=instance_nearest(x,y,parent_wrog); kierunek2=point_direction(x,y,najblizszy.x,najblizszy.y); image_angle=kierunek2; } } Wszystko działa dobrze gdy cele są naprawdę blisko, ale na odległość nic nie można trafić ponieważ czas jaki potrzebuje pocisk aby dolecieć do celu pozwala mu na oddalenie. W efekcie pociski przelatują za namierzonym obiektem. Ma na to też wpływ SPEED celu. Jak napisać kod który będzie namierzał cele z wyprzedzeniem i ustawiał IMAGE_ANGLE w odpowiednim położeniu aby pociski dolatywały i trafiały w cel na czas?
×
×
  • Dodaj nową pozycję...