Skocz do zawartości

Strzała wbijająca się w przeciwnika


Ignatus

Rekomendowane odpowiedzi

Prosta sprawa.Top Down- strzelam z łuku we wrogów i chcę żeby trafiona strzała została w miejscu w które trafiła nawet kiedy wróg się obraca i porusza.

Zgodnie ze znalezionymi tropami w necie zrobilem:

 

End Step strzaly

 

GML
if hit=true {

if (instance_exists(enemy)){

 

 

 

x=en.x+lengthdir_x(0,enemy.image_angle)

y=en.y+lengthdir_y(0,enemy.image_angle)

 

Efekt= strzala trzyma sie postaci wroga ale wcale się nie obraca (ma caly czas image_angle ktory miala w momencie kolizji)

 

dorzucilem w takim razie

 

GML
image_angle=enemy.image_angle

 

Efekt= sukces!

 

Ale tyczy się to tylko jednej strzaly-kazda kolejna pokrywa sie z pierwszą i nawet jej nie widac.

Co ciekawe po przeniesienie dokladnie tego kodu z End Step na Step sprawia ze strzaly wbijaja sie i trzymaja indywidualnie-tak jak powinny.Ale obracają z beznadziejnym opóźnieniem (w sumie nie wiem dokladnie o co chodzi ,wyglada jakby sie krecily wewnatrz postaci swoim tempem-w end step kreca jak powinny)

 

Rzecz wydaje się banalna ale nie mam pojęcia co z tym zrobić..

Edytowane przez Threef
Przeniosłem do osobnego tematu
Odnośnik do komentarza
Udostępnij na innych stronach

W swoim endstep przy kolizji dopisz jakoś relatywny kąt pod jakim wbiła się strzała a potem rysuj uwzględniajac ten kąt.

GML
if hit=true {

if (instance_exists(enemy)){

 

 

 

x=en.x+lengthdir_x(0,enemy.image_angle)

y=en.y+lengthdir_y(0,enemy.image_angle)

angle=image_angle-enemy.image_angle

GML
image_angle=enemy.image_angle+angle

 

I staraj się nigdzie w projekcie nie używać begin i end step. Nie są potrzebne a to że ich potrzebujesz jest znakiem że masz bałagan w kodzie.

Odnośnik do komentarza
Udostępnij na innych stronach

Świetne,wielke dzięki Threef.Teraz kąty obliczają tak jak powinny ale mam problem z miejscem wbicia strzały- zawsze strzała jest idealnie w środku wroga, jak zrobić żeby wbita była tam gdzie trafiła?

 

 

ps.dlaczego nie używać Endstep i dlaczego przy zwyklym step taki uklad nie dziala?

Odnośnik do komentarza
Udostępnij na innych stronach

End Step wykona się po tym jak wszystkie inne obiekty wykonają swój step. Wydaje się to bardzo sensowne gdy chcemy wykonać coś zaraz po zwykłym step... ale to prowadzi do dużego bałaganu w kodzie. Szczególnie jeżeli trzeba później coś wykonać po tym End Step.

 

 

Miejsce wbicia masz tutaj. Ustawiasz to zawsze na tę samą wartość.

GML
x=en.x+lengthdir_x(0,enemy.image_angle)

y=en.y+lengthdir_y(0,enemy.image_angle)

Może spróbuj tutaj także zapisać wartość o ile pixeli było przesunięcie?

Odnośnik do komentarza
Udostępnij na innych stronach

Tak właśnie próbuję ale jak na razie bez efektu

 

 

GML
if collision_point(x,y,obj_Enemy_parent,1,0)&&(hit=false)&&(wall_hit=false){

px=x

py=y

en=instance_nearest(x,y,obj_Enemy_parent)

 

angle=image_angle-en.image_angle

hit=true}

 

if hit=true {

if (instance_exists(en)){

 

 

 

x=en.x-px+lengthdir_x(0,en.image_angle)

y=en.y-py+lengthdir_y(0,en.image_angle)

 

 

 

image_angle=en.image_angle+angle

}

 

Przy takim rozwiązaniu strzala znika nie wiadomo gdzie.Jakim tropem isc?

Odnośnik do komentarza
Udostępnij na innych stronach

Chcesz różnicę pomiędzy puntem kolizji a origin przeciwnika.

GML
px=x-en.x

py=y-en.y

 

Poza tym lepiej sprawdzać kolizję tak:

GML
var en=collision_point(x,y,obj_Enemy_parent,1,0);

if (en)&&(hit=false)&&(wall_hit=false){

Instance nearest jest nie potrzebne i może zwracać błędy gdy jest dużo obiektów wokół siebie. A sama funkcja collision_point() zwraca ID instance z którym koliduje.

Odnośnik do komentarza
Udostępnij na innych stronach

 

Przy

GML
x=en.x+lengthdir_x(0,en.image_angle)+px

y=en.y+lengthdir_y(0,en.image_angle)+py

 

Wbija się tam gdzie fizycznie powinno ale wraca pierwszy błąd -czylu strzała pływa sobie nienaturalnie zamiast obracac sie z celem

 

Przy

GML
x=en.x+lengthdir_x(0,en.image_angle)-px

y=en.y+lengthdir_y(0,en.image_angle)-py

 

Strzala jest daleko od celu i sobie plywa

 

Przy innych probach strzala znika po trafieniu w cel

Odnośnik do komentarza
Udostępnij na innych stronach

Twoja strzała nie znika tylko jest rysowana w miejscu którego się tego nie spodziewasz. Na przykład jakieś x=432+lengthdir_x(0,en.image_angle)+440. Sprawdź jaka jest wartość i się dowiesz.

 

A co do "nienaturalnego" poruszania. Przeciwnik się porusza i obraca. Być może zamiast różnicy w pozycjach x i y musisz zapamiętywać kąt i dystans pomiędzy punktami?

 

 

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