Skocz do zawartości

Konrad-GM

Użytkownicy
  • Postów

    2 728
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    44

Treść opublikowana przez Konrad-GM

  1. Dlatego nie ustawiaj tej wartości w create Wiesz w ogóle do czego służy blok with i dlaczego właśnie tam ustawiasz hspd i vspd instancji par_entity? Czy nagle wszystkie obiekty na ekranie skaczą wraz z graczem?
  2. Ale nie dziedziczą tych samych stanów, każda instancja tworzy własną wersję zmiennej `g` (jedynie na podstawie obiektu par_entity).
  3. A to zmienna `g` jest zmienną globalną?
  4. W takim razie musisz dodać Alarm w obiekcie obj_trampolina, np. dodaj zdarzenie Alarm[0] i w nim wstaw blok kodu resetujący flagę `start = false`. Generalnie polega to na tym, że teraz Animation End nas nie interesuje, tylko czas, więc w Animation End możesz zatrzymać animację `image_speed = 0` ale nie zmieniaj flagi `start` - to zrobi Alarm[0] po 5 sekundach. No ok, ale teraz ustawiasz zmienną `g = 0.5` w instancji obj_trampolina, zamiast w par_entity, dlatego to nie zadziała. Ustaw grawitację w instancji par_entity, przecież od tego masz blok `with instance_place(x,y,par_entity)` który tak jak hspd i vspd ustawi również zmienną `g` tylko wyłącznie w instancji par_entity dotykającej trampoliny. Natomiast resetować grawitację musisz w kodzie par_entity, bo obj_trampolina nie ma pojęcia o stanie obiektu par_entity po X czasie, jak np. czy po dwóch sekundach par_entity stoi na ziemi, czy jeszcze fruwa. Dodatkowo w bloku `if place_meeting(x,y,par_entity)` (ale nie w `with instance_place(x,y,par_entity)`) ustawiaj Alarm, jeżeli cooldown ma trwać 5 sekund - `alarm[0] = room_speed * 5`. Mnożymy room_speed (1 sekunda) z wartością 5, to otrzymamy 5 sekund.
  5. A to masz na myśli cooldown? Że gracz może ponownie użyć trampoliny PO 5 sekundach jej użycia, czy jedynie podczas trwania animacji, ale która jest odtwarzana CO 5 sekund? No grawitacją steruj już w Step par_entity, w kodzie gdzie sprawdzasz czy obiekt stoi na ziemi ustawiaj pierwotną wartość grawitacji `gravity = 1.0`. A ustawienie połowy grawitacji ustawiaj w kodzie, gdzie sterujesz trampoliną i ustawiasz graczowi prędkość odbicia, czyli w Step obj_trampolina, w bloku if place_meeting. Jak masz if place_meeting w obj_trampolina, to tam przy okazji możesz też odtworzyć dźwięk.
  6. Przejrzałem dokumentację i faktycznie nie ma tego zdarzenia, to musisz w takim razie ustawiać flagę w miejscu, gdzie uruchamiasz animację. To już zależy jak będzie działać w tym wypadku, w if z place_meeting możesz ustawiać grawitację i resetować ją w kodzie Step par_entity jak "stoi" na ziemii. return nie musi przyjmować wartości, w tym wypadku przerwie całe zdarzenie Step. Jeżeli masz więcej bloków ze skryptami, to możesz użyć break, to powinno przerwać pojedynczy blok.
  7. Kod w Step obj_trampolina zostaw, dodaj flagę `start` w Create trampoliny, ustaw ją na `true` w zdarzeniu Animation Start a `false` po zakończeniu animacji (w zdarzeniu Animation End). Dodatkowo kod w Step wzbogać o sprawdzanie flagi start np. dodając na początku `if (start == false) return;`. Jeżeli ma wolniej opadać, to tak, pozostaje modyfikacja grawitacji. Możesz też np. zresetować grawitację (z np. 0.5 do 1.0) po dotknięciu podłoża.
  8. Zachowuj stan trampoliny w zmiennej, np. jakąś flagę i steruj nią podczas animacji w zdarzeniach Animation Start oraz Animation End. W kodzie odbicia przed place_meeting sprawdzaj, czy flaga jest True i tyle. Możesz odpalić dźwięk w zdarzeniu Animation Start.
  9. Ustaw room_speed na 30, ale, żeby zminimalizować różnice animacji/chodzenia między innymi komputerami to niestety pozostaje liczenie delty. Delta to nic innego jak czas jaki upłynął między poprzednią wyświetloną klatką a aktualnie rysowaną, w gm8 niestety nie ma wbudowanej zmiennej delta_time, musisz takową policzyć samemu: // Create global.previous_time = current_time global.delta_time = 1.0 / room_speed // Begin Step global.delta_time = (current_time - global.previous_time) / 1000.0 global.previous_time = current_time Możesz to wrzucić w jakiś kontroler i niekoniecznie w każdym obiekcie liczyć deltę osobno. Teraz, żeby np. bohater poruszał się ze "stałą" prędkością na dwóch kompach, to można zrobić coś takiego: // Liczymy jak daleko poruszył się gracz od ostatniej klatki // Zakładając, że używasz lenghtdirów (ale nie musisz), mnożymy prędkość gracza przez deltę x += lengthdir_x(global.delta_time * player_speed, direction) y += lengthdir_y(global.delta_time * player_speed, direction) Nie polecam sprawdzać "jak szybki jest dany komputer", bo to nie jest użyteczne w tym wypadku. Dodatkowo limit fps (maksymalny) w GM ustawiasz zmienną room_speed, także nie ma potrzeby sprawdzania ile maszyna wyciąga, bo jeżeli będzie wolniejsza to i tak magicznie nie przyśpieszy to działania, tutaj w main loopie nie ma akurat czego optymalizować
  10. Na moje oko wygląda to na z-fighting, precyzji z-buffera w GM nie można zmienić, ale zakładam, że i tak jest ustawiony na 24bity. Niestety pozostaje zmniejszenie maksymalnej odległości rysowania na mniejszą, albo zrobić niewielką przestrzeń między nakładającymi się teksturami, bądź w ogóle nie rysować nakładających się ścian.
  11. Mi nie działa wklejanie obrazków, pokazuje się tylko komunikat "Wykorzystano całą dozwoloną przestrzeń dla załączników" i tyle
  12. Sorry ale nie mam GMa i czasu, żeby sobie rozrysować to na papierze, bo ten ciąg liczb ciężko mi sobie wyobrazić jako bryłę Ustaw poprawnie projekcję tak jak rekomenduje to dokumentacja: https://docs.yoyogames.com/source/dadiospice/002_reference/drawing/drawing 3d/3d projections/d3d_set_projection.html Najpierw użyj w tym celu d3d_set_projection_ext i ustaw zfar na jakąś rozsądną wartość, np 2000 albo nawet mniejszą, żeby nie wypaść z precyzji z-buffera. Obrazek wrzuć na inny serwis, np. https://imgur.com/ i zwyczajnie wklej linka
  13. A możesz podesłać screena i kawałek kodu odpowiedzialny za rysowanie ścian? Może zmniejszenie odległości rysowania powinno pomóc, zfar z funkcji d3d_set_projection_ext.
  14. Niestety to jest związane z precyzją depth buffera, oddalone "piksele" nie mają dostatecznej precyzji aby nałożone na siebie elementy rysowały się w odpowiedniej kolejności, tzw. z-fighting https://en.wikipedia.org/wiki/Z-fighting i nie ma to żadnego związku z rozmiarem tekstur Jednym ze sposobów (i chyba najprostszym) może być przesunięcie elementów o niewielką wartość, aby tekstury rysowane d3d_draw_wall nie nachodziły idealnie na siebie.
  15. Jeżeli chcesz zamienić bieguny wartości 0.0 - 1.0 oraz 1.0 - 0.0 w oparciu o jedną zmienną, to najprościej użyć odejmowania, np.: // W zdarzeniu Create inicjujemy potrzebne nam zmienne // Licznik czasu oraz czas w jaki ma zmienić się alpha np. w 2 sekundy sekunda = 0.0; fade_time = 2.0; // Przy aktualizacji klatki dodajemy kolejne wartości zmiennej sekunda w zdarzeniu Step // Ale uwaga! Liczymy cząstkową sekundy na daną klatkę rysowania (tzw. delta time) var delta = 1.0 / room_speed; sekunda += delta; // Teraz możemy policzyć przezroczystość sprite'ów w zdarzeniu Step // Dodatkowo wartość clampujemy do maksymalnej 1.0 var alpha = min(1.0, sekunda / fade_time) // Pierwszy sprite z przezroczystością 0.0 - 1.0 ustawiamy w zdarzeniu Step // PS. draw_set_alpha służy do ustawiania alphy dla komend draw_*, zamiast tego użyjemy image_alpha image_alpha = alpha // Dugi sprite z przezroczystością 1.0 - 0.0 ustawiamy w zdarzeniu Step // Z racji, że wartośc alpha rośnie od 0.0 do 1.0, musimy zamienić bieguny używając odejmowania image_alpha = 1.0 - alpha
  16. A czy przypadkiem konstruktor ChromeDriver nie przyjmuje pełnej ścieżki do pliku? Sam nie korzystam z Selenium w C#, ale podejrzałem inne konfiguracje i wszędzie z tego co widzę ludzie podają pełną ścieżkę, np.: https://tecadmin.net/setup-selenium-chromedriver-on-ubuntu/ (Przykład z Java, ale to chyba bez znaczenia) E: Nawet podejrzałem w dokumentacji selenium i jest napisane o podaniu pełnej ścieżki do katalogu z ChromeDriver.exe https://www.selenium.dev/selenium/docs/api/dotnet/html/M_OpenQA_Selenium_Chrome_ChromeDriver__ctor_5.htm
  17. GameMaker ma kilka funkcji związanych ze ścieżkami, możesz wykorzystać je aby "przewidzieć" pozycję po X czasie, np.: // Ścieżki działają na wartościach od 0 (początek) do 1 (koniec) // Dlatego na początek policzymy ile ścieżki (od 0 do 1) ludek przejdzie po 1 klatce var path_spd = 1 / path_get_length(path_index); // Mnożąc prędkość 1 klatki na ścieżce przez 20 możemy "przewidzieć" pozycję po 20 klatkach var predict = path_spd * speed * 20; // Instancje mają zmienną wbudowaną path_position // Zwraca ona aktualną pozycję instancji na ścieżce (od 0 do 1!) var from_pos = path_position; var to_pos = from_pos + predict; // Liczymy przewidywaną pozycję x/y na ścieżce var to_x = path_get_x(path_index, to_pos); var to_y = path_get_y(path_index, to_pos); Funkcje te można znaleźć w doksie: https://docs.yoyogames.com/source/dadiospice/002_reference/paths/index.html https://docs.yoyogames.com/source/dadiospice/002_reference/paths/path information/index.html Nie testowałem tego więc mogą być jakieś niedociągnięcia, ale powinieneś załapać koncept
  18. Rozwiązań zapewne jest kilka w zależności od potrzeb, ale jeżeli chcesz mieć punktowe źródło oświetlenia, to można to rozwiązać dość prostą metodą liczenia odległości komórki od źródła światła. np. stosując taki pseudokod: grid = new int[32][32] light_x = 10 light_y = 10 light_pow = 3 for(y = -light_pow; y <= light_pow; y += 1) { for (x = -light_pow; x <= light_pow; x += 1) { distance = sqrt(x*x + y*y) luminance = max(0, light_pow - distance) grid[y + light_y][x + light_x] = luminance } } Jednak nie polecam wykonywać tego kodu co step, może jedynie gdy światło się przemieści (no i oczywiście trzeba wyczyścić poprzedni stan oświetlenia) PS. Złożoność takiego algorytmu to O(n^2), tzn. im większy zasięg oświetlenia, tym wolniejsze jest jego obliczanie (aż do kwadratu). Edit: Możesz też zoptymalizować pętlę tak jak jest to opisane tutaj - https://www.redblobgames.com/grids/circle-drawing/ Dodatkowo polecam przejrzeć ten "tutorial" opisujący inne algorytmy, ale ostatecznie można pobawić się też wielordzeniowością: https://www.youtube.com/watch?v=NEHMJwt7oUI
  19. Nie bardzo rozumiem kontekstu z jakiego obiektu wyciągasz ten "przykładowy kod", więc niewiele można z tego wywnioskować, ale mimo to jedna rzecz mnie niepokoi. Czy przypadkiem tego kodu: nie używasz w zdarzeniu Draw? Jeżeli tak, to prawdopodobnie instancjonujesz obiekty obj_ulepszenie_9/10 itd. w pętli, przez co tworzysz kolejne instancje tego samego obiektu zapychając pamięć i main loopa obsługując inne zdarzenia z tych obiektów. Jeszcze dodam, że funkcja instance_deactivate_object dezaktywuje obiekt, ale go nie zwalnia z pamięci, a to problemu nie rozwiązuje.
  20. float verts[]={ 0, 10, 0, 1, -10, -10, 0, 1, 10, -10, 0, 1 }; int vertexCount=3; glEnableVertexAttribArray(shader.attribute("vertex")); glVertexAttribPointer(shader.attribute("vertex"), 4, GL_FLOAT, false, 0, verts); Ten kawałek kodu nie zadziała, funkcja glVertexAttribPointer nie służy do wysyłania danych do karty graficznej https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribPointer.xhtml Musisz najpierw utworzyć bufor, wypełnić go danymi i dopiero potem możesz użyć go aby narysować coś na ekran, polecam przejrzeć https://learnopengl.com/Getting-started/Hello-Triangle
  21. Dzięki, brakowało mi czegoś do tego typu gierki, było zwyczajnie "za sterylnie" i chciałem dodać kilka efektów, cieszę się, że się spodobało
  22. Tytuł: Neutron Star Gatunek: Gra akcji (?) Opis: Misją gracza jest obronienie swojej gwiazdy neutronowej przed atakiem kosmitów. Strzelamy do przeciwników wciskając klawisze A B X P które pojawiają się na ekranie (w dowolnej kolejności) Gra jest krótka i wystarczy na ok. 3 min grania, ale z racji, że klawisze są dość tęgo rozłożone to potrzeba trochę czasu pograć żeby dojść do wprawy. Taki układ przycisków był wymuszony przez zasady udziału w dżemie Mini Jam #74. Download: https://lethiandev.itch.io/neutron-star (grywalna w przeglądarce) Rozmiar pliku: Jakieś 8MB gzipped Autorzy: Programowanie i grafika: Ja Muzyka: Aim To Head - Artemis Screeny:
  23. Dlatego ostateczny nasłuch trafia i tak do silnika gry, czy tamtejszy system dźwiękowy sobie z tym poradzi (np. Godot ładnie sobie radzi z zapętlaniem ale tylko WAV). Zatargetuj najczęściej używane silniki do gier, np. Unity, Godot i GameMaker, a jak masz nawet możliwość stwórz niewielki projekt do testowania dźwięków. W ten sposób będziesz wiedział jak to działa w praktyce i przy dźwiękach dodasz informację o kompatybilności. Ewentualnie i chyba najprostsze rozwiązanie - renderuj dźwięki (jak sugeruje @Jakim) do surowego WAV/FLAC (albo nawet MP3/OGG dla dłuższych ścieżek dźwiękowych, nie każdy serwis akceptuje tak duże pliki, ale hej, od czego jest formularz kontaktowy) i jak ktoś będzie chciał się bawić, to może sam sobie zaimportować dźwięki do silnika i kompresować wedle uznania (np. desktop/mobile). Jeżeli masz już kilka assetów możesz śmiało je wrzucić na https://opengameart.org/
  24. Zależy od silnika, np. Godot podczas importowania assetów ma opcję do modyfikowania jakości audio. Ale muzyki w formacie WAV to osobiście nie stosuję, tylko do efektów dźwiękowych bo szybciej się importują do projektu i ładują podczas samej gry. Taki OGG natomiast używam w Godotcie do streamingu muzyki, żeby nie ładować całego pliku do pamięci. No i jeszcze limity techniczne też mają wpływ, np WAV łatwiej zapętlić niż format OGG, przy streamingu słychać wyraźną pauzę.
×
×
  • Dodaj nową pozycję...