Archive for the ‘Projects’ Category.

FTPUploader

Jak zwykle następny post powstał po dłuższej przerwie, ale muszę przyznać czasem mi się nie chce, a czasem po prostu nie mam czasu. Tak też było tym razem, brak czasu spowodowany był szkołą (tak 3 klasa LO zobowiązuje), ale udało się znaleźć w niej czas na drobne projektowanie, a poza nią na kodzenie (taak, to jest nałóg). W wyniku tego kodzenia udało mi się spłodzić program o nazwie właśnie FTPUploader. Szczególne podziękowania należą się Krystianowi Dużyńskiemu “KrystianD”, za pomoc w chwilach mojej niewiedzy oraz kod, który był mi potrzebny do realizacji założeń. No ale do rzeczy (ReadME):

FTPUploader jest to prosty program potrafiący wysłać plik na wskazany serwer
za pomocą 2 kombinacji klawiszy.
Aby rozpocząć korzystanie z programu należy dodać do bazy danych żądane serwery
FTP, przy czym w polu Adres download należy podać ścieżkę, która będzie dodawana
do adresu pliku (w przypadku republiki na koncie o loginie zgred będzie to
zgred.republika.pl). Wysłać plik można na 2 sposoby:

Standardowy – naciskasz “Wybierz plik”, wybierasz plik, a na końcu “Wyślij”.
po wysłaniu plik automatycznie skopiuje się do schowka, jeżeli przypadkiem
zmienisz wpis w schowku możesz nacisnąć pole “Ostatni link” co spowoduje
ponowne wpisanie linku do schowka.

Hotkey’s – ta metoda jest dużo lepsze, zwłaszcza dlatego, że program działa w tle.
Aby wysłać plik tą metodą wystarczy po prostu skopiować plik do schowka
(kombinacja klawiszy Ctrl + C), a następnie wysłać plik wciskając klawisze
Shift + Alt + S, po wysłaniu link do pliku znajdzie się w schowku.
Kombinacja klawiszy Shift + Alt + L powoduje wpisanie do schowka ostatniego
linka. (Uwaga kombinacja klawiszy powoduje zmiane klawiatury w Viście,
proponuje zostawić sobie tylko klawiaturę polską.)

Program posiada bazę linków, w której znajduje się 20 ostatnich linków.

FTPUploader

Pobierz

A na koniec pragnę życzyć wszystkim zdrowych, wesołych i owocnych Świąt.

Trochę więcej o Mesh

Ostatnio wymyśliłem dość prosty TextureManager (Resource był w planie, ale nie wiem wszystkiego o zasobach DX, które trzeba zwalniać, a o teksturach wiem wystarczająco). Właściwie to nazwanie go jest lekką przesadą, ponieważ składa się on ze struktury, vector’a i 2 funkcji.  Vector zawiera obiekty struktury, która składa się ze adresu tekstury, licznika użyć oraz wskaźnika na interfejs tekstury. Vector’em zarządzają 2 funkcje:

LoadTexture
DeleteTexture

Pierwsza sprawdza czy nie ma już załadowanej takiej tekstury jeżeli jest to zwiększa jej licznik i zwraca interfejs. W przeciwnym przypadku tworzy i dodaje do vector’a

Druga sprawdza po wskaźniku czy jest, jeżeli tak to dekrementuje po czym sprawdza licznik, jeżeli spadł do 0 to zwalnia teksturę, kasuje z vector’a.

Składniki zawierają się w sekcji prywatnej klasy Mesh, przy czym vector jest statyczny, dzięki czemu dostępny dla wszystkich potomków klasy abstrakcyjnej Mesh.

Obsługa wierzchołków jako Mesh

Dziś na przedmiocie o nazwie “Język Polski” (tak, to idealna pora), projektowałem klasę obsługującą wierzchołki. Stwierdziłem, że do obsługi wierzchołków typu FVF oraz tych dla Vertex Declaration potrzebne będą różne klasy, a ponieważ lubię jak wszystko jest OO (lub dąży do tego), postanowiłem, że napiszę klasę abstrakcyjną Mesh, zawierającą (aktualnie) 4 funkcje:

  • virtual void Draw() = 0;
  • virtual void InvalidateResources() = 0;
  • virtual void RestoreResources() =0;
  • void AddDevicePtr(LPDIRECT3DDEVICE9);

Te funkcje pozostaną niezmienne, przy czym wirtualne będą używane przez klasę Render. Która je będzie w odpowiednich momentach wywoływała. Następnie pomyślałem o klasie dziedziczonej dla typu FVF (aktualnie mi taka potrzebna), ale szybko doszedłem do wniosku, że nie ma ona sensu, ponieważ nie będzie zbyt elastyczna, gdyż za każdym razem potrzeba jest ustawić inne stany, a przecież to samo można zyskać bez niej, dlatego porzuciłem ją. Klasa Mesh jako abstrakcyjna będzie dziedziczona przez różne klasy obiektów, które będę mógł dodać do vector’a w klasie Render, a ta będzie wywoływać odpowiednie funkcje, które będą odpowiednio zdefiniowane dla danego obiektu.

NIne

Dość niedawno rozpocząłem pracę nad moim kolejnym projektem, który nazywa się on NIne. W zamiarze ma być to silnik składający się z podstawowych modułów, czyli obsługi grafiki, dźwięku, eventów, planuję również napisać własny VFS. Projekt jest duży i na pewno zajmie mi sporo czasu, jednak jest on jednocześnie okazją do napisania sobie własnych narzędzi, z których będę mógł korzystać w przyszłości. Oczywiście projekt zamieszczam w osobnym wątku, więc jeżeli trafi się okazja lub potrzeba będę pisał również inne.

Prezentacja na historię pt. “Holocaust”

Czas nadszedł, jak obiecałem (przynajmniej sobie w myślach), umieszczam prezentacje wraz z kodem źródłowym silnika prezentacji. Prezentacja była robiona w grupie, ja zająłem się silnikiem, kolega Konrad Polak dopieścił grafikę, a reszta dbała o informacje :).

Teraz troszkę o silniku. Silnik bazuje na SDL, filmiki wyświetlam z pomocą DirectShow, muzykę odtwarzam dzięki IrrKlang (Nie DS, ponieważ z IrrKlang miałem gotowe). Silnik składa się z 3 części:

  • Core: odpowiedzialny za obsługę scen, obsługę zdarzeń
  • Scene: układa scenę z poszczególnych kontrolek
  • Controls: klasa bazowa, z której dziedziczą poszczególne kontrolki

Ogólnie uważam, że dość dobrze zaprojektowałem ten silnik, jeśli ktoś miałby rady to chętnie wysłucham ( lub przeczytam).

Jak mówiłem z projektem zamieszczam kod, jeśli ktoś jest zainteresowany.

Download

PS. W lewym i prawym dolnym rogu są strzałki, wystarczy najechać :).

// Download się zagubił ;(

Mój pierwszy program w C#

Wczoraj napisałem, mojego pierwszego tool’a w c#, program jest mi potrzebny do podziału scenerii z RPGcore. Sposób działania jest następujący:

1. Podaje się kod odpowiedzialny za wyświetlanie elementów otoczenia na mapie, kod ten z pliku scenery.dat w folderze z mapą wygląda nastepująco.

[skala] 4×2
22:22
24:22

Odpowiada to wyświetleniu na mapie o współrzędnych 22:22 i 24:22 obrazka skały o wymiarach 4×2 (w kostkach po 25×25 pikseli). Problem polega na tym, że gra korzysta z kratki w punkcie 22:22 (przykładowo) i wyświetla całą skałę która odpowiednio wychodzi na pozostałe kratki (np. 23:22 i 22:23). Problem polega na tym, że jeżeli zniknie nam z mapy punkt 22:22 to zniknie nam cała skała która powinna być jeszcze wyświetlana w punkcie 25:22. Rozwiązanie polega na tym, aby podzielić skałę na części 1×1 czyli kostki 25×25 pikseli. Sam plik nie jest tutaj problemem, ale musimy jeszcze zmienić zawartość pliku scenery.dat aby wyświetlała całą skałę. I tu z pomocą przychodzi właśnie to oto narzędzie, wystarczy wkleić kod odpowiedzialny za pokazywanie całej skały 4×2 a otrzymamy kod, który wyświetli nam skałę w kawałkach.


minicalc_s

Oto link.

Wymagania: .NET framework 2.0

Save’y

Aktualnie pracuję nad zapisywaniem stanu gry w RPGcore. Po wielu trudach udało się skodzić zapisywanie stanu mapy, dzięki czemu po zmianie mapy jej zawartość pozostanie taka sama. Po wyjściu z gry save’y mapy automatycznie znikają. Planuję tworzenie autosave’a.

Następnym etapem jest zapisywanie statystyk i ekwipunku gracza do pliku. Ostatni etap będzie polegał na umożliwieniu graczowi zapisywanie stanu gry. Po naciśnięciu klawisza odpowiadającego za save. Plik gracza będzie łączony z plikami mapy, by w czasie ładowania rozdzielić się i wczytać.

Dialogi finito

Zakończyłem pisanie dialogów do RPGcore, teraz będę się zabierał za save i load. Mam nadzieje, że mój pomysł wypali.

Polega on na tym, że w momencie zmiany lokacji zapisuje się wszystkie anormalności do pliku, a gdy gracz kliknie klawisz save’a te pliki są łączone w 1 duży. Load będzie to dzielił plik na poszczególne mniejsze pliki, które będą uwzględniane przy ładowaniu mapy.

Dużo nowości

Dawno tu nie zaglądałem, nie wiem czemu, pewnie nie chciało mi się, ale skoro już tu jestem, mogę zaprezentować nowości jakich doczekał sie mój RPG. Zacznę listą:

1. Każdy dostępny rodzaj armoru: hełm, naszyjnik, pierścienie, buty oraz pancerz.
2. Różne typy broni: miecze dwuręczne, jednoręczne, kusze, łuki oraz czary (niewiele bo 2 rodzaje)ofensywne i leczące.
3. Statystki bohatera, dzięki nim można podejrzeć aktualny rozwój gracza. Możliwe jest zdobywanie poziomów po zdobyciu punktów doświadczenia z zabijania potworów. Na każdym poziomie dostajemy po 4 punkty atrybutów i skilli do dowolnego rozdzielenia
4. Ekwipunek denata, każda zabita postać będzie leżeć na ziemi dopóki nie zmienimy mapy, po tym ciało znika, lecz dopóki ciało jest, dopóty możemy go przeszukać i zabrać przedmioty.
5. Dialogi, jeżeli postać jest nieagresywna to jest możliwość porozmawiania z nią (pod warunkiem, że istnieje plik z dialogami dla tego npca). Aktualnie postać może nam wręczyć przedmiot jeżeli go ma przy sobie (istnieje opcja sprawdzenia czy ma przedmiot)
6. Strzelając z broni dalekiego zasięgu możemy ujrzeć dolatujący do przeciwnika pocisk, który ma ustalony zasięg 8 kratek, jeżeli nie trafi w nic to znika. Pociski reagują na kolizje, jeżeli wlecą w coś w co postacie nie mogą normalnie wejść to znika.

Jak widać wiele się zmieniło, ale jeszcze trochę zostało do napisania aktualna lista TODO w uproszczeniu wygląda tak:
1. Zmodyfikować AI npców, aby mogli korzystać z broni dalekiego zasięgu.
2. Rozbudować dialogi.
3. Zapisywanie stanu gry.
4. Jakieś menu.

[=====>.60%]

Dorzuciłem przedmioty, ekwipunek. Oczywiście jest GUI na to, dzięki, któremu można przejrzeć ekwipunek(chwilowo bez przesuwania), można przenosić miksturki na paski i z powrotem. Oraz można używać (jak narazie tylko) miksturek HP i MP