Skocz do zawartości

Obiekt STOP


dolaran

Rekomendowane odpowiedzi

Witam

 

Potrzebuje pomocy w pewnej sprawie.

Mam dwa obiekty „a” i „b” obiekt „a” jest wystrzeliwany w kierunku obiektu „b” i w czasie kolizji chcę aby obiekt „a” zatrzymał się w wewnątrz obiektu „b” jak mam to zrobić.

 

Do dam, że zwykła kolizja z kodem stop daje zły efekt bo obiekt „a” zatrzymuje się przed obiektem „b”.

 

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

wstaw to do kolizji:

GML
if x<other.x+abs(hspeed) and x>other.x-abs(hspeed) and y<other.y+abs(vspeed) and y>other.y-abs(vspeed)

{

speed=0;

x=other.x;

y=other.y;

}

nie jest to zbyt dobra metoda, lecz powinna działać.

origin spritów obiektów powinien być w środku

 

jeśli ten kod jest dla ciebie za mało precyzyjny, możesz również zastosować to:

GML
if speed!=0 direction=point_direction(x,y,other.x,other.y);

if x<other.x+abs(hspeed) and x>other.x-abs(hspeed) and y<other.y+abs(vspeed) and y>other.y-abs(vspeed)

{

speed=0;

x=other.x;

y=other.y;

}

jeśli obiekt 1 będzie przelatywał obok środka obiektu 2, skręci do niego i dopiero w środku obiektu 2 się zatrzyma.

Odnośnik do komentarza
Udostępnij na innych stronach

jak to przed obiektem? - stkają się

 

obiekt ma ustawioną jakaś maskę? - oiekt b jest jako solid

 

obiekt a jest o wiele mniejszy od b

 

czy obiekt "b" to kółko z pustym środkiem? jest pełen, obiekt b jest kwadratem

 

w obiekt a- ma Event, kolizja z b Action, Move Fixet, Stop, Relative

Odnośnik do komentarza
Udostępnij na innych stronach

w obiekt a- ma Event, kolizja z b Action, Move Fixet, Stop, Relative

daj screenshota.

spróbuj zastosować mój kod, bo będzie działał, ale jeśli koniecznie chcesz to zrobić na klockach, jest tam jakiś klocek "check if the expression is true" czy jakoś tam, to wrzuć do niego:

x<other.x+abs(hspeed) and x>other.x-abs(hspeed) and y<other.y+abs(vspeed) and y>other.y-abs(vspeed)

 

i nie doublepostuj.

Odnośnik do komentarza
Udostępnij na innych stronach

Sorka że tu ale czemu wyskakuje błąd do tej linijki ?

GML
o = replace(6) instance_create(obj_hero.x+lengthdir_x(45,direction-20),obj_hero.y+lengthdir_y(45,direction-20),obj_bullet)

bo nie ma czegoś takiego jak replace?

 

i dawaj treść błędu na przyszłość, NIE JESTEŚMY JASNOWIDZAMI

Odnośnik do komentarza
Udostępnij na innych stronach

Sorka chodziło mi o "repeat". Ale co zrobiłem źle.

ctrl+c is your friend

 

co to ma być o=repeat(6)? ty rozumiesz swój kod?

GML
repeat(6)

{

o=instance_create(obj_hero.x+lengthdir_x(45,direction-20),obj_hero.y+lengthdir_y(45,direction-20),obj_bullet);

o.costam=costam;

}

nie wiem jaki był cel tamtego kodu, więc musiałem coś wymyśleć samemu.

Odnośnik do komentarza
Udostępnij na innych stronach

Na szybko zrobiłem w Paint jak to ma wyglądać.

1 przykład jest zły bo obiekt zatrzymał się przed obiektem.

2 jest poprawny bo obiekt "a" jest w obiekcie "b" i tak samo 3

Tu jest link do przykładu https://gmclan.org/uploader/1167/bez_tytu_u.jpg

 

Może źle się wyraziłem w pierwszym poście bo generalnie chodzi mi o to by obiekt wszedł do drugiego w całości i się zatrzymał nie koniecznie do samego środka.

 

Sorry za duble zapędziłem się.

Odnośnik do komentarza
Udostępnij na innych stronach

GML
if x<other.x+other.sprite_width/2-sprite_width/2+abs(hspeed) and x>other.x-other.sprite_width/2+sprite_width/2-abs(hspeed) and y<other.y+other.sprite_height/2-sprite_height/2+abs(vspeed) and y>other.y-other.sprite_height/2+sprite_height/2-abs(vspeed)

{

speed=0;

}

szybko zedytowałem swój kod.

 

edit: trochę bardziej manualna metoda niż collision_rectangle, ale powinna działać

Odnośnik do komentarza
Udostępnij na innych stronach

GML
if ( collision_rectangle( other.x - sprite_get_bbox_left( other.sprite_index ), y - sprite_get_bbox_top( other.sprite_index ), x + sprite_get_bbox_right( other.sprite_index ), y + sprite_get_bbox_bottom( other.sprite_index ), self, 1, 0 )) speed = 0

o ile czegoś nie pomieszałem, to powinno być ok :)

Odnośnik do komentarza
Udostępnij na innych stronach

GML
if x<other.x+other.sprite_width/2-sprite_width/2+abs(hspeed) and x>other.x-other.sprite_width/2+sprite_width/2-abs(hspeed) and y<other.y+other.sprite_height/2-sprite_height/2+abs(vspeed) and y>other.y-other.sprite_height/2+sprite_height/2-abs(vspeed)

{

speed=0;

}

szybko zedytowałem swój kod.

 

edit: trochę bardziej manualna metoda niż collision_rectangle, ale powinna działać

 

ok rozumiem, że w obiekcie "a" tylko w jaki Event?

Odnośnik do komentarza
Udostępnij na innych stronach

na pewno żaden z obiektów nie ma ustawionej maski?

 

spróbuj do każdej z tych wartości odjąć 10:

GML
if ( collision_rectangle( other.x - sprite_get_bbox_left( other.sprite_index ) + 10, y - sprite_get_bbox_top( other.sprite_index ) + 10, x + sprite_get_bbox_right( other.sprite_index ) - 10, y + sprite_get_bbox_bottom( other.sprite_index ) - 10, self, 1, 0 )) speed = 0
Odnośnik do komentarza
Udostępnij na innych stronach

zamiast origina 0,0 kliknij center i spróbuj znowu mojej metody.

 

Zrobiłbym tak ale nie mogę to mi zepsuje całą grę musze mieć „b” na 0,0 a „a” na 6, 6

 

na pewno żaden z obiektów nie ma ustawionej maski?

 

Za bardzo nie wiem o co chodzi z tą maską?

Odnośnik do komentarza
Udostępnij na innych stronach

wersja dla spritów z originami 0,0.

GML
if x<other.x+other.sprite_width-sprite_width/2+abs(hspeed) and x>other.x+sprite_width/2-abs(hspeed) and y<other.y+other.sprite_height-sprite_height/2+abs(vspeed) and y>other.y+sprite_height/2-abs(vspeed)

{

speed=0;

}

spróbuj

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