Do świata w pełni obiektowego, czyli przesiadka na Javę
Swoją naukę programowania zaczynałem od PHP. Byłbym w stanie napisać prostego CMS'a, jakby mi się chciało napisać jakiś szablon do tego. Później szkoła zmusiła mnie do nauki Pascala. Strata czasu, ale poznałem prawdziwe trudności programowania: deklarowanie zmiennych razem z typami, sztywne tablice. Później był C++ i C. Początkowo bardziej C++, później jednak zacząłem używać Standardowej Biblioteki C (jest o wiele szybsza i daje większą władzę). Teraz jednak przesiadłem się (oczywiście nie całkowicie) na Javę.
Poniższy artykuł można potraktować jako poradnik do Javy dla programistów C++.
Środowisko
Za środowisko programistyczne wybrałem NetBeans, aktualna wersja 6.9. Muszę przyznać, że to dość łatwe i wygodne środowisko. Zastąpiło miejsce Code::Blocks'a dla małych projekcików C++ (tzn. teraz on mi służy za edytor, a terminal za kompilator, tak jak dotąd), a dla dużych C++owych projektów nadal QtCreator (ze względu na Designera, oraz qmake, który działa też z moimi innymi platformami, czyli S60 i Windows Mobile). Do samego środowiska nie mam prawie żadnych zastrzeżeń. Nie da się powiększyć czcionki za pomocą CTRL+rolka myszy. Niewielka wada. Drugą wadą jest długie wczytywanie listy metod klas.
Ale za to NetBeans sam poprawia niektóre błędy, sam wyszukuje brakujących "nagłówków" (tak to nazwać?). Szczególnie przydatne dla początkującego. W każdym razie nie szukajcie innego środowiska na początek.
Pisanie w Javie zacząłem od razu od troszkę większego projektu niż Hello World, czy konsolowego kalkulatora, a mianowicie klon gry Blocks Out - starego przestrzennego Tetrisa. Zdecydowałem się na taki projekt, bo znam już OpenGL'a, a w Javie można użyć biblioteki JOGL, która jest "bindem" OpenGLa do Javy, a nie znam jeszcze GUI oferowanego przez Javę (co prawda jest projekt QtJambi - Qt dla Javy, ale trochę zbyt ciężki).
Wrażenia
Składnia języka
Wcześniej z Javą miałem styczność tylko w szkole, ale sam szablon aplikacji jest generowany, wystarczyło tylko funkcję main uzupełnić i zadanie zrobione. Ten projekt wymagał trochę więcej niż uzupełnienie jednej funkcji, co niczym prawie nie różni się od C++. Pierwsze spostrzeżenia odnośnie składni:
System rozszerzeń klas i interfejsów
W C++ są tylko klasy. W Javie są jeszcze interfejsy. W różnice się jeszcze nie zagłębiałem, ale Java oferuje standardowo kilka interfejsów, takie jak obsługa zdarzeń klawiatury (keyPressed, keyRelease, keyTyped), myszy, timery itd.
Zarządzanie projektem
Zarządzanie projektem w Javie przy pomocy NetBeansa okazało się być wyjątkowo łatwe! Do mojego projektu musiałem użyć biblioteki JOGL, aby móc korzystać z grafiki 3D. Pierwszym problemem było: jak dodać te pliki .jar jako biblioteki do projektu... Wystarczyło kliknąć prawym na "Libraries" w drzewie Projects i wybrać "Add JAR/Folder" i dodać te pliki. Po zbudowaniu projektu do folderu z .jarem trzeba jeszcze dodać DLLki dla Windowsa, oraz .so i aktywator dla Linuksa.
Po dodaniu odpowiednich bibliotek mogłem się dać do roboty. System import okazał się być bardzo wygodny, wygodniejszy od include'ów. Poza tym: pliki .java dzieli się w tzw. paczki. Jeden plik zawiera max jedną klasę, paczka może mieć kilka plików, a każdy z tych plików automatycznie importuje klasy z "sąsiednich" plików. Każdy powinien się zacząć od słowa kluczowego package i nazwy paczki, do której należy. NetBeans zajmie się resztą (przeniesie, po naciśnięciu na ostrzeżenie i wybraniu "Move class to correct folder"). Niestety brak zmiennych globalnych. Trochę męczące. Zatem podsumowanie:
Podsumowanie
Przejście z C++ do Javy aż takie trudne nie jest. Wystarczy przyzwyczaić się do nowych reguł. Stworzenie konsolowej aplikacji nie powinno stanowić problemu dla piszącego w C, gdyż jest funkcja printf, będąca w System.out (a zatem: System.out.printf(String, ...);), która działa identycznie jak ta z C
TerDimTris
A teraz odnośnie mojego projektu: Aplikacja wykonana w Javie, powinna działać na Windowsie i Unixach bez problemu. Używa shaderów GLSL, które nie są moim dziełem (trochę je tylko zmodyfikowałem). Zamierzam ją skończyć, jednak po dwóch dniach jest już w miarę grywalna. Nazwę wziąłem ze skrótów z j. łacińskiego: Ter - trój, Dim - wymiar, Tris - to akurat z teTris'a. Gra z pozoru łatwa - bo te same klocki co w 2d (na razie), a 3 wymiary, ale im więcej, tym trudniej się połapać (ułatwię to, bo na razie jeszcze nie zbija się rzędów) i jest trudniejsza.
Najwięcej kłopotów miałem z rzucanymi wyjątkami z nieznanych powodów i systemem kolizji (bardzo drobny błąd kosztował mnie kilka godzin szukania problemu).
Do pobrania
http://tizaw.boo.pl/razi/TerDimTris/TerDim_2dni.zip
Sterowanie
Wymagania (na oko, razem z Maszyną)