Skocz do zawartości

Obiekt w okręgu


Adriann

Rekomendowane odpowiedzi

Więc mam taki problem,zrobiłem okrąg wielkości około 200\200,w tym okręgu znajduje się obiekt który podąża za kursorem,chcę by ten obiekt się odbijał od tego okręgu i nie wypadał z niego,zrobiłem w kolizji to klockiem ale tylko się zatrzymywał a chodzi mi o to żeby się ślizgał po tym okręgu,poza tym najważniejsze,kiedy okrąg się poruszy obiekt wypadał,jak zrobić by cały czas był w okręgu,proszę o pomoc. :thumbsup:

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Rozumiem, że okrąg jest nieruchomy, a obiekt w środku podąża za kursorem, ale robi to tak, aby poza okrąg nie wyjść tak ?

Zatem

 

GML
if point_distance(srodek_kola_x,srodek_kola_y,obj.x,obj.y)>200

{

speed = 0;

}

else

{

//podazanie za kursorem

}

Odnośnik do komentarza
Udostępnij na innych stronach

Ale wtedy obiekt będzie się "wkleszczał" w okrąg. Proponowałbym obiekt, o wielkości 1px i wyłączonym visible przyklejony do myszki i sprawdzanie jego kolizji z kółkiem. Następnie kod gnyska wystarczy zmodyfikować w sposób następujący:

GML
if (point_distance(srodek_kola_x,srodek_kola_y,obj.x,obj.y)>200 && !obj_cur.koliduje)

//gdzie zmienna koliduje zmieniana jest w obiekcie niewidzialnym kod mniej więcej taki:

if(collision_circle(xkolka,ykolka,100,self,1,0))

{

koliduje = 1;

}

else

{

koliduje = 0;

}

Odnośnik do komentarza
Udostępnij na innych stronach

Obiekt podążający: CREATE

GML
okrag_x=150; // wpisz tutaj pozycję koła

okrag_y=150;

x=okrag_x;

y=okrag_y;

max_speed=5; // maksymalna prędkość (jak ta wartość jest stała, usuń ją i zamień w step na liczbę)</span></span>

 

Obiekt podążający: STEP

GML
direction=point_direction(x,y,mouse_x,mouse_y);

if (point_distance(x,y,okrag_x,okrag_y)>=100-1 && abs(direction-point_direction(x,y,okrag_x,okrag_y))>90 && abs(direction-point_direction(x,y,okrag_x,okrag_y))<270)

{

speed=0;

x=lengthdir_x(100,point_direction(okrag_x,okrag_y,x,y));

y=lengthdir_y(100,point_direction(okrag_x,okrag_y,x,y));

}

else

speed=max_speed;

 

Teraz drobne objaśnienia :)

Dlaczego 100-1? Dodałem pewien margines, żeby obiekt nie "skakał", gdy koło będzie się ruszało

Do czego służy to długie zaczynające się na abs? One sprawdzają po prostu, czy jeżeli pójdzie do myszki, nie wyjdzie jeszcze bardziej po za koło. Bo zakładam, że obiekt ma się ruszyć, jeśli poprowadzisz go do środka.

Co to te lenghtdir'y? Służą one do tego, żeby, gdy będziesz przesuwał koło, obiekt nie wylatywał z niego.

 

Teraz po dotknięciu koła obiekt się zatrzyma. Jeśli chcesz, żeby obiekt "ślizgał się" po kole, dopóki w prostej linii nie znajdzie się: myszka, obiekt i środek koła, skorzystaj z tego wzoru:

 

Obiekt podążający: CREATE

GML
okrag_x=150; // wpisz tutaj pozycję koła

okrag_y=150;

x=okrag_x;

y=okrag_y;

speed=5;

 

Obiekt podążający: STEP

GML
direction=point_direction(x,y,mouse_x,mouse_y);

if (point_distance(x,y,okrag_x,okrag_y)>=100) // miejsce, którego dotyczy informacja na dole

{

x=lengthdir_x(100,point_direction(okrag_x,okrag_y,x,y));

y=lengthdir_y(100,point_direction(okrag_x,okrag_y,x,y));

}

 

Co do tej informacji: nie wiem, kiedy GM zmienia pozycję przez speed. Jeśli przed step to nie ma problemu, jeśli po, obiekt będzie wychodził po za koło. Napisz wtedy w tamtym miejscu prócz 100 jeszcze -speed. Linia będzie wtedy wyglądała tak:

GML
if (point_distance(x,y,okrag_x,okrag_y)>=100-speed)

 

Nie jest to przetestowane, ale mam nadzieję, że będzie działać.

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi ci o ruch ręką po okręgu? Jeśli tak, to namaluj rękę w osobnym sprite'u (skierowaną w prawo) i ustaw origin na miejsce, gdzie jest jej punkt obrotu. W tym ludku stwórz:

w CREATE:

GML
hand_x=x; // pozycja X, gdzie ręka się obraca

hand_y=y-25;// pozycja Y, gdzie ręka się obraca

hand_angle=0; // obrót ręki</span>

 

w STEP:

GML
hand_x=x;

hand_y=y-25;

hand_angle=point_direction(hand_x,hand_y,mouse_x,mouse_y);

 

w DRAW:

GML
draw_sprite_ext(s_reka,0,hand_x,hand_y,1,1,hand_angle,c_white,1); // s_reka to nazwa sprite'a z ręką</span>
Odnośnik do komentarza
Udostępnij na innych stronach

Aha, czyli ruchoma dłoń na ruchomej ręce? Troszkę trudniej, ale możliwe :) :

 

Przede wszystkim sprite'y ręki i dłoni z originem w miejscu obrotu

 

CREATE:

GML
// zmienne ręki

arm_x=x;

arm_y=y-25;

arm_angle=0;

arm_length=35; // chodzi tu o odległość w pikselach punktu obrotu ręki od dłoni

// zmienne dłoni

hand_x=x+35;

hand_y=y-25;

hand_angle=0; // obrót ręki</span></span>

 

STEP:

GML
arm_x=x;

arm_y=y-25;

arm_angle=point_direction(hand_x,hand_y,mouse_x,mouse_y);

hand_x=arm_x+lengthdir_x(arm_length,arm_angle);

hand_y=arm_y+lengthdir_y(arm_length,arm_angle);

hand_angle=...; // tutaj ustaw sobie sposób ruchu ręką</span></span>

 

DRAW:

GML
draw_sprite_ext(s_reka,0,arm_x,arm_y,1,1,arm_angle,c_white,1); // s_reka to nazwa sprite'a z ręką

draw_sprite_ext(s_dlon,0,hand_x,hand_y,1,1,arm_angle+hand_angle,c_white,1); // s_dlon to nazwa sprite'a z dłonią</span></span>
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ę...