Sekcja Inżynierii Oprogramowania Koła Naukowego Informatyków Wydziału Matematyki i Informatyki Uniwersytetu Adama Mickiewicza w Poznaniu Czyli w skrócie: kINO ;)
Gratulacje dla Adama i Pawła!! Ale zanim zaczniemy… Gratulacje dla Adama i Pawła!!
Czyli: „Napisz swoją własną grę na komórkę” Wprowadzenie do J2ME Czyli: „Napisz swoją własną grę na komórkę” Mariusz Lisiecki, III rok Informatyka
Program wykładu Ogólnie o J2ME – CDC, CLDC, MIDP Wybrane środowiska programistów J2ME Przykładowe kody prostych MIDletów Możliwości J2ME 3D w J2ME Publikowanie swoich MIDletów Raport z NetBeansDay – Wykład NetBeans Mobility Pack – wybrane zagadnienia Przyszłość J2ME (Dalsza) literatura
J2ME – co to właściwie jest? Java 2 Micro Edition, a właściwie Java Platform, Micro Edition Specyfikacja opracowana przez Sun Microsystems Rozbudowane i elastyczne środowisko do programowania aplikacji uruchamianych na urządzeniach mobilnych i wbudowanych … Telefony komórkowe Palmtopy PDA’s (Personal Digital Assistant) TV set-top boxes (? ;) Drukarki Inne … czyli urządzeniach z ograniczeniami nałożonymi na: pamięć, wyświetlanie oraz energię.
Java Platform
J2ME – składowe i podziały Na J2ME składają się 3 rzeczy: Konfiguracja – podstawowy zbiór bibliotek Profil – zbiór różnych API (Application Programming Interface) obsługiwany przez węższe grono urządzeń Pakiety opcjonalne – zbiór API powiązanych z konkretnymi technologiami J2ME przyjęło się dzielić na 2 bazowe konfiguracje CDC – Connected Device Configuration – konfiguracja dla urządzeń z większymi możliwościami, np. smartfonów CLDC – Connected Limited Device Configuration – konfiguracja dla ‘słabszych’ urządzeń, np. telefonów komórkowych
CLDC i MIDP Dwie wersje CLDC CLDC 1.0 – bazowa CLDC 1.1 – główną różnicą jest wsparcie dla operacji zmiennoprzecinkowych MIDP – Mobile Information Device Profile – uzupełnienie konfiguracji o dodatkowe klasy użytkowe MIDP 1.0 MIDP 2.0 – zweryfikowane MIDP 1.0 + dodatkowe API, rozszerzające możliwości o: ulepszony interfejs graficzny obsługa multimediów ułatwienia dla programistów gier więcej możliwości komunikacyjnych poprawione bezpieczeństwo MIDP 3.0 – w konstrukcji MIDP + CLDC pozwala na tworzenie różnorakich aplikacji: gier, aplikacji biznesowych
Wybrane środowiska programistyczne Sun Java Wireless Toolkit (WTK) brak wbudowanego edytora kodu EclipseME – plugin do Eclipse’a NetBeans Mobility Pack
Dlaczego NetBeans Mobility Pack? Bo używa NetBeans ;) W wersji NetBeans 6.0+ standardowo zawarty w środowisku … … co oznacza brak konieczności instalacji, jak w przypadku Eclipse’a Dobry graficzny edytor dla tzw. Visual MIDlet’ów łatwiejsze uruchamianie niż w Eclipse przy zmianie skóry emulatora nie robi jakichś dziwnych preweryfikacji, kompilacji itd.. wbudowany (niedoskonały niestety ) edytor do SVG (zgodnym z SVG tiny (SVG 1.1) ) w NetBeans 6.0
MIDlety Aplikacja uruchamiana na urządzeniu mobilnym obsługującym MIDP Przeważnie grupuje je się w zestawy MIDletów, tzw. MIDlet Suites Plik .jar Plik .jad Aplikacja musi posiadać klasę rozszerzającą javax.microedition.midlet.MIDlet
MIDlety – 3 x 3 3 abstrakcyjne metody 3 stany startApp() destroyApp() pauseApp() 3 stany aktywny spauzowany zniszczony 3 metody zmieniające stan notifyPaused() notifyDestroyed() resumeRequest()
Meine erste MIDlet ;) import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /** * @author Mariusz Lisiecki */ public class ErsteMIDlet extends MIDlet { public ErsteMIDlet() { Form form = new Form("Meine erste MIDlet!"); String hallo = "Wilkomm, die Welt!"; form.append(hallo); Display.getDisplay(this).setCurrent(form); } public void startApp() {} public void pauseApp() {} public void destroyApp(boolean unconditional) {}
Inne rodzaje wyświetlaczy Form uniwersalna Canvas najbardziej użyteczny dla gier List menu aplikacji, itp. TextBox okienko tekstowe pokrywa cały wyświetlacz Alert używany do komunikatów
Canvas Pozwala na rysowanie, a także na przechwytywanie wciśniętych klawiszy, obsługę wskaźnika Klasa abstrakcyjna trzeba zaimplementować metodę paint(Graphics g) aby odrysować jej zawartość należy wywołać metodę repaint(); pozostałe metody ‘zdarzeniowe’ nie są abstrakcyjne, ale za to są po prostu puste (np. metody keyPressed(), keyReleased(), itp.) posiada kody dla klawiszy Rozszerzenie możliwości – klasa GameCanvas wbudowane podwójne buforowanie kolejkowanie wciśnięty klawiszy
Interfejs użytkownika - komendy Próżno szukać ‘buttonów’ – przycisków Za to są polecenia – klasa Command Command(etykieta, typ, priorytet); typ określa rodzaj komendy, ma wpływ na położenie priorytet pozwala na tworzenie kilku komand takiego samego typu Wzorzec projektowy Listener W klasie wyświetlacza (Form, Canvas), który ma reagować na wybór komendy, musi zostać ustawiony Słuchacz: metoda setCommandListener( CommandListener cl );
CommandListener Interfejs Trzy podejścia: Trzeba zaimplementować metodę: commandAction( Command c, Displayable d) Trzy podejścia: MIDlet obsługuje zdarzenia wszystkich swoich wyświetlaczy (implementuje interfejs), a następnie w jakiejś swojej metodzie dla każdego wyświetlacza wywołuje setCommandListener(this); Niezbyt dobre podejście dla dużej liczby wyświetlaczy Każdy wyświetlacz implementuje interfejs CommandListener osobno Wykorzystanie klas anonimowych w każdym z wyświetlaczy: setCommandListener( new CommandListener() { public void commandAction( … } );
Możliwości J2ME Multimedia Obsługa RMS (Record Management Store) Oddzielne API: Mobile Media API 1.1 – JSR-135 Nie jest powszechnie dostępne w telefonach komórkowych … … dlatego najbardziej podstawowe elementy wydzielono i dołożono do MIDP 2.0 Możliwości: odtwarzanie plików dźwiękowych (midi/wav/mp3?) odtwarzanie plików wideo (mpeg) nagrywanie audio wykonywanie zdjęć nagrywanie plików wideo Obsługa RMS (Record Management Store)
Możliwości J2ME Przetwarzanie XML (eXtensible Markup Language) JAXP – JAva XML Parser część JSR-172 (J2ME Web Services) … … która wymaga MIDP 2.0 … … a do tego nie występuje we wszystkich telefonach, które ten profil posiadają Alternatywa: darmowa biblioteka kXML w przeciwieństwie do JAXP, obsługuje dwa modele parsowania dokumentu XML SAX (Simple API for XML) – parsowanie „linijka po linijce” DOM (Document Object Model) – wczytuje cały dokument i tworzy drzewo
Możliwości J2ME Bluetooth JSR-82 - Bluetooth API Łączenie się telefonów między sobą Łączenie się z serwerami na których działają serwlety
Możliwości J2ME Obsługa SVG (Scallable Vector Graphics) Nie musimy się przejmować wielkością wyświetlacza Niestety potrzeba plików kompatybilnych z SVG Tiny (SVG 1.1) … a o środowisko ciężko (chyba?) w NetBeans 6.0 dodatkowe pakiety wspierające współpracę z SVG + wspomniany wbudowany (aczkolwiek bardzo niedoskonały jeszcze) edytor wizualny + ‘ręczny’ do plików
Gry w J2ME!!! pakiet javax.microedition.lcdui.game Użycie wspomnianej GameCanvas (ale wymaga MIDP 2.0 – w przypadku 1.0 śmiało można próbować ze ‘zwykłym’ Canvas) funkcje i ‘stałe’: keyPressed(), keyReleased(), keyRepeated() int getGameAction(int keyCode) UP, RIGHT, DOWN, LEFT, FIRE, GAME_A, itp… klasa Sprite warstwy: Layer, TiledLayer, LayerManager
Gry w J2ME!!! 3D 3D w 2D - dla słabszych telefonów ‘stara dobra technika’ -> RayCasting Wymaga znajomości dość skopmlikowanych algorytmów oraz biegłości w matematyce Java 3D Mobile – JSR 184 Dwa tryby: immediate retained – dla leniwych
Java 3D Mobile Możliwości: Definiowanie ‘dowolnych’ struktur za pomocą trójkątów Definiowanie normalnych do powierzchni Możliwy Culling – pomijanie rysowania powierzchni niewidocznych Dodawanie świateł (różnego rodzaju) do sceny Dodawanie tekstur i materiałów do obiektów Dodawanie wielu kamer do sceny (oczywiście ujęcie w danej chwili tylko z jednej) Możliwa animacja
Java 3D Mobile Tryb immediate Dość skomplikowane, Kilkanaście klas, Dla definiowania obiektów: VertexArray, VertexBuffer, IndexBuffer, TriangleStripArray, Dla świateł: Light, Material, PolygonMode Dla tekstur: Texture2D, Appearance Dla kamer: Camera Dla przekształceń: Transform (Macierz) Ale za to nad wszystkim panujemy. Niestety łatwo o błąd…
Java 3D Mobile Tryb Retained Graf sceny – idealnie nadaje się do tworzenia i efektywnego zarządzania złożonymi scenami. Proste i zwięzłe kody Możliwość wczytywania gotowych obiektów a nawet światów z pliku zewnętrznego w formacie .m3g Można zatem użyć dowolnego środowiska graficznego, które posiada opcję eksportu sceny do pliku .m3g np. Blender (eksport do .m3g możliwy po ściągnięciu pliku) http://www.nelson-games.de/bl2m3g/source/m3g_export.py Nawet animację i tekstury można określić ‘na zewnątrz’ Niestety nie można przesadzić… a i tak może to się odbić na wydajności.
Publikowanie swoich MIDletów w internecie Przegrywamy pliki .jar i .jad naszej aplikacji na serwer (np. z wykorzystaniem klienta FTP – WINSCP) W telefonie wpisujemy adres serwera wraz z plikiem .jad, np. http://atos.wmid.amu.edu.pl/~d301627/Mobile3DTest.jad po połączeniu powinny się pojawić informacje o aplikacji (nazwa, dostawca, itp.) oraz prośba o potwierdzenie pobrania … ale być może, że nie zadziała i plik jad zostanie wyświetlony jako plik tekstowy … :/ trzeba się wtedy dowiedzieć, czy serwer obsługuje odpowiednie typy MIME (Multipurpose Internet Mail Extensions) dla plików .jad: text/vnd.sun.j2me.app-descriptor dla plików .jar: application/java-archive
Przyszłość J2ME MIDP 3.0 ? (na bazie dyskusji z NetBeansDay) Coraz większe możliwości urządzeń – coraz lepsze telefony komórkowe, itp. J2SE na telefonach? – Być może za 5 lat… Nowa technologia JavaFX Mobile Póki co jedna wielka niewiadoma… Docelowo ma „wchłonąć” J2ME
(Dalsza) Literatura Zbyt wielu pozycji książkowych po polsku nie ma… Krzysztof Rychlicki-Kicior: „J2ME. Java dla urządzeń mobilnych. Ćwiczenia” zupełne podstawy, dla początkujących Krzysztof Rychlicki-Kicior: „J2ME. Praktyczne projekty” użyteczne projekty, laicy też sobie poradzą Janusz Grzyb: „J2ME. Tworzenie gier” bardzo dobra i do tego w miarę aktualna pozycja - polecam http://java.sun.com/javame/reference/apis/jsr118/index.html - dokumentacja on-line MIDP 2.0 http://www.jcp.org/en/jsr/detail?id=184 – Java Mobile 3D (JSR 184 – Java Specification Request 184) http://www.sun.com/software/javafx/mobile/index.jsp - JavaFX Mobile - by przekonać się, że praktycznie nic tam nie ma :/ ;)
Dziękuję za uwagę, cierpliwość i wyrozumiałość! Do zobaczenia na następnym wykładzie!!