-
Postów
4 891 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
53
Typ zawartości
Profile
Forum
Wydarzenia
Treść opublikowana przez I am Lord
-
To ten online był w 2011 o kurde jaki szmat czasu
-
A to jakich rozmiarów jest ta textura?
-
A zrób tą texturę o jeden pixel wyższą i wtedy przenieś o jeden w górę cały obrazek tak by dolne pixele nie dotykały krawędzi obrazka
-
Wszyscy light i szybki rush
-
Jak masz ustawione jakieś precyzyjne maski kolizji to może obciążać bardzo mocno. place_meeting bazuje na porównywaniu masek ze sobą.
-
Ale szczyty fali są już jaśniejsze
-
Procedural Sprites Generator
I am Lord odpowiedział(a) na I am Lord temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Jedynym spritem jaki tutaj jest przy generacji brany to paleta kolorów w postaci paska z kolorowymi pikselami. Kształt jest generowany matematycznie, generowany jest szum i tekstura czarno-biała i szereg funkcji postprocesowych takich jak czyszczenie tekstury z luźnych pikseli, wygładzanie krawędzi, nakładanie outline -
Precyzyjna kolizja i platforma poruszająca się pionowo
I am Lord odpowiedział(a) na Temporal temat w Pytania początkujących
Może bezpośrednio przesuwaj 'y' gracza zamiast modyfikować jego prędkość -
Może jakaś wada softu, próbowałeś aktualizować system?
-
Pamiętam te testy w pierwszej wersji online w top down chyba jeszcze robione na GMie? Świetnie się grało
-
Tutaj dorzucę taką drobną informację bo zapewne @Ice Cube nie będzie wiedział. distance_to_point() które Gnysek podał zwraca odległość od punktu do najbliższej krawędzi bounding boxa obiektu zaś funkcja point_distance() którą także możesz tutaj użyć zwraca już odległość między jednym punktem a drugim.
-
Wow ta okładka Dune jest świetna
-
Poszukaj na tablicy albo rynku fb czy ktoś by nie chciał za darmo dać czy jakieś symboliczne 50 dych.
-
Widzę że na nic się zdał mój poprzedni wywód? Przeczytałeś to w ogóle? Był tam nawet przykład zarówno użycia collision_circle jak również użycia instance_nearest zarówno tym jak i drugim dałoby radę ten cel osiągnąć.
-
Czy GM domyślnie rysuje poza viewem?
I am Lord odpowiedział(a) na nowy_user temat w Pytania początkujących
Jeżeli rysujesz sprity ręcznie tak jak w tym przypadku to GM nie ingeruje w nie w żaden sposób a więc za viewem też się będą rysować. Tak po za tym wydaje mi się że chyba tylko backgroundy i tilesy poza viewem GM ukrywa ale to też tylko w tym przypadku gdy nie rysujesz ich ręcznie tylko np zostały postawione w roomie. -
"Soczyste pętle" to genialna nazwa dla programu muzycznego mi się bardzo podoba
-
Ustalenie kierunku bezkolizyjnego
I am Lord odpowiedział(a) na MaxGaming temat w Pytania początkujących
Ustal sobie jakąś promień twojego obiektu i na jego podstawie wystrzelisz 2 linie kolizji i sprawdzaj czy którakolwiek się z czymś zderzy. punkt ABCD obliczysz tak: ax = x+lengthdir_x(radius, dir-90) ay = y+lengthdir_y(radius, dir-90) bx = x+lengthdir_x(radius, dir+90) by = y+lengthdir_y(radius, dir+90) cx = ax + lengthdir_x(dystans, dir) cy = ay + lengthdir_y(dystans, dir) dx = bx + lengthdir_x(dystans, dir) dy = by + lengthdir_y(dystans, dir) Mogłem się pomylić bo nie przetestowałem -
A byście widzieli jakie oburzenie widziałem jakiś rok temu na chyba 9gagu czy czymś takim, jak ktoś wstawił dowód że hearthstone jest stworzony w Unity :DDD
-
Jeżeli chodzi o opinię graczy to jeszcze nie trafiłem na to by ktoś pisał jakieś hejty pod grą zrobioną z GMa chyba że jest kiepska. Za to spotkałem się z opiniami o unity że ludzie widząc to logo dają od razu refound na steamie albo innych hejterów który piszą recenzję negatywną i nakłaniają do zmienienia silnika na jakiegoś unreala czy coś zamiast unity. Negatywne opinie o GMie to ja widuję jedynie u jakiś urażonych polaczków pseudo gamedevów którzy nie mogą znieść tego że ktoś robi grę na gotowym silniku zamiast marnować całe życie na nauce wynajdowania koła na nowo tworząc własny silnik. Ale po co się tym przejmować? To nawet nie są gracze i nie twój target.
-
W GM8 masz takie specjalne menu w którym definiujesz sobie własne stałe (constant) i tam powpisuj: enID 0 enPunkty 1 a używać będziesz tego jak zwykłej zmiennej: gLevelsDat[numerLevelu, enID] = room_1; gLevelsDat[numerLevelu, enPunkty] = 50;
-
Tutaj przykładowo może się przydać stworzenie struktury z globalnej tablicy 2D na takiej zasadzie: enum eLevel {enID, enPunkty} globalvar gLevelsDat; gLevelsDat[numerLevelu, eLevel.enID] = room_1; gLevelsDat[numerLevelu, eLevel.enPunkty] = 50; pierwszy index tablicy gLevelsDat to będzie numer levelu czyli w twoim przypadku będzie to twój "global.level" drugi index tej tablicy to będzie odnośnik do tego jaką informację chcesz uzyskać, ja przygotowałem 2 informacje bo tyle na ten moment potrzebujesz (ale będziesz mógł to łatwo rozbudować sobie dopisując więcej rzeczy w tym enumie w 1 linice). Informacja pierwsza to id rooma, a informacja druga to liczba twoich punktów do uzyskania na nim. Najlepiej by było gdybyś stworzył sobie w twoim pierwszym roomie taką strukturę w jakimś obiekcie w create. Dla przykładu wyglądałoby to tak: enum eLevel {enID, enPunkty} globalvar gLevelsDat; var numerLevelu = 0; gLevelsDat[numerLevelu, eLevel.enID] = room_1; gLevelsDat[numerLevelu, eLevel.enPunkty] = 50; numerLevelu++; gLevelsDat[numerLevelu, eLevel.enID] = room_2; gLevelsDat[numerLevelu, eLevel.enPunkty] = 25; numerLevelu++; gLevelsDat[numerLevelu, eLevel.enID] = room_3; gLevelsDat[numerLevelu, eLevel.enPunkty] = 75; numerLevelu++; gLevelsDat[numerLevelu, eLevel.enID] = room_4; gLevelsDat[numerLevelu, eLevel.enPunkty] = 100; numerLevelu++; gLevelsDat[numerLevelu, eLevel.enID] = room_5; gLevelsDat[numerLevelu, eLevel.enPunkty] = 65; numerLevelu++; gLevelsDat[numerLevelu, eLevel.enID] = room_6; gLevelsDat[numerLevelu, eLevel.enPunkty] = 150; // i tak dalej No i gdy taką strukturkę już sobie stworzysz to potem możesz w swoim przejściowym roomie jej użyć w taki sposób: bazując na twojej zasadzie "If global.level=1 and klikamy enter { goto_room 1 i global.punkty=200} itd. dla 50 leveli" if ( keyboard_check_pressed(vk_enter) ) { global.punkty = gLevelsDat[global.level, eLevel.enPunkty]; room_goto(gLevelsDat[global.level, eLevel.enID]); } Takie rozwiązanie może się początkowo tobie wydawać skomplikowane ale to daje fajną elastyczność bo gdybyś np chciał dodatko kiedyś ustawić by każdy level miał np określoną ilość przeciwników do zabicia aby go przejść no to w prosty sposób moją strukturę rozbudujesz: enum eLevel {enID, enPunkty, enKille} globalvar gLevelsDat; gLevelsDat[numerLevelu, eLevel.enID] = room_1; gLevelsDat[numerLevelu, eLevel.enPunkty] = 50; gLevelsDat[numerLevelu, eLevel.enKille] = 8; i potem w roomie przejściowym: if ( keyboard_check_pressed(vk_enter) ) { global.punkty = gLevelsDat[global.level, eLevel.enPunkty]; global.wymaganeKille = gLevelsDat[global.level, eLevel.enKille]; room_goto(gLevelsDat[global.level, eLevel.enID]); } itd.
-
Fakt, niepotrzebnie wspomniałem o self bo sam go nie użyłem ani razu w życiu Także nim sobie głowy nie zaprzątaj.
-
w = 15 będzie dotyczyć obj_pocisku W każdym event collision other oznacza id instancji z którą się zderzyłeś
-
Tak to ta gra
-
No to się robi Różnie można adresować, to też zależy w którym evencie to robisz. Ogólnie są dwie formy adresowania, pierwsza formą jest adresowanie podając pojedynczą kropkę a druga forma to użycie keyword with W obu przypadkach podajesz nazwę obiektu albo id instancji albo keyword other/self np: obj_mojObiekt.z inst_4DB70D2.z // (w GMS2) (100012).z // (w GMS1 i niżej) other.z self.z za pomocą formy obj_mojObiekt.z odnosisz się do wszystkich instancji o nazwie podanego obiektu, dlatego w tej formie jest to mało użyteczne. Bo gdybyś chciał odczytać zmienną 'z' to odczytałoby ci zmienną z instancji o największym id ze wszystkich obiektów tej nazwy dlatego że GM próbował by kolejno 'zaglądać' do każdej takiej instancji więc nadpisywał by wynik tak długo aż zostanie mu ostatnia i zwróci wartość właśnie tej ostatniej instancji. Ta forma ma większy użytek gdy chcesz zmienić zmienną we wszystkich obiektach tej nazwy jednocześnie np: obj_mojObiekt.z = 100 // i teraz każdy obiekt obj_mojObiekt ma 'z' o wartosci 100 to samo działanie z użyciem with wygląda następująco: with (obj_mojObiekt) { z = 100 } gdybyś jednak chciał użyć with do odczytania zmiennej 'z' to sprawa się komplikuje, zrobiłbyś to na dwa sposoby: // sposób pierwszy var tymczasowaZmienna; with (obj_mojObiekt) { tymczasowaZmienna = z } show_debug_message(tymczasowaZmienna) // konsola wyswietli wartość 'z' // sposób drugi jakasZmiennaLokalna = 0 with (obj_mojObiekt) { other.jakasZmiennaLokalna = z } // przypisałeś wartość zmiennej jakasZmiennaLokalna do wartosci 'z' obiektu obj_mojObiekt Jednak to tylko jest mało użyteczne adresowanie po nazwie obiektu, dużo bardziej użyteczne jest adresowanie bezpośrednio po id instancji ale takie id najpierw trzeba znać. Musisz sobie zwracać uwagę na to jakie funkcje zwracają id instancji, do tych najpopularniejszych należą instance_create(x, y, obj); instance_create_depth(x, y, depth, obj); // tylko dla GMS2 instance_create_layer(x, y, layer_id, obj); // tylko dla GMS2 instance_nearest(x, y, obj); // grupa funkcji z kolizji wykrywania kolizji: collision_*(); // np. collision_circle( x1, y1, rad, obj, prec, notme ); Tak więc, podam kilka praktycznych przykładów: 1. // EVENT STEP var ID; ID = instance_nearest(x, y, obj_skrzynka); show_debug_message(ID.z) // konsola zacznie wyświetlać wartość 'z' skrzynki do której jesteś najbliżej 2. // EVENT STEP var ID; ID = collision_circle( x, y, 128, obj_skrzynka, 0, true ); if (ID != noone) { show_debug_message(ID.z) // konsola zacznie wyświetlać wartość 'z' skrzynki która jest w zasięgu okręgu } /* ten if jest tutaj potrzebny poniważ funkcje collision_* zwracają także keyword noone w przypadku gdy do kolizji nie dojdzie w dodatku gdy w zasięgu jest więcej skrzynek to odczyta wartość z instancji o najwyższym id czyli tego obiektu który ostatni nadpisze zmienną ID*/ 3. // EVENT PRZYCISKU STRZAŁU var ID; ID = instance_create(x, y, obj_bullet); ID.z = z+64; /* nowo utworzona instancja obiektu pocisków: obj_bullet będzie miała na start przypisaną wartość 'z' do wartości 'z' gracza + wysokość gdzie znajduje się pistolet*/ Kolejną najciekawszą sprawą adresowania zmiennych jest użycie keywordu other Jak mogłeś wcześniej zobaczyć, użyłem słówka other wewnątrz with, w tym przypadku other będzie miało wartość id instancji z którego wywołujesz with. Jednak gdyby użyć other w którymś z eventów kolizji to wtedy other przyjmuje wartość id instancji z którą kolizja nastąpiła i tutaj mogę np podać przykład niszczenia się pocisku o ścianę z którą się zderza, będzie to wyglądało tak: // EVENT COLLISION WITH obj_sciana if (z > other.z && z <other.z+other.wysokosc_sciany) { instance_destroy(); }