uzytkownik123 Opublikowano 3 Marca 2020 Udostępnij Opublikowano 3 Marca 2020 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 Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 3 Marca 2020 Administratorzy Udostępnij Opublikowano 3 Marca 2020 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 Więcej opcji udostępniania...
uzytkownik123 Opublikowano 5 Marca 2020 Autor Udostępnij Opublikowano 5 Marca 2020 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 Więcej opcji udostępniania...
HamsterMan Opublikowano 12 Marca 2020 Udostępnij Opublikowano 12 Marca 2020 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę