-
Postów
2 728 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
44
Typ zawartości
Profile
Forum
Wydarzenia
Treść opublikowana przez Konrad-GM
-
GameMaker Studio 1 już od dawna nie jest na sprzedaży z tego co się orientuję, ale GMS2 nie powinien mieć większego problemu do importu starszych projektów. IMO najlepsza strona skąd można pobrać GMS2 bez wirusów ani innych trojanów to - https://www.yoyogames.com/get
-
Nikt raczej nie bawi się w takie rzeczy, bo jest to po prostu nieopłacalne/mega brzydkie w rozwiązaniu. Ale zawsze możesz nagrać filmik chociażby GifCamem i zapisać sobie jako gif - http://blog.bahraniapps.com/gifcam/
-
Też nie polecam nagrywania wideo i potem odgrywania tego w grze jako klatki Sprite, w najlepszym przypadku zawalisz pamięć VRAM. Na Marketplace jest kilka rozszerzeń, które służą do odtwarzania video w GMie, może znajdziesz coś co Ci będzie odpowiadać - https://marketplace.yoyogames.com/search/results?utf8=✓&query=video+playback
-
Zgodnie ze sztuką, to powinieneś zacząć od: 1. Rysowania wszystkich obiektów które nie są w żaden sposób przezroczyste-półprzezroczyste. 2. Rysujesz przezroczyste/pół-przezroczyste obiekty względem ich odległości od kamery, od najdalszego sprite do najbliższego. Możesz manipulować zmienną depth, żeby otrzymać dość zadowalający efekt. Co prawda problem będziesz miał z ogrodzeniem np., bo może być szersze niż sprite wroga a wtedy mogą i tak nachodzić na siebie bo będziesz liczył odległości od ich środka. Więc możesz podzielić to dodatkowo aby postacie rysować zawsze na końcu, ale też względem odległości od kamery. Tutaj zaczyna się zabawa Dla nie-przezroczystych ścian rysuj je na początku, daj im wysoki depth, np. `depth = 10000`. Następnie rysując pół-przezroczyste ogrodzenie odlicz im depth od odległości od kamery i dodaj jakieś przesunięcie (żeby jednak rysować postacie na końcu), cos a'la `depth = point_distance(camera.x, camera.y, self.x, self.y) + 5000`, a na końcu rysując postacie ustaw im depth już bez przesunięcia `depth=point_distance(camera.x, camera.y, self.x, self.y)` E: Chociaż nie, jak będziesz ogrodzenie rysować to Ci i tak zasłoni bohaterów, może jednak przydzielaj depth każdemu pół-przezroczystemu obiektowi w ten sam sposób: `depth=point_distance(camera.x, camera.y, self.x, self.y)` i nie rób za dużych ogrodzeń.
-
Usunąć kanał alpha ze spritów. Ale wtedy będą to kloce a nie kształtne babeczki. Źle przydzielasz depth, bo gdybyś odwrócił kolejność rysowania to powinno działać. To naucz się żyć z blendingiem brzegów z przezroczystymi pikselami. Dokładnie, to jest ten sam problem co z blendingiem i interpolacją pikseli. Możesz spróbować shader napisać, który discardowałby Ci półprzezroczyste piksele. Ale żaden program do obróbki grafiki Ci tego nie naprawi, bo to nie w tym problem. E: GameMaker też ma opcję usuwania półprzezroczystych pikseli, opisane jest to tutaj: https://help.yoyogames.com/hc/en-us/articles/216754778-Optimizing-Your-Games Dokładniej chodzi o funkcje tj. draw_set_alpha_test, draw_set_alpha_test_ref_value
-
Tak działa mieszanie pół-przezroczystych obiektów, jeżeli rysujesz je w pierwszej kolejności. Spróbuj ustawić sprite-owi niższy depth (np. -1), żeby najpierw rysować ściany. Możesz też wyłączyć interpolację, wtedy brzegi nie będą mieszać się z sąsiadującymi, przezroczystymi pikselami.
-
Zastrzeżenie tytułu gry oraz scenariusza gry jak i logo firmowe
Konrad-GM odpowiedział(a) na pankracy temat w GM:Studio 1.x
Nie jestem prawnikiem, ale z tego co wiem to prawa autorskie do swojej gry masz już na starcie, o ile nie używasz kodu (bądź jego części) ani assetów, które były redystrybuowane pod inną licencją - wtedy musisz uzgadniać szczegóły z autorami kodu/assetów. Rejestracja firmy jak i logo firmy to już oddzielny temat i IMO jak dopiero zaczynasz prowadzić działalność to nie ma co sobie tym głowy zaprzątać - na początek zarejestruj firmę i zdobądź pieniądze żeby zainwestować w rejestrację patentów A co do rejestracji scenariusza gry, czy jego świata to nie mam pojęcia, pewnie też w urzędzie patentowym musiałbyś to załatwić. -
Na szczęście od GM:S już to poprawili.
-
Zapis pliku z wcześniej stworzonej ścieżki
Konrad-GM odpowiedział(a) na nowy_user temat w Pytania początkujących
A czy zapis/odczyt pliku nie jest przypadkiem synchroniczny? BTW. Często też widziałem metodę, która chroniła stary zapis gry tworząc plik tymczasowy na czas zapisu i dopiero po wykonaniu zapisu usuwał stary plik i podmieniał nazwy. -
To może znajdź, na którym etapie występuje u Ciebie ten problem, potem staraj się go naprawić. BTW. Zapisujesz tekst w bazie, musisz się upewnić, że format JSONa też jest poprawny. Edit. Albo timeout dostajesz od serwera, albo za mało pamięci masz przypisane do Nginxa/Apache i też przerywa połączenie. Sprawdź to Postmanem albo w przeglądarce (musisz formularz POST stworzyć, albo przerób skrypt na GETy), czy to samo dostajesz.
-
A zrób requesta Postmanem i upewnij się, czy Ci ten skrypt zwraca całość tekstu i go nie ucina, to wtedy będzie ewidentnie gdzieś problem po stronie GMa. Raczej ten kod echo json_encode($response); Nie powinien powodować ucinania znaków, ale możesz na wszelki wypadek sprawdzić to funkcją json_last_error_msg.
-
Cześć, a dostajesz jakiś błąd, czy string jest niepełny? Jakiego typu jest to pole do którego zapisujesz jsona?
-
Co do zapętlania animacji, to jak @gnysek wspomniał już, GM je zapętla bo tak działa w nim animacja Może dodaj limit jakiś na image_index, np. coś takiego: if zegarAtaku > 0 && atakBierzacy == 0 { sprite_index = spr_player_attack; image_speed = 0; image_index = clamp(89-(zegarAtaku), 0, 89); zegarAtaku -= 0.5; } Co do drugiego problemu, to może spróbuj warunkowo clamp-ować image_index: if wPowietrzu == true && drabina == false { sprite_index = spr_player_air; var cmin = 0, cmax = 0; if vspd <= -1 { cmin = 0; cmax = 5; } else if vspd >= 1 { cmin = 5; cmax = 10; } else { cmin = 5; cmax = 5; } klatkaAnimWPowietrzu = clamp(klatkaAnimWPowietrzu + 0.5, cmin, cmax); image_index = klatkaAnimWPowietrzu; } Dodałem zmienną klatkaAnimWPowietrzu to musisz ją dać w Create i resetować (klatkaAnimWPowietrzu = 0) zawsze przy skakaniu.
-
Też nie miałem czasu nawet zacząć, mam tylko rozplanowane co chciałem zrobić, ale prawie nic okodowane. Głównie teraz praca czas mi zabiera, ale jak będzie 2nd edycja to odświeżę swój pomysł pewnie
-
dopasowanie textboxa do rozmiaru kilku view
Konrad-GM odpowiedział(a) na pankracy temat w Pytania zaawansowanych
A może wystarczy vy + view_hview - 120 + 5 -
dopasowanie textboxa do rozmiaru kilku view
Konrad-GM odpowiedział(a) na pankracy temat w Pytania zaawansowanych
draw_rectangle(view_xview + 10, (view_yview + view_hview) - 120, (view_xview + view_wview) - 10, (view_yview + view_hview) - 30, false); Rozłóżmy tę funkcję na parametry: view_xview + 10 to parametr liczący nam od lewej krawędzi ekranu + 10 pikseli (view_yview + view_hview) - 120 ten parametr liczy nam już od dolnej krawędzi ekranu - 120px (view_xview + view_wview) - 10 ten parametr teraz liczy nam od prawej krawędzi ekranu - 10px (view_yview + view_hview) - 30 a ten parametr już liczy nam ponownie od dolnej krawędzi ekranu - 30px false po prostu rysuje nam pełny prostokąt A teraz funkcję na rysowanie tekstu: draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596); Rozbijemy na: vx+12 liczymy pozycję tekstu od lewej krawędzi ekranu + 12px vy+586-20-100-2 liczymy pozycję tekstu od górnej krawędzi ekranu + 586px - 20px - 100px - 2px, w skrócie + 464px string_copy(string(text),1,round(leght)) zapewne kasujesz nadmiar tekstu, nie wiem ale to nie wpływa na pozycję tekstu a jego długość -1 odległości pomiędzy liniami w pikselach 596 przesunięcie tekstu do następnej linii gdy przekroczy ono tę długość Teraz przyjrzyj się parametrom i zauważ, że liczysz pozycję tekstu od górnej krawędzi ekranu, a nie powinieneś tego robić, policz pozycję od dolnej krawędzi ekranu jak w pierwszym przypadku. Poczekaj aż będzie Ci przełamywać tekst w ramce za wcześnie, to dopiero mind fcuk. -
dopasowanie textboxa do rozmiaru kilku view
Konrad-GM odpowiedział(a) na pankracy temat w Pytania zaawansowanych
Ale to nie ma żadnego znaczenia, skoro tylko obsługuje Ci jeden przypadek. Musisz też obliczyć pozycję tekstu od wysokości ekranu, a nie od górnej jego krawędzi. -
dopasowanie textboxa do rozmiaru kilku view
Konrad-GM odpowiedział(a) na pankracy temat w Pytania zaawansowanych
Zauważ, że ten kod: draw_rectangle(view_xview + 10, (view_yview + view_hview) - 120, (view_xview + view_wview) - 10, (view_yview + view_hview) - 30, false); A ten kod: draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596); Inaczej liczą Ci pozycje, bo drugi kod ma kompletnie gdzieś wysokość i szerokość ekranu. -
dopasowanie textboxa do rozmiaru kilku view
Konrad-GM odpowiedział(a) na pankracy temat w Pytania zaawansowanych
No bo jak ma Ci to działać, skoro tekst dalej rysujesz w ten sam sposób? Nic z tym nie zrobiłeś to się nie dziw, że Ci nie działa W linii: draw_text_ext(vx+12,vy+586-20-100-2,string_copy(string(text),1,round(leght)),-1,596); Popraw pozycjonowanie tekstu razem z ramką. -
dopasowanie textboxa do rozmiaru kilku view
Konrad-GM odpowiedział(a) na pankracy temat w Pytania zaawansowanych
Albo użyj funkcji display_set_gui_size i ustaw tam stałą wartości dla np. 1024x600, albo zamiast na stałe ustawiać pozycję jak np. draw_rectangle(30, 400, 994, 570, false) to przelicz pozycję od ramek ekranu, np. używając display_get_gui_width i display_get_gui_height, coś takiego: var w = display_get_gui_width(); var h = display_get_gui_height(); var x1 = 30; var y1 = h - 230; var x2 = w - 30; var y2 = h - 30; draw_rectangle(x1, y1, x2, y2, false); -
Tworzenie i edycja zagnieżdżonych zasobów (REST-podobnych)
Konrad-GM odpowiedział(a) na Konrad-GM temat w HTML, PHP, mySQL, JavaScript
Racja, nie mam możliwości żeby w backendzie coś zmienić teraz, dlatego pozostanę przy tej opcji z tworzeniem sekwencji requestów i dodam jakiś modal w razie problemów. Ale chyba tak zrobię jak proponujesz, dodam przycisk np. "Renew save" w modalu "Failed to save survey" Ok, stworzyłem w TS generic "diff" modeli. kompletnie pomija mi pozycje elementów w tablicy, ale chyba na moje potrzeby będzie działać ok. export enum DiffResultAction { Create = 'create', Update = 'update', Delete = 'delete' } export interface DiffResult<T> { action: DiffResultAction; from: T; to: T; } export function diff<T>(from: T[], to: T[], hasSameId: (from: T, to: T) => boolean): DiffResult<T>[] { return to.map(dest => diffElement(dest, from, hasSameId)).concat(diffReduce(from, to, hasSameId)); } function diffElement<T>(dest: T, sourceArray: T[], hasSameId: (from: T, to: T) => boolean): DiffResult<T> { const foundElement = sourceArray.find(element => hasSameId(element, dest)); if (foundElement) { return { action: DiffResultAction.Update, from: foundElement, to: dest }; } else { return { action: DiffResultAction.Create, from: null, to: dest }; } } function diffReduce<T>(from: T[], to: T[], hasSameId: (from: T, to: T) => boolean): DiffResult<T>[] { return from.filter(source => !to.some(dest => hasSameId(source, dest))).map<DiffResult<T>>( removedElement => ({ action: DiffResultAction.Delete, from: removedElement, to: null }) ); } -
Tworzenie i edycja zagnieżdżonych zasobów (REST-podobnych)
Konrad-GM odpowiedział(a) na Konrad-GM temat w HTML, PHP, mySQL, JavaScript
Hej @gnysek dzięki za odpowiedź. Problem z rozpoznawaniem zasobu po GUID rozwiązuje mi posiadane przez każdy zasób ID wygenerowany AUTO_INCREMENT-em już po stronie serwera, więc chyba zastosuję się do Twojej propozycji i będę trackował zmiany po ID tych zasobów zamiast pozycji jak w `diff`. W zasadzie wtedy nowe elementy mogę też identyfikować po tym, że ID mają ustawione na 0. Kolejność zasobów też mam w bazie oznaczone polem 'order' więc w jakiej kolejności będę aktualizował same dane to chyba też bez znaczenia, bo nie muszę znać kolejności zasobów na serwerze a jedynie ustawiać pole `order`. Tylko tutaj stworzenie jakiejś metody generic diff chyba odpada, bo nie każdy model danych może mieć pole o nazwie `id`. może jakaś lambda/arrow function jako parametr by ten problem rozwiązała. Generalnie rozbiłem też trochę swój problem na mniejsze elementy, bo sprawdzam `diff`em tylko Pytania i tworzę RxJS-em obserwatory, do każdego zasobu Pytanie dołączam drugi `diff` ale już dla modyfikacji zasobów Odpowiedzi i łączę je do tego samego strumienia obserwatora RxJS co zasób Pytanie. Stąd mi też będzie trzymać kolejność wykonywanych requestów. Tylko, że problem z tym jest taki, że w razie jakby w połowie przesyłania danych coś się nie udało wysłać, np. serwer odrzuci któryś request POST, PATCH, czy DELETE, to wtedy przerwie mi zmiany w połowie aktualizacji. Będę musiał to pewnie rozwiązać jeszcze implementując jakiś mechanizm obsługi błędów który wznawiałby przerwane requesty -
Tworzenie i edycja zagnieżdżonych zasobów (REST-podobnych)
Konrad-GM opublikował(a) temat w HTML, PHP, mySQL, JavaScript
Cześć, mam pewien problem z tworzeniem a zwłaszcza edycją zagnieżdżonych zasobów w usłudze podobnej do RESTa. Otóż tworzę pewien panel z podstawowymi funkcjami CRUD, w którym mam zagnieżdżone zasoby, które to wyglądają mniej-więcej tak: Ankieta <1-N> Pytanie <1-N> Odpowiedź Gdzie <1-N> to relacja 1 do wielu. I mój problem polega na tym, że tworzę formularz: [Tytuł] [Opis] [Pytanie[]] - [Odpowiedź[]] - [Odpowiedź[]] - [Odpowiedź[]] [Pytanie[]] - [Odpowiedź[]] - [Odpowiedź[]] itd. I przy tworzeniu to jest ok, wysyłam najpierw Ankietę, dostaję ID zasobu, tworzę kolejne zasoby - pytanie i dostaję kolejne ID zasobów a na koniec tworzę odpowiedzi, następne pytanie itd. a wygląda to tak: (ANKIETA => SERWER) [SERWER => ANKIETA => ZAPISZ DO ZMIENNEJ] (PYTANIE => SERWER) [SERWER => PYTANIE => ZAPISZ DO ZMIENNEJ] (ODPOWIEDŻ => SERWER) [SERWER => ODPOWIEDŹ => ZAPISZ DO ZMIENNEJ] (ODPOWIEDŻ => SERWER) [SERWER => ODPOWIEDŹ => ZAPISZ DO ZMIENNEJ] (ODPOWIEDŻ => SERWER) [SERWER => ODPOWIEDŹ => ZAPISZ DO ZMIENNEJ] (PYTANIE => SERWER) [SERWER => PYTANIE => ZAPISZ DO ZMIENNEJ] (ODPOWIEDŻ => SERWER) [SERWER => ODPOWIEDŹ => ZAPISZ DO ZMIENNEJ] (ODPOWIEDŻ => SERWER) [SERWER => ODPOWIEDŹ => ZAPISZ DO ZMIENNEJ] Gdzie (...) to request, a [...] to response. Teraz mam problem przy edytowaniu takich zasobów, otóż dodam kilka pytań, odpowiedzi, niektóre usunę i muszę potem przeszukać starą listę i nową, tworząc tak jakby `diff` zmian, np.: {action: "select", type: "survey", from: {...MODEL ANKIETY}} {action: "remove", type: "question", from: {...MODEL PYTANIA}} {action: "remove", type: "question", from: {...MODEL PYTANIA}} {action: "add", type: "question", from: null, to: {...NOWY MODEL PYTANIA}} {action: "update", type: "question", from: {...MODEL PYTANIA}, to: {...NOWY MODEL PYTANIA}} {action: "select", type: "question", from: {...MODEL PYTANIA}} {action: "add", type: "answer", from: null, to: {...NOWY MODEL ODPOWIEDZI}} Tylko, ze to wygląda mega skomplikowanie i ciężko potem wprowadzać modyfikacje czy nawet debuggować w razie problemów. Czy ktoś może pomóc mi z rozwiązaniem takiego problemu z designem? Może z doświadczenia ktoś zna rozwiązanie, albo po prostu ma pomysł jak z takim czymś sobie poradzić. Dzięki. -
Przycinki w HTML5 ale FPS jest ok
Konrad-GM odpowiedział(a) na nowy_user temat w Pytania początkujących
Zwiększ FPS do np. 60 klatek, standardowo requestAnimationFrame-owy FPS działa z szybkością taktowania ekranu (z v-syncem). Możliwe, że 30 FPS powoduje u Ciebie odczucie lagowania. -
Bohater jak zginie za szybko pokazany jest wynik w highscore
Konrad-GM odpowiedział(a) na pankracy temat w Pytania zaawansowanych
Ale jeżeli dotkniesz jakiś obiekt, to Collision Event też wykonuje się co Step. Z obiektami obj_hazzard np. kolce to z tego co widzę robisz instance_destroy, to ok, wykona się tylko raz. Ale jak przerzucisz to do obj_enemy to tutaj musisz jeszcze sprawdzać, czy global.hp jest mniejsze równe 0 i też dopiero usunąć obiekt instance_destroy.