Skocz do zawartości

Tylko jeden cios


Morro

Rekomendowane odpowiedzi

Coś próbowałem wyszukiwać, ale nie mogłem znaleźć rozwiązania.

 

A więc, gracz przy uderzaniu tworzy obiekt, który ma za zadanie odebrać hp wrogom. Chciałbym, żeby jeden taki obiekt mógł zmniejszyć to hp tylko raz. Coś kombinowałem z pobieraniem ID obiektu kolizji, mógłbym nawet zrobić to na alarmie (po oberwaniu miałby np. półsekundowe immunity) ale przewiduję wiele tych obiektów atakujących naraz/w krótkich odstępach czasowych co nie spełniłoby moich oczekiwań. Usuwanie obiektu nie wchodzi w grę, bo jednym ciosem powinno być możliwe powalenie wielu wrogów.

 

A więc jak się za to zabrać?

 

tl;dr

Odnośnik do komentarza
Udostępnij na innych stronach

robisz w create

trafionych=-1

 

a przy trafieniu

 

GML
var moge_go_walnac;

moge_go_walnac=1

if trafionych>-1{

for(i=0;i<=trafionych;i+=1)

if trafiony=if tego co chcesz go walnac{

moge_go_walnac=0

break;

}

}

}

if moge_go_walnac{

trafionych+=1

trafiony[trafionych]=id tego co chcesz go walnac

}

 

e: sorry, zarżnie sie jak trafionych=-1

Odnośnik do komentarza
Udostępnij na innych stronach

Analizując ten kod już widzę, że nie będzie zamierzonego efektu. Po pierwsze właśnie chcę się dowiedzieć jak otrzymać ID trafionego obiektu, albo obiektu trafiającego (nawet byłoby lepiej). Wtedy w kolizji sprawdzałbym, czy dany obiekt o takim ID (których będzie wiele) już trafił raz i jeśli nie, odejmowałby hp.

Odnośnik do komentarza
Udostępnij na innych stronach

GML
var a;

a=place_meeting(x,y,o_swing)

 

//for (i=0;i<=10;i+=1)

//{

if traf!=a

{

hp-=1

traf=a

 

}

//}</span>

 

Z forem krzaczy

Error in code at line 9:

if traf!=a

^

at position 9: Unknown variable traf or array index out of bounds

 

Bez fora jak wiadomo odejmuje tylko raz, nie wiem dlaczego wyskakuje ten błąd. Nie wiem w ogóle jak to ugryźć.

Odnośnik do komentarza
Udostępnij na innych stronach

proste, krzaczy, bo nie ma zmiennej(nie zainicjowales jej) dlatego musisz miec zmienna od ilosci trafionych i w forze w drugim arg. jej uzyc

GML
create:

trafionych=-1

 

trafienie:

 

var a,tak;

a=place_meeting(x,y,o_swing)

tak=1//czyli czy cie juz trafil, czy nie

for (i=0;i<=trafionych;i+=1){

if traf=a{//jesli cie juz trafial

tak=0

break;

}

}

if tak{

trafionych+=1

traf[trafionych]=a

hp-=1

}

Odnośnik do komentarza
Udostępnij na innych stronach

Zmienna była zadeklarowana, potrafię przeczytać co wysypuje warnlog i właśnie to mnie dziwiło, dlaczego wysypuje

GML
var a,tak;

a=place_meeting(x,y,o_swing)

tak=1

 

for (i=0;i<=trafionych;i+=1)

{

if traf=a

{

tak=0

break;

}

}

 

if tak

{

trafionych+=1

traf[trafionych]=a

hp-=1

}

W każdym razie tutaj nie wywala już błędu, problem polega na tym, że hp odejmuje tylko raz

Odnośnik do komentarza
Udostępnij na innych stronach

No i tak jest. Tylko jak atakuje więcej razy (też tworzy się ten sam obiekt) to powinien przecież tracić hp za każdym razem, id nowych obiektów chyba jest inne. Dlatego myślę, że problem jest z pobranym ID obiektu.

 

K, sytuacja wygląda tak: atakuję, wróg obrywa, traci hp; atakuję ponownie, wróg obrywa ale nie traci już hp.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, przeczytałem, że place_meeting zwraca tylko wartość true albo false. Wystarczyło zmienić

GML
a=place_meeting(x,y,o_swing)

na

GML
a=collision_point(x,y,o_swing,1,1)

i pięknie zwraca ID obiektu (czyli odejmuje hp jak należy)

 

Dzięki wielkie, nie zamykam, może się komuś przyda.

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