Skocz do zawartości

Konrad-GM

Użytkownicy
  • Postów

    2 728
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    44

Odpowiedzi opublikowane przez Konrad-GM

  1. Przejrzałem dokumentację GM8.0 i niestety funkcja d3d_light_define_ambient jest od wersji GM8.1 :/

     

    GM Studio 1.4 jest w dużej części kompatybilny ze starszymi GM, generalnie 3D w GMie to rzeźnia i szczerze nie polecam. Kiedyś też się bawiłem 3D w GMie, część nawet nadal dostępna jest na  uploaderze https://gmclan.org/up1717.html może coś Ci się przyda ;)

     

    Jakiś czas temu były duże promocje na GM Studio, teraz ta wersja co wyjdzie jako stable będzie od tego czasu niewspierana przez yoyo, możliwe, że ponownie zagoszczą niezłe promocje.

  2. Cześć, do obsługi spotlightów potrzebować będziesz GMa z shaderami (studio), polecam ten tutorial https://learnopengl.com/Lighting/Light-casters Na tej stronie są opisane podstawy grafiki 3d, co prawda nie dot. GMa, ale tematy dot. shaderów są jak najbardziej użyteczne.

     

    Dodatkowo polecam przejrzeć artykuły dot. shaderów od yoyo

    https://www.yoyogames.com/blog/14/shaders-overview-part-1

     

    Ew. jak koniecznie chcesz używać GMa bez shaderów, możesz spróbować kombinować z d3d_light_define_point i zrobić to na zasadzie promieni. Puszczając promień od kamery i tam, gdzie promień spotyka się ze ścianą, ustawiasz w tej pozycji światło punktowe (z marginesem od ściany), co da efekt latarki jak w niektórych starszych grach np. Unreal.

     

    EDIT: Albo dodać możesz półprzezroczystą nakładkę na ekran i na środku tej bitmapy byłby bardziej przezroczysty okrąg, co z włączonym fogem też dałoby efekt latarki :v

     

  3. Cześć, przy użyciu sinusa i lengthdirów można spokojnie taki efekt uzyskać. Zrobiłem mały przykład, jak można to ugryźć z sinusem.

    Spellcaster.gmz

     

    Generalnie, to na początek tworzymy dwie zmienne wirtualnej pozycji pocisku na scenie ghost_x=x i ghost_y=y, liczymy startową odległość między początkową pozycją pocisku a jej celem i zapisujemy do zmiennej lokalnej start_distance. Następnie w step należy policzyć aktualną odległość między pociskiem a celem i na podstawie wyliczonej wartości stworzyć zmienną factor wykorzystując sinusa: var factor=sin((distance/start_distance) * pi) - ta zmienna ma wartość od 0 (pozycja startowa/końcowa) do 1 (w środku drogi) i będzie odpowiadać za łuk pocisku. Do wyliczenia łuku użyjemy lengthdirów: var offsetx=lengthdir_x(<maksymalne_wygiecie> * factor, <kierunek_pocisku> + 90), dla lengthdir_y funkcja wygląda tak samo. Na koniec ustawiamy pozycję x,y z przesunięciem: x=ghost_x+offsetx oraz y=ghost_y+offsety i gotowe.

     

  4. yxe, odpaliłem Twoją grę u siebie, ale FPSy skaczą mi od 20 do 120. Podejrzewam, że to wina mojego słabego procka w lapku niż grafiki, bo zrobiłem performance snapshota i wygląda na to, że to nie rendering tak bardzo ssie, ale właśnie oskryptowanie. Podejrzałem kod i widzę, że korzystasz z Box2D, czyżby w wersji emscripten?

     

    Zrzut ekranu z 2017-10-15 17-09-51.png

    Zrzut ekranu z 2017-10-15 17-10-27.png

  5. 1. Przeważnie problem polega na kolejności rysowanych elementów, przezroczyste elementy rysuje się jako ostatnie (w gm mniejsza wartość depth). Jeżeli włączysz alpha test i dasz wartość referencyjną np. 40%, elementy będą nakładane na przezroczyste, co straci efekt jakby obiekt stał za szkłem.

    2. Wystarczy nie rysować niepotrzebnych ścian, np. sprawdzając, czy po bokach nie stoi już jakaś ściana.

  6. Ale zdajesz sobie sprawę że to jest wolniejsze niż używanie po prostu intów?

    Jeżeli nie masz specjalistycznego zapotrzebowania to lepiej zostawić to kompilatorowi by sobie dopasował pamięć jak mu lepiej, a nie samemu definiować po ile bajtów maja liczby i odkąd je wczytywać. To ma zwłaszcza znaczenie przy przesyłaniu danych do SSE gdzie ładowanie zmiennych nie wyrównanych do konkretnych wartości znacząco spowalnia proces(i ogólnie wiele komponentów wymaga by adres był podzielny przez konkretną liczbę i jeśli nie jest, to kompilator musi to przepisać na adres spełniający warunki).

     

    Tak więc jak potrzeba do konkretnych rzeczy to ok. np do trzymania zserializowanych obiektów o różnej ilości bajtów, ale to trzymania zwykłych liczb jest to zupełnie nieopłacalne.

    Hm, dobrze wiedzieć, nie pomyślałem w ten sposób. Dzięki.

  7. właściwie dlaczego użyłes tablicy charowej by potem castować na inty?

    Czym twoje rozwiązanie różni się od używania zwykłej tablicy intów?

    Offset liczony co do bajta, a nie co 4-8 bajty jak w przypadku tablicy z intami.

    Można w char[1..4] zmieścić 2 zmienne 16 bitowe np.

  8. niezbyt dobry pomysł. Jak system na którym to puścisz będzie miał inny rozmiar inta niż sobie założyłeś to dostaniesz śmieci.

    Podałem tylko przykład O(1), dla ścisłości zależy to od kompilatora, niektóre posiłkują się typami tj. int8_t, int16_t, int32_t, int64_t itd.

  9. Witam,

    jakiś czas temu zainteresowałem się silnikiem Godot. Kilka dni rozpoznania, badania przykładów Godota itd... Nadszedł czas, by coś swojego stworzyć i tutaj pojawia się kilka problemów, z którymi się aktualnie zmagam :v

     

    1. Problem dotyczy blendingu dwóch animacji. Przypuśćmy, że mam dwie animacje w AnimationPlayer - 'idle' i 'run'. Dołączam AnimationPlayer'a jako 'master' do AnimationTreePlayer. Wszystko fajnie i wgl, animacja się przełącza, ale nie widzę, by był tutaj jakikolwiek blending animacji. Tzn. animacja się poprawnie przełącza gdy zmieniam wartość blendingu, tylko, że wygląda to 'skokowo', bez płynnego przejścia między animacjami. Każda wartość =/= 0 powoduje wspomniany przeskok.

     

    Tutaj testowe animacje jak wyglądają:

    aVwdd1p.giffscnFNm.gif

     

    Drzewko blendingu animacji:

    HAPpUHw.png

     

    No i efekt działania AnimationTreePlayer-a:

    SW868UH.gif

     

    Zauważyłem też, że w przykładzie 3D używane są "Transform Track" do blendingu dwóch (i więcej) animacji, i tam to działa poprawnie. Czy "Normal Track"-i zostały na tym polu zapomniane?

     

    Przypomnę, że w Node2D nie ma "publicznych" macierzy, by posłużyć się rozwiązaniem jak w 3D i użyć Transform Track-ów.

     

    Ktoś może zna jakieś ludzkie rozwiązanie? Prosiłbym o podzielenie się własnym doświadczeniem :D

     

    Kolejny problem już czeka na rozwiązanie, ale póki co, na razie implementuję kilka innych rzeczy.

     

    Pozdrawiam :)

     

    EDIT: Problem rozwiązany od wersji Godot 2.1. Cheers.

     

    PS.

    zYjSNqk.png

    He he

×
×
  • Dodaj nową pozycję...