29 października 2024

Co u Sladuma ...

A dzieje się, dziękuję.


W celu ułatwienia sobie sprawdzenia czy to co dodaję działa stworzyłem scenę testową, na której umieszczam tworzone elementy. I na tę chwilę postać umie:
  • otwierać skrzynki
  • otwierać drzwi 
  • dla testu dodałem pułapkę podłogową z dwoma stanami (no w sumie mam tylko dwa rysunki animacji) i potrafi zadać obrażenia bohaterowi (ten nie umiera bo tego jeszcze nie obsługuję)
  • i chyba najfajniejsze - od nowa zrobiłem okno dialogowe bo poprzednie nie działało dobrze
  • dialog wczytywany jest z pliku json
  • tekst wyświetla się w okienku 
Na razie dialog w pełni nie działa, ale jest OK. Dodatkowo dzięki sztuczce podpatrzonej w ramach 
https://www.youtube.com/watch?v=WaotOuDNio8

okienko pojawia się ALE animacje w grze kręcą się dalej.

 

Zrzucik z opisami 






27 października 2024

Czy ten Node2D to na pewno Player.cs?

Sprawdzałem jak szybko ładnie sformatować jakikolwiek kawałek kodu w bloggerze i trzeba przyznać, że bez zewnętrznego wsparcia blogger takiej funkcji nie daje. Stąd, po krótkich poszukiwaniach w celu znalezienia formattera trafił na jakąś stronkę takowy udostępniającą. W sumie to wstyd, że taki portal nie ma tej opcji wbudowanej... Może trzeba poszukać jakiegoś innego miejsca na swoje wpisy? 
Kod poniżej dalej wygląda jak kupa, ale przynajmniej trzyma tabulacje


Whatever, bo nie o tym miało być.

Pisząc w Godot, ale używając C# często i gęsto natknie się człowiek na problem jaki to typ obiektu wpadł Ci do metody i czy możesz coś z nim zrobić. 

Godot pod tym względem jest... powiedzmy... automagiczny jak każdy słabo typowalny język. Radzi sobie z automatycznym typowaniem węzłów i powiązanych z nimi skryptów i nie robi przeszkód. Czasem zrzuci błąd, ale nie martw się - dowiesz się o nim w runtime gdy twój mozolnie cyzelowany kawałek kodu wyloguje do konsoli tysiące błędów w 10 sec.

W C# zaś jesteśmy skazani na ostrą typowalność zmiennych i takie cuda jak int raz będący Stringiem a jednocześnie Node2D nie przejdą. Stąd trzeba sobie radzić i rzutować. 


Poniżej przykład klasy, która w oparciu o generyki zrzutuje obiekt godota na coś sensownego (lub nie ;p )


using Godot;
using System;
public static class VariantTester<T>
{
    public static T GetType(Variant unknown)
    {
  
        	switch (unknown.VariantType)
        {
            case Variant.Type.Nil:
                break;
            case Variant.Type.Int:
                break;
            case Variant.Type.Object:
                return CheckIsT(unknown);
        }
        return default;
    }

    private static T CheckIsT(Variant unknown)
    {
        try
        {
            if (unknown.AsGodotObject() is T matching)
            {
                return matching;
            }
            else
            {
                return (T)Convert.ChangeType(unknown.AsGodotObject(), typeof(T));
            }
        }
        catch (InvalidCastException)
        {
            return default;
        }
    }

}

  
Wywołanie tego kawałka kodu jest proste jak drut - tak jak i późniejsze użycie

// jakas tam klasa gdzie nam wpada Node2D do funkcji
public void OnBodyIn(Node2D node)
    {
        if (node.IsInGroup("Player")) // ulatwijmy sobie
        {

// proba rzutowania // sprawdzenie null-safe w c# i wywolanie metody na znalezionej klasie :)
        VariantTester<Player>.GetType(node)?.AddItemToInventory(itemResource); 
        }

    }
Na razie na coś wiele mądrzejszego nie wpadłem (w sumie C# używam jakieś 3 tygodnie także miejcie litość) , a jak macie lepszy pomysł to zapraszam do komentarzy 
Działa też w przypadku gdy szukami interfejsu .

26 października 2024

Co u Sladuma?

Postaram się w krótkich postach opisywać co zmieniło się w grze pomiędzy nimi. Ten będzie pierwszy i miejmy nadzieję że nie ostatni.

Powstał plan co po kolei jest mi potrzebne do tego, aby gra powoli powstawała. Spytacie (spytacie ?) Dlaczego? Powód jest prosty - żeby nie próbować robić wszystkiego jednocześnie bo inaczej do niczego się nie dojdzie. Najpierw najważniejsze rzeczy na początek, później te mniej ważne. 

Ale oczywiście ... różnie z tym bywa. Aktualnie pracuję nad tym, aby pierwszy poziom po którym łazi Sladum powoli stał się interaktywny i zawierał jak najwięcej funkcjonalności które będę mógł reużyć na  kolejnych planszach.

Mam więc: 
Średnio działającą maszynę stanów (czasem się gubi i ładuje nie tę animację co trzeba), 
wstępną tilemapę dla pierwszego piętra tawerny oraz dla sali czyli parteru (to w sumie są dwie plansze a nie jedna jak pisałem powyżej)
 jakieś oświetlenie 
`fadeScreen` który powoduje że przejście między poziomami nie jest momentalne, a opiera się na krótkiej animacji ściemniającej ekran, zmianie poziomu i ponownie odciemniającej się.
Jakieś podstawowe dźwięki ponieważ lubię coś słyszeć w tle. Nawet na tak wczesnym etapie gra bez jakiegokolwiek udźwiękowienia to katorga dla twórcy :) Niech będzie minimum - kroki bohatera i jakieś tło dla dźwięków tawerny...



I taki zrzut ekranu. Piętro tawerny. Efekt zaciemniania ekranu nie dało się nagrać

i sala główna tawerny






21 października 2024

Dawno tutaj nic się

nie działo, ale mam widoki aby to zmienić. Na razie cudem udało się zalogować do konta (co ciekawe straciłem dostęp do powiązanego maila)... Zdaję też sobie sprawę że nikt tu nie zagląda :) ale dodam `gorący` temat... będzie Godot.


Czymże on jest? To silnik do pisania gier, coś jak Unity / Unreal tyle że open source.

Aktualnie odklepuję tutoriale z Zenva Acadamy (poniżej jeden z platformerów które można stworzyć w ramach szkoleń)



ale pracuję powoli nad zaktualizowaną wersją Mini Przygody Sladuma, tym razem będzie interaktywnie i (docelowo) mobilnie. W tej chwili w tawernie Sladum może spotkać zleceniodawcę zadania..


Przy okazji piszę kod w C# jako że nie przepadam za słabo typowalnymi językami jakim jest GDScript.