Skocz do zawartości

Konrad-GM

Użytkownicy
  • Postów

    2742
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    42

Treść opublikowana przez Konrad-GM

  1. Chcesz zasymulować fizykę bez znajomości chociaż podstaw newtonowskiej fizyki? To myślę może już lepiej byłoby to zlecić komuś do zrobienia i nie zaglądać w kod. Jak tak bardzo chcesz uprościć fizykę, to chociaż zawsze aplikuj przyśpieszenie grawitacyjne, przynajmniej do momentu, aż ludzik nie zastygnie na platformie. IMO napisałeś za mało szczegółów, jak Twój kod aktualnie wygląda i chociaż dołącz krótki filmik, żeby było widać w czym problem.
  2. Tak szczerze powiedziawszy, bez sensownego dostępu do wielowątkowości, to byłoby to zapewne trudne do osiągnięcia - ale jakby mocno skupić się na optymalizowaniu, to może nawet w miarę sensowny klatkarz można uzyskać. Kilka propozycji jak można zoptymalizować rysowanie fog of war: Nie aktualizuj wszystkich jednostek, ale tylko komórki, które są zajęte przez jednostki. Do tego możesz wykorzystać "słownik", np. tworzysz loopa po liście monitor_list tak jak do tej pory, ale przy okazji zapisujesz w której to komórce jednostka rysowała swój fog of war i np. przed shroud_clear_position może sprawdzić, czy tej komórki już nie liczyłeś, taki pseudo kod: var dict = new Dictionary for unit of unit_list: if dict.has(key: unit.x + '_' + unit.y)): continue shroud_clear_position(unit.x, unit.y) dict.set(key: unit.x + '_' + unit.y, value: unit.shroud_radius) jeżeli każda jednostka ma własny shroud_radius, to możesz przed shroud_clear_position zapełnić nową listę ale tylko z jednostkami o największym shroud_radius na daną komórkę. Dodatkowo możesz zoptymalizować samą funkcję shroud_clear_position - https://www.redblobgames.com/grids/circle-drawing/ polecam Nie modyfikuj tablicy shroud_grid jednostkami poza ekranem, monitor_list powinien posiadać tylko jednostki, której pierścień fog of war może być widoczny. Możesz spróbować też brać tylko wycinek z listy monitor_list i co kolejna klatka aktualizować tylko część jednostek - jeżeli aktualizacja tablicy będzie się działa np. 15x na sekundę to raczej nikt nawet nie zauważy zastosowanego triku. Jeżeli jeszcze na coś wpadnę to chętnie się podzielę pomysłami.
  3. Jeżeli chodzi o mikro-optymalizacje, to przełączanie stanu karty graficznej np. `gpu_set_blendmode` wyrzuciłbym poza loopa, ale to pewnie niewiele zmieni i tak. Tego typu fog of war można też zrobić na tablicach, większe komórki i aktualizowałbyś je jedynie gdy jednostka przekroczy jej granicę. A rysować mógłbyś też tylko wycinek takiej tablicy na surface bez znaczenia ile jednostek jest na ekranie. Minus taki, że byłoby to bardziej "rozpikselowane", ale możesz spróbować wygłądzić krawędziie jakimś shaderem.
  4. A ile średnio takich świateł masz na scenie? Możliwe, że bottleneck występuje gdzieś w okolicy "with(objUnit)". A dałbyś radę profilować co się dzieje? Np. wrzucić jakiś czasomierz w tej okolicy.
  5. Jeżeli rysujesz duszki na surface to X i Y będą zawsze 0,0 i nie "podąża" za kamerą tak jak by można było się spodziewać, ale możesz spróbować odjąć pozycję kamery żeby przesunąć rysowanie duszków na właściwą pozycję, oraz duszka "black rectangle" możesz rysować na pozycji 0,0
  6. Pozycjonowanie - DodajOszusta.pl (archive.org) wiem, że stare, ale odnoszę wrażenie, że dalej aktualne PS. ale te obrazy to mistrzostwo muszę przyznać
  7. Konrad-GM

    Opera GX Game Jam

    Nawet się cieszę, że trafiłem z bratem do top 100, jak na dłuuugą przerwę od GMa, ale raczej do top 8 się nie dostaniemy 😆
  8. Też tak trochę zgniłem jak to zobaczyłem
  9. "Strona nie istnieje" - możliwe, że masz ją zapisaną jako draft, upublicznij grę i powinna być widoczna
  10. Potestowałem trochę, pobiegałem, porzucałem granatami i o ile nie pojawił mi się ten bug przez większość czasu, tak na niego jednak trafiłem, przynajmniej nie jest tak jak w poprzednim demie gdzie każdy granat zostawiał rozbłysk
  11. W The Ascent jest przycisk podnoszący celownik, może zrobienie podobnego celowania byłoby wystarczające? Normalny tryb to celownik zawieszony na jednej płaszczyźnie, ale np trzymając alt/ppm można by celować po raytracingu z kamery, wtedy celowanie w konkretny punkt też byłoby możliwe. Edit: Może z celownikiem laserowym też inaczej by się grało
  12. Ja testowałem na swoim lapku z gtx 1070 max-q, intel i7 7700hq.
  13. Też mam tego buga z nieznikającą eksplozją po granacie, wali po oczach niemiłosiernie, aż do tego stopnia, że unikałem granatów Moim zdaniem gra ma potencjał, ma ciekawą mechanikę, przyjemnie się likwiduje przeciwników, ładnie i spójnie się komponuje, ale czasami sterowanie jest dość toporne jakby sterowało się czołgiem. Dodatkowo celowanie koniecznie do poprawy, jest nieintuicyjne i czasami nie wiadomo gdzie nasz gostek celuje - może zablokowanie celownika do płaszczyzny byłoby lepsze? Może to kwestia level designu, ale czasami elementy otoczenia znikają i pojawiają się dość chaotycznie i ciężko się orientować. Jak dla mnie gra bomba, trochę szlifów w sterowaniu, level design i mógłbym grać bez przerwy.
  14. Bo ją sam przyśpieszasz, wywal tą linię i z głowy.
  15. 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;`
  16. `if obj_trampolina == false && place_meeting(x,y,par_entity)` serio?
  17. 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.
  18. 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) {`.
  19. 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ę.
  20. 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?
  21. Ale nie dziedziczą tych samych stanów, każda instancja tworzy własną wersję zmiennej `g` (jedynie na podstawie obiektu par_entity).
  22. A to zmienna `g` jest zmienną globalną?
  23. 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.
  24. 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.
×
×
  • Dodaj nową pozycję...