Archive for 2007

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.

StructReader

Wpadłem na pomysł prostego serializer’a, który by potrafił czytać dane z pliku podzielonego na sekcje i zapisywać je do prostej struktury – agregata. Miał być to szablon funkcji, który pobierałby jako jeden z argumentów wskaźnik do tej struktury, następnie wyliczał miejsce zmiennej w strukturze, na podstawie tablicy z typami (enum) i w końcu zapisywał przeczytane dane odpowiednio, sformatowane przez bibliotekę standardową. Niestety jak się okazało (czego do tej pory nie wiedziałem) miedzy składnikami klasy, struktury są przerwy, więc nie można skorzystać z wskaźnika, którego chciałem przesuwać o rozmiar przeczytanego typu, gdyż spowoduje to błędy zapisu.
Na szczęście rozwiązanie tego problemu okazało się bardzo proste i jest o wiele bardziej uniwersalne, otóż zamiast wskaźnika na obiekt struktury, przekazuję funkcji (ponieważ szablon jest już niepotrzebny) tablicę wskaźników do zmiennych i jej rozmiar. Dzięki niej wiem gdzie w pamięci znajduje się dana zmienna. Rozwiązanie to ma też inna zaletę, ponieważ do funkcji mogę przekazać nie tylko obiekty struktury, ale również dowolne obiekty nienależące do struktury.

Oto przykładowy plik cfg:

1
2
3
4
5
6
7
8
Sekcja1{
   // Komentarz
}
// Komentarz 2
Sekcja2
{
   zmienna1 = 3.14;     // Komentarz np. opisuje jaki to typ, tu float
}

Jak widać schemat jest prosty:

  1. Sekcje oznaczamy nazwą i klamerkami
  2. Komentarze tylko po //, są ważne do końca linii
  3. Nazwy zmiennych nie są brane pod uwagę, liczy się znak ‘=’ i ‘;’, pierwszy rozpoczyna czytanie wartości, drugi kończy.

PS. Schemat pliku zmyślony z Regedit’a :).

W kodzie wygląda to tak:

1
2
3
4
5
6
7
8
9
10
11
// Tworzymy tablicę z typami
int types[] = { TYPE_FLOAT };        // Przykładowo float
 
// Zmienna
float temp;
 
// Tablica ze wskaźnikami
void* pointers = { &temp };
 
// Odczyt z pliku
FillUpStruct("nazwa_pliku_jako_string", types, sizeof(types),  "Sekcja2", pointers, sizeof(pointers));

Według mnie wygląda to ładnie, i jest proste w użyciu, szczególnie przydatne przy zapisie ustawień np. urządzenia DX.

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.

Visual Studio 2008 Express Edition i inne…

Tak, wreszcie wyszła długo oczekiwana wersja release najlepszego, darmowego IDE firmy Microsoft: Visual Studio 2008 Express Edition. Na stronie Microsoft’u są dostępne poszczególne wersje do różnych języków, zachęcam do odwiedzenia witryny: http://www.microsoft.com/express/default.asp. Wraz ze środowiskiem ukazał się silnik graficzny (chyba to właściwa nazwa) o nazwie Dark GDK. Jak można się dowiedzieć z kodów przykładowych, korzystanie z niego jest dziecinnie proste, więcej informacji tu: http://gdk.thegamecreators.com/.

Sam aktualnie ściągam obraz płyty na której znajdują się wszystkie wersje IDE, następnie Dark GDK by przekonać się co to dokładnie jest.

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

I znowu szkoła :/

No nic , jak co roku (ten na szczęście jest ostatni) we wrześniu, każdy nie skończył jeszcze liceum (w tym ja) lub technikum jest zmuszony udać się do budynku zwanego “szkołą” aby poszerzać swoją wiedzę. Na nasze szczęście pan minister Romuś zadbał, abyśmy się w szkole nie nudzili, więc dorzucił do ocen wliczających się do średniej religię. Dobrą wiadomością jednak może okazać się powrót matematyki jako przedmiotu obowiązkowego na maturze, dotyczy on jednak tegorocznych pierwszoklasistów, a mnie i tak by nie dotyczył bo matematykę i tak zdaję. Najgorsza wiadomość dotyczy jednak uczniów z podstawówek i gimnazjów, ponieważ będą oni musieli założyć mundurki. Ja na szczęście mogę jedynie współczuć tym dzieciom oraz życzyć ministrowi białego kubraczka zapinanego z tyłu :).

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ć.