Skocz do zawartości

Konrad-GM

Użytkownicy
  • Postów

    2730
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    38

Zawartość dodana przez Konrad-GM

  1. Bo ją sam przyśpieszasz, wywal tą linię i z głowy.
  2. Nie rozumiem, a to nie odtwarza się w całości czy jak, a ta animacja trwa aż 5 sekund? Może wystarczy tylko sprawdzanie, czy stoi na ziemi? `if !place_free(x, y+1) g = 1.0;`
  3. `if obj_trampolina == false && place_meeting(x,y,par_entity)` serio?
  4. To dodaj zmienną `start` w Create obj_trampolina. Jeżeli ten obiekt dziedziczy z innego obiektu Create, to na początku skryptu użyj event_inherited() to wtedy Create rodzica również zostanie wywołany. Nie, bo zmienna `start` będzie widoczna tylko i wyłącznie w tym bloku kodu, jak tylko go opuści to zostanie usunięta - nie będzie miała żadnej wartości, ani true ani false, przestanie kompletnie istnieć. Polecam przejrzeć: https://docs.yoyogames.com/source/dadiospice/002_reference/001_gml language overview/variables/index.html - w tym podartykuły instance variables oraz local variables.
  5. W kodzie Step nie masz ustawianej flagi `start = true` więc technicznie flaga nigdy się nie zmienia. Wstaw `start = true` zaraz pod `alarm[0] = room_speed * 5`. Dodatkowo w Step nie sprawdzasz czy `start == false` żeby uruchomić blok odpowiedzialny za skok. Np. `if start == false && place_meeting(x,y,par_entity) {`.
  6. Tak, jest to jak najbardziej poprawne. obj_trampolina zmienia grawitację tylko wyłącznie kiedy dotknie par_entity, imo najlepiej byłoby przywrócić wartość w Step par_entity kiedy opadnie już na ziemię.
  7. 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?
  8. Ale nie dziedziczą tych samych stanów, każda instancja tworzy własną wersję zmiennej `g` (jedynie na podstawie obiektu par_entity).
  9. A to zmienna `g` jest zmienną globalną?
  10. 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.
  11. 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.
  12. 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.
  13. 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.
  14. 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.
  15. 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ć
  16. 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.
  17. Mi nie działa wklejanie obrazków, pokazuje się tylko komunikat "Wykorzystano całą dozwoloną przestrzeń dla załączników" i tyle
  18. 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
  19. 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.
  20. 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.
  21. 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
  22. 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
  23. 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
  24. 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
×
×
  • Dodaj nową pozycję...