Skocz do zawartości

Nieudane odbijanie


R.o.b

Rekomendowane odpowiedzi

Cześć Wszystkim!

Pracuję nad gierką, w której odbijamy laser lustrami. Problem polega na tym, że wpisując go w gm8 działał dobrze, ale w gms nie chce prawidłowo działać. Ustawiłem nawet specjalnie maskę tak, żeby kolizja następowała, gdy obj_laser jest w pozycji x+12, y+12 od brzegu obrazka rakietki. Oto kod z obj_laser podczas kolizji z rakietką. Rakietka ma tylko kod odpowiedzialny za zmianę/obrót o 90 stopni

GML
if (other.sprite_index=spr_lrocket4){

x=other.x+12

y=other.y+12

if hspeed=5{

hspeed=0;

vspeed=-5;

} else if vspeed=5{

vspeed=0;

hspeed=-5;}

else if vspeed=-5 or hspeed=-5

instance_destroy()

}

if (other.sprite_index=spr_lrocket1){

x=other.x+12

y=other.y+12

if vspeed=5{

vspeed=0;

hspeed=5;

} else if hspeed=-5{

hspeed=0;

vspeed=-5;}

else if vspeed=-5 or hspeed=5

instance_destroy()

}

if (other.sprite_index=spr_lrocket2) {

x=other.x+12

y=other.y+12

if hspeed=-5{

hspeed=0;

vspeed=5;

} else if vspeed=-5{

vspeed=0;

hspeed=5;}

else if vspeed=5 or hspeed=5

instance_destroy()

}

if (other.sprite_index=spr_lrocket3) {

x=other.x+12

y=other.y+12

if vspeed=-5{

vspeed=0;

hspeed=-5;

} else if hspeed=5{

hspeed=0;

vspeed=5;}

else if vspeed=5 or hspeed=-5

instance_destroy()

}

Obrazek, pokazujący co się dzieje

laser.png

Odnośnik do komentarza
Udostępnij na innych stronach

Przepraszam, za doubleposta... od jakiegoś czasu próbuję rozwiązać problem, ale nie udaje mi się. Zdaję mi się, że jest to problem z kolizją. Wydaje się to dziwne, ale jak próbowałem zrobić coś takiego w GM8 wszystko działało jak powinno. Mógłby ktoś rzucić na to okiem?

Odnośnik do komentarza
Udostępnij na innych stronach

W takim razie jeszcze raz. Mój problem polega na tym, że biały obiekt (obj_laser) ma się odbić od tego 'trójkątnego' czegoś. Kod, który napisałem ma za zadanie sprawdzić jaki sprite ma 'trójkąt', potem ustawić laser na środku kratki z trójkątem i zmienić jego hspped oraz vspeed lub usunąć 'laser', gdy ten będzie uderzał w ścianę 'trójkąta (czyli, patrząc na obrazek - z lewej strony i z dołu). Mój problem polega na tym, że w GMS to się buguje. W poprzednim projekcie w GM8 działało to prawidłowo. Laser zostaje przeniesiony (grzebałem jeszcze trochę nad tym), ale blokuje się w pozycji 'środka' kratki. Zrobiłem do 'trójkąta' maski tak, żeby laser się wtedy z nim nie stykał, ale nadal występuje ten sam problem.

E. Wrzucam screena. Tak zostaje i potem 'laser' nie rusza się, obok narysowana maska

laser2.png

Odnośnik do komentarza
Udostępnij na innych stronach

dokladnie tak, nieodpowiadalem bo mialem nadzieje, ze tylko ja nierozumiem :)

 

jak bawisz sie maskami to domyslanie jest duzo wiecej komplikowane, najlepsiej daj przyklad by moc sprawdzic co trza do odpowiedzi.

 

z obrazku wynika, ze laser ma kontakt z zwierciadlem w zlym miescu, tak?

to kdzie jest ta rakietka?

albo te trojkoty to majo byc rakietky?

to kdzie so zwierciadla?

po co rakietka ma odbijac laser?

dlaczego uzywa hspeed i vspeed zamiast speed+direction?

... i dalsze glupie pytania mnie nawiedzajo jak patrze na 1. post :)

Odnośnik do komentarza
Udostępnij na innych stronach

Trójkąt jest zwierciadłem-rakietką, zależnie od tego, z której strony ma paść na niego laser. W ogóle kolizja tych dwóch obiektów wydaje się dziwna. Laser przeskakuje do pozycji wyznaczonej przez

GML
x=other.x+12

y=other.y+12

Zanim 'dotknie' dokładnie trójkąta

E: Screen pokazujący o co mi chodzi

laser3.png

Odnośnik do komentarza
Udostępnij na innych stronach

Generalnie jak widzę kod napisany w taki sposób jak twój. Nieczytelny bez zastosowania żadnego ogólnie przyjętego formatowania kodu to omijam takie tematy szerokim łukiem.

Kurcze, a ja ciąglę liczę na to że to źle ustawiony origin. :)

Odnośnik do komentarza
Udostępnij na innych stronach

Poprawiłem czytelność kodu, nie zmieniłem w nim żadnej funkcjonalności:

GML
switch other.sprite_index

{

case spr_lrocket1:

{

x = other.x+12; y = other.y+12

if vspeed = 5 {vspeed = 0; hspeed = 5}

else if hspeed = -5 {hspeed = 0 vspeed = -5}

else if(vspeed = -5)||(hspeed = 5) {instance_destroy()}

break

}

case spr_lrocket2:

{

x = other.x+12; y = other.y+12

if vspeed = -5 {vspeed = 0; hspeed = 5}

else if hspeed = -5 {hspeed = 0 vspeed = 5}

else if(vspeed = 5)||(hspeed = 5) {instance_destroy()}

break

}

case spr_lrocket3:

{

x = other.x+12; y = other.y+12

if vspeed = -5 {vspeed = 0; hspeed = -5}

else if hspeed = 5 {hspeed = 0 vspeed = -5}

else if(vspeed = 5)||(hspeed = -5) {instance_destroy()}

break

}

case spr_lrocket4:

{

x = other.x+12; y = other.y+12

if vspeed = 5 {vspeed = 0; hspeed = 5}

else if hspeed = 5 {hspeed = 0 vspeed = 5}

else if(vspeed = -5)||(hspeed = -5) {instance_destroy()}

break

}

default: break

}

Wiele rzeczy w twoim kodzie powtarza się niepotrzebnie. Zerknij na funkcję dot_product i zastanów się, w jaki sposób pomoże ci załatwić ten problem w jednej-dwóch linijkach.

Odnośnik do komentarza
Udostępnij na innych stronach

Wiem, że mój kod jest... okropny, ale nie jest to głównym źródłem problemu. Później jeszcze pobawię się, żeby go skrócić, zoptymalizować i co się da. Spróbowałem zrobić plik z 2 obiektami w GM8 - działa. Później zimportowałem go do GMS - działa. Dodałem do nowego projektu wszystkie obiekty, sprite'y itd. jak w projekcie, w którym nie działało - działa... Sam nie wiem co pochrzaniłem. Dodaję projekty, może ktoś ogarnie, co zrobiłem źle i mnie oświeci :D

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