[Głupie programy na niedzielę] HasztaGenerator

Nie ma to jak słoneczne, niedzielne popołudnie, kiedy można

a) Wyjść na plażę

b) Wyjść na piwo

c) Zamknąć się w domu i pisać dziwne programy

Czekaj, co?

Poznajcie HashtaGenerator

Program powstał z myślą o użytkownikach Instagrama (na razie tylko żeńskiej części użytkowników). Po uruchomieniu i podaniu wymaganych parametrów generuje listę hasztagów, które można wkleić pod zdjęciem.

Na razie działa tylko w konsoli, graficzny interfejs przygotuję gdy skończę „kręgosłup” aplikacji. Myślałem też o użyciu Instagramowego API  do wysyłania zdjęć na serwery, ale to pieśń dalekiej przyszłości.

Projekt ten będę realizował tylko w niedziele, co niedzielę będą się pojawiać posty z nim związane.

Zapraszam na githuba: https://github.com/damoch/hashta-generator

 

PS. Postanowiłem założyć sobie Twittera. Możecie mnie pofollować tutaj https://twitter.com/dam0ch

Postaram się nie spamować 😛

 

[Głupie programy na niedzielę] HasztaGenerator

Base.RTS #1 – welcome back commander

Postanowiłem omówić trochę kodu który wrzuciłem. Jednak, aby podtrzymać klimat…

Obsługa jednostek gracza

Zastanawiałem się gdzie przechowywać informacje o „zaznaczonych” przez gracza jednostkach. Wpadłem wtedy na pomysł listy. Struktura listy ułatwi mi iterowanie po jej elementach i wykonywanie różnych operacji, np. wydawanie rozkazów

 

public static List<Unit> selectedUnits = new List<Unit>();

A tak działają wspomniane wcześniej metody.
Najważniejsza wydała mi się ta do oczyszczania listy.

    public static void ClearUnitsList()
    {
        if (selectedUnits.Count > 0)
        {
            foreach(Unit unit in selectedUnits)
            {
                unit.Selected.SetActive(false);
            }
            selectedUnits.Clear();
            Debug.Log("List Empty!");
        }
}

Najważniejsza, bo musi istnieć możliwość jej oczyszczenia. Ktoś może teraz powiedzieć, że wystarczyłoby same selectedUnits.Clear(), ale każdej jednostce ustawiamy też indykator (mądre słowo) zaznaczenia.

    public static void MovementOrder()
    {
        Debug.Log("Moving!");
        //Giving order to each selected unit
        Vector3 OrderCoordinates = new Vector3(0, 0, 0);
        RaycastHit hit;

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (_Map.GetComponent<Collider>().Raycast(ray, out hit, Mathf.Infinity))
        {
            OrderCoordinates = hit.point;
            foreach (Unit unit in selectedUnits)
            {

                unit.Move(OrderCoordinates);
            }
        }
}

Kolejny fragment kodu odpowiada za wydawanie rozkazu ruchu. Z ciekawostek – wykorzystywane jest tu raycastowanie. Myślę że poza tym metoda jest dosyć jasna.

   public static void AttackOrder(GameObject _Target)
    {
        Debug.Log("Kill them!");
       // MovementOrder();
        foreach(Unit unit in selectedUnits)
        {
            unit.Target = _Target;
            // if(unit.targetInRange==false)unit.Move(_Target.transform.position);
            unit.Attack();
        }
}

Ta jest właściwie jeszcze łatwiejsza. Metoda ta jest wywoływana po kliknięciu na obiekt (budynek/jednostkę) przeciwnika, ten obiekt jest z resztą przekazany jako argument _Target.

Metody jednostek

Przyjrzymy się dwóm metodom – Move() i Attack().

 public void Move(Vector3 Target)
    {

        Navigator.destination = Target;
        Debug.Log("Going to target " + Target.ToString() );
}

Jak się pewnie domyślacie, Navigator to zmienna do której przypisany został komponent NavMeshAgent.
Nawigowanie po trójwymiarowej mapie w Unity jest wybitnie proste 🙂

public void Attack()
    {
        Debug.Log("Yaaaahoooo!");
        if (targetInRange) StartCoroutine("Fire");
        else { Move(Target.transform.position); }
}

Nie jest to może (na pewno nie jest) najbardziej elegancki sposób na zrobienie tego, Ale… Jest 🙂
W przypadku, gdy Target znajduje się w polu ataku jednostki wywoływany jest współprogram Fire(). W przeciwny, jednostka będzie się zbliżać do celu, aż przeciwnik w tym polu się znajdzie.

Posłowie

Szczerze? Nie wiedziałem że będzie aż tak trudno. Nawet z Unity napisanie choćby prostego systemu RTS-a nie należy do zadań łatwych dla samotnego wilka. Ponadto dał się we znaki brak czasu. Chyba trochę się wypaliłem w tym projekcie, ale część funkcjonalności już „działa”.

Mam wrażenie, że jestem lepszy w pisaniu gry, niż bazy kodu do gry 🙂

Base.RTS #1 – welcome back commander

Super Spooky Santa Shooter 2D – czyli jedna z moich pierwszysch gier

Pochwalę się dziś czymś. W tegoroczne święta Bożego Narodzenia zbudowałem w Unity małą, zabawną (chyba) gierkę o Mikołaju strzelającym do prezentów.

Okej, to było trochę dziwne… Lepiej po prostu wam ją pokażę.

Graj w przeglądarce

Jest też dostępna wersja Windows i… Android!

Myślałem nad wrzuceniem na androidowy sklep, ale na razie muzyka w tej grze nie jest moją własnością.

No cóż… To tyle 🙂

PS. Nie martwcie się o Base.RTS. Projekt powstaje… W bólach 🙂

Super Spooky Santa Shooter 2D – czyli jedna z moich pierwszysch gier

Base.RTS #0 – Inicjalizacja

No i stało się. Pomimo trudów i znojów („każdy student dobrze wie, że w czerwcu ciężko pracuje się”? No dobra, już przestaję…) mam troszkę kodu, którym mogę się podzielić.

https://github.com/damoch/base-rts

Teraz wygląda to strasznie biednie. Jedyne co można zrobić, to wybrać jednostki klikając na nie lewym przyciskiem myszki, „odznaczyć” klikając ponownie i wydać zaznaczonym jednostkom rozkaz ruchu. Wybrane przez gracza jednostki znajdują się na liście. No i z takich kosmetycznych – można przy pomocy myszki przemieszczać kamerę.

Staram się aby cały kod był czytelny, choć clean code to wciąż dla mnie abstrakcja.

Mam nadzieję że zaciekawiłem konceptem. Już niedługo więcej 🙂

 

Base.RTS #0 – Inicjalizacja