Skocz do zawartości

problem z pociskiem


Rekomendowane odpowiedzi

Pomóżcie, bo ostatnio przesiadłem z GM8 na GMS1.4 i zgłupiałem

taki kod dawałem zawsze w pocisku, w razie gdyby kolidował z przeciwnikiem więcej niż przez 1 step (żeby ranił wroga tylko 1 raz)

 

if place_meeting(x,y,obj_wrog) and !ostatnicel=obj_wrog.id
{obj_wrog.hp-=damage
ostatnicel=obj_wrog.id}

i działało. W GM1.4 nie działa. Podzieliłem na 2 części - obrażenia w begin step, ostatnicel=obj_wrog.id w end step. dalej nie działa. co jest nie tak?

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Jeśli są dwa obj_wrog, to zawsze zwraca ID tego stworzonego jako pierwszego w tym przypadku, więc gdy kolizja jest z drugim to i tak zapamiętuje pierwszego. Musisz użyć bodaj instance_place() aby dostać konkretne ID, a nie pierwszego stworzonego obj_wrog w roomie.

 

Ja generalnie polecam użyć eventu kolizji, wtedy masz pod other ten obiekt z którym jest kolizja i możesz dać ostatnicel = other.id :)

Odnośnik do komentarza
Udostępnij na innych stronach

znaczy mam jeszcze tak:

obj_wrog=instance_nearest(x,y,wrog)

 

bez warunku ostatnicel=obj_wrog.id zadaje obrażenia, ale jak tylko go dodam to już nie i nie wiem dlaczego?

 

Dnia 3.03.2020 o 23:35, gnysek napisał:

Jeśli są dwa obj_wrog, to zawsze zwraca ID tego stworzonego jako pierwszego w tym przypadku, więc gdy kolizja jest z drugim to i tak zapamiętuje pierwszego.

czyli powinien zadawać obrażenia i tak.

 

czy GMS wykonuje kod tak samo jak GM8? czyli wierszami po kolei czy jakoś inaczej?

 

albo jak zrobić to jakoś inaczej. pocisk ma speed 0.5 i żeby ranił tylko raz każdego przeciwnika przez którego przelatuje?

 

poszło w drugą stronę: wróg podczas kolizji bada wartość "pocisk", jeśli <other.id {hp-=other.damage pocisk=other.id}

ale czemu na odwrót nie działało to nie mam pojęcia

Odnośnik do komentarza
Udostępnij na innych stronach

Zaburzyłeś równowagę 4 wymiarów poprzez używanie klasy (id do resource typu `Object`) jako referencji do obiektu. Lista twoich code smells:

  • odwołanie się przez klasę (asset_object) żeby otrzymać referencję obiektu,
  • operator przypisania użyty w statement zamiast operatora porównania,
  • zastosowanie operatora && w formie keyword `and',
  • formatowanie niezgodne z niczym,
  • if statements nie opakowane w nawiasy,
  • polskie nazwy zmiennych.

Najprościej będzie, jeżeli w ramach sprawdzania kolizji znajdziesz sobie taką funkcję z API, która zwróci Ci referencję do obiektu. W dokumentacji znajdziemy `instance_place`:

 

///@description Step Event

   var enemy = instance_place(x, y, obj_wrog);
   if (enemy != noone) {
      // nie warto łączyć tych dwóch ifów. Jeden załatwia sprawę Optionala a drugi to juz logika biznesowa, czyli nie związane ze sobą rzeczy.
      if (ostatnicel != enemy.id) { //samo enemy jest juz id, ale taki zapis jest not cool, dlatego .id
         enemy.hp -= damage; // mozemy uzyc takiego bezposredniego settera, bo przez instance_place upewnilismy sie, ze otrzymamy obiekt klasy `obj_wrog`, ktory ma pole `hp`. Ale generalnie to jest smrut i przez takie rzeczy Ci może nie zadzialac np YYC.
         ostatnicel = enemy.id;
      }
   }

Niby cool, ale jednak nie, jak cały object pooling w GM  a co jeżeli mamy kilka obiektów w tej samej "pozycji"  Wtedy instance_place_list.
 

///@description Create Event

   ///@type List<?GMInstance>
   ///@private
   enemyPlaceList = ds_list_create(); // dla "wydajności" (bo w tym przypadku nie ma roznicy) można mieć zaalokowana jedna liste i jej ponownie uzywac...

///@description Step Event

   ds_list_clear(enemyPlaceList); // ...ale jak kazde mutowanie, rodzi to taki smrut, ze teraz musisz pamietać o clear...
   var enemyPlaceListSize = instance_place_list(x, y, obj_wrog, enemyPlaceList, false); // ostatni argument - zobacz w dokumentacji co oznacza
   for (var index = 0; index < enemyPlaceListSize; index++) {
      var enemy = enemyPlaceList[| index];
      if (ostatnicel != enemy.id) {
         enemy.hp -= damage;
         ostatnicel = enemy.id;
         break;
      }
   }

///@description Clean up Event

   ds_list_destroy(enemyPlaceList) // ...no i musisz pamietac o tym, bo nie przyjedzie GarbageCollector 

 

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