Programowanie na komórki

Embed Size (px)

DESCRIPTION

Prezentacja do wykładu na temat J2ME, czyli programowania w języku Java midletów na komórki. Omawia bardziej lub mniej dokładnie wszystkie moduły wchodzące w skład standardu MIDP 2.0. Ma 98 slajdów.

Citation preview

  • 1. Programowanie na komrki
      • J2ME, MIDP 2.0
    • Adam Sawicki
    • http://regedit.gamedev.pl/
    • [email_address]
    • Grudzie 2007
    • W prezentacji wykorzystane s fragmenty dokumentacji MIDP 2.1 firmy Sun.

2. Programowanie na komrki

  • W czym pisa programy na komrki?
    • To zaley od klasy telefonu.

(nic) Java Java, C++ i inne... 3. Agenda

  • Wprowadzenie do J2ME
  • Midlet
  • GUI
  • Wejcie-wyjcie
  • Internet
  • Grafika 2D
  • Programowanie gier 2D
  • Kilka drobiazgw
  • Baza danych
  • Multimedia
  • Rozszerzenia

4. Wprowadzenie do J2ME J2ME Wireless Toolkit Jzyk Java w J2ME 5. Co to jest J2ME?

  • Skrty, duo skrtw...
    • J2ME Java 2 Platform, Micro Edition
      • Platforma Java na komrki (inne to J2SE i J2EE)
    • CLDC Connected Limited Device Configuration
    • MIDP Mobile Information Device Profile
    • JSR Java Specification Request
      • Specyfikacje dodatkw (np. JSR-184 to M3G)
  • W praktyce uywamy dokumentacji MIDP, ona zawiera te dokumentacj CLDC
    • MIDP 1.0 CLCD 1.0, MIDP 2.0 CLDC 1.1

6.

  • Ten sam jzyk Java
    • Uywamy tego samego kompilatora javac
  • Zupenie nowa biblioteka standardowa
    • Podajemy niestandardowy classpath
  • Liczne ograniczenia sprztu
    • Mao pamici RAM
    • Wolny procesor
    • Niska rozdzielczo wywietlacza, mao kolorw
    • Kiepska klawiatura
    • Due zrnicowanie klawiatur, ekranw, wydajnoci

Jakie jest J2ME? 7. Co jest potrzebne?

  • JDK Java Development Kit
    • Zawiera w sobie JRE - Java Runtime Environment
  • Java Wireless Toolkit
  • Edytor lub IDE
    • jEdit, Notatnik, Vim, Emacs, ...
    • NetBeans, Eclipse, ...
  • Wszystko dostpne za darmo ( java.sun.com ).

8. Hello World!

  • import javax.microedition.midlet.*;
  • import javax.microedition.lcdui.*;
  • public class HelloWorld
  • extends MIDlet
  • implements CommandListener
  • {
  • public HelloWorld()
  • {
  • }
  • //////
  • // Implementacja MIDlet
  • protected void startApp()
  • throws MIDletStateChangeException
  • {
  • Alert alert = new Alert("Hello World!");
  • alert.setCommandListener(this);
  • alert.addCommand(new Command("Koniec", Command.EXIT, 0));
  • Display display = Display.getDisplay(this);
  • display.setCurrent(alert);
  • }
  • protected void pauseApp()
  • {
  • }
  • protected void destroyApp(boolean unconditional)
  • throws MIDletStateChangeException
  • {
  • }
  • //////
  • // Implementacja CommandListener
  • public void commandAction(Command c, Displayable d)
  • {
  • if (c.getCommandType() == Command.EXIT)
  • notifyDestroyed();
  • }
  • }

9. Rczne budowanie midletu

  • Midlet mona zbudowa rcznie z wiersza polece
    • Kompilacja: javac (JDK)
    • Preweryfikacja: preverify (WTK)
    • Napisanie pliku MANIFEST.MF
    • Utworzenie paczki: jar (JDK)
    • Napisanie pliku JAD
    • Emulacja: emulator (WTK)
    • Wysanie na komrk
  • ...ale nie trzeba, mona prociej!

10. Wireless Toolkit

  • Sun Java(TM) Wireless Toolkit for CLDC
    • Tytuowy program pakietu Wireless Toolkit
    • Proste IDE do midletw

11. Wireless Toolkit

  • Operuje na projektach
    • Przechowuje je w Documents and SettingsLOGINj2mewtkappsNAZWA
    • Zakada kilka katalogw
      • src pliki JAVA
      • res obrazki, dwiki i inne zasoby
      • lib dodatkowe biblioteki
      • classes, tmpclasses pliki tymczasowe
      • bin pliki wynikowe JAR, JAD
  • Polecenia
    • Kompilacja: Build
    • Emulacja: Run
    • Utworzenie paczki: Create Package
  • Nie posiada edytora!

12. Jzyk Java

  • Dostpny mamy normalny jzyk Java
    • Klasy, wyjtki
    • byte, short, int, long, boolean, char itd.
    • String, StringBuffer
    • float, double od wersji MIDP 2.0
    • NIE MA generics, enum itp. to jest Java 1.2

13. Wielowtkowo

  • J2ME to platforma ograniczona, ale nowoczesna.
    • Mona, a nawet trzeba pisa wielowtkowo i zajmowa si synchronizacj.
  • JEST dostna wielowtkowo:
    • Sowo kluczowe synchronized
    • Metody klasy bazowej Object: wait, notify, notifyAll
    • Klasa Thread, interfejs Runnable

14. Biblioteka standardowa

  • Podstawowe typy
    • java.lang Boolean, Character, Integer itd.
    • java.lang String, StringBuffer
  • Matematyka
    • java.lang.Math abs, max, sin, floor, sqrt, ...
      • BRAKUJE exp, log, pow, atan2
    • java.util.Random generator liczb pseudolosowych
  • Struktury danych
    • java.util Vector, Stack, Hashtable

15. Midlet javax.microedition.midlet 16. Midlet

  • Midlet program na komrk w J2ME
    • Analogicznie do: aplet, servlet
  • NIE MA kolejki komunikatw ani jawnej ptli jak w Windows API
  • JEST sterowany zdarzeniami, jak programy w Delphi czy C#
  • PosiadaSTAN

17. Midlet szkielet klasy

  • importjavax.microedition.midlet .*;
  • public class HelloWorld extendsMIDlet
  • {
  • public HelloWorld()
  • {
  • }
  • protected voidstartApp ()
  • throws MIDletStateChangeException
  • {
  • }
  • protected voidpauseApp ()
  • {
  • }
  • protected voiddestroyApp (boolean unconditional)
  • throws MIDletStateChangeException
  • {
  • }
  • }

18. Midlet - zdarzenia

  • startApp()
    • Program staje si aktywny
    • Dokona inicjalizacji, wczyta zasoby, pokaza co na ekranie
    • Jeli nie udaje si uaktywni, rzuci wyjtek MIDletStateChangeException
    • Jeli nieodwracalny bd, wywoa notifyDestroyed
  • pauseApp()
    • Program staje si nieaktywny
    • Zwolni wszystkie zasoby zajmujce duo procesora lub pamici
  • destroyApp(boolean unconditional)
    • Program zostaje wyczony
    • Zapisa trwae dane
    • Jeli odmawia wyczenia, rzuci wyjtek MIDletStateChangeException (tylko jeli unconditional == false)

19. Midlet zmiana stanu

  • notifyDestroyed()
    • Wywoa jeli program chce si zakoczy
    • destroyApp nie zostanie ju wywoane!
  • notifyPaused()
    • Wywoa jeli program chce si sta nieaktywny
  • resumeRequest()
    • Wywoa jeli program chce si sta aktywny
  • platformRequest(String URL)
    • Wywoa aby system obsuy podany URL, np. tel:NUMER

20. GUI javax.microedition.lcdui 21. GUI - Klasy

  • Pakiet:
  • javax.microedition.lcdui

22. Wysoki i niski poziom

  • API wysokiego poziomu
    • Zawiera: kontrolki GUI i polecenia
    • Dla: aplikacji biznesowych
    • Abstrakcyjne, niezalene od rozdzielczoci
    • Rysowane wg stylu danego telefonu
  • API niskiego poziomu
    • Zawiera: moliwo rysowania i reakcji na wejcie z klawiatury
    • Dla: gier
    • Zalene od wywietlacza i klawiatury danego telefonu
    • Wygld i obsuga implementowane samodzielnie

23. Alert

  • Alert ekran z komunikatem tekstowym
    • Co jak znany z Windowsa MessageBox :)
  • // Utwrz ekran komunikatu
  • Alert alert = newAlert (
  • "Bd",// title
  • "Nie mona otworzy pliku.", // alertText
  • null,// alertImage
  • AlertType.ERROR);// alertType
  • // Pobierz singleton wywietlacza
  • Display display =Display.getDisplay (this);
  • // Poka komunikat na wywietlaczu
  • display. setCurrent (alert);

24. Command i CommandListener

  • Zaimplementowa w jakiej klasie L interfejs CommandListener
  • Utworzy jaki ekran E typu pochodnego od Displayable
  • Wywoa: E. setCommandListener (L_obj);
  • Wywoa dowoln liczb razy: E. addCommand ( new Command (label, commandType, priority));
  • Pokaza E na wywietlaczu: display. setCurrent (E);
  • Czeka na zdarzenia...

25. Command i CommandListener

  • public class TestMidlet extends MIDlet implementsCommandListener
  • {
  • protected void startApp() throws MIDletStateChangeException
  • {
  • Alert alert = new Alert("Wyjcie", "Czy na pewno chcesz wyj?",
  • null, null);
  • alert. setCommandListener (this);
  • alert. addCommand (newCommand ("Zakocz", Command.EXIT, 0));
  • alert. addCommand (newCommand ("Wr", Command.BACK, 0));
  • Display display = Display.getDisplay(this);
  • display.setCurrent(alert);
  • }
  • public voidcommandAction (Command c, Displayable d)
  • {
  • if (c. getCommandType () == Command.EXIT)
  • notifyDestroyed();
  • else if (c. getCommandType () == Command.BACK)
  • Display.getDisplay(this).setCurrent(m_OtherScreen);
  • }

26. Command

  • label nazwa
  • commandType semantyka (znaczenie) Stae: Command.BACK, CANCEL, EXIT, HELP, OK, SCREEN, STOP, do pozostaych ITEM
  • priority okrela kolejno

27. Command

  • Telefon sam okrela rozmieszczenie i sposb uruchamiania polece
  • Kiedy polece jest duo, zapewnia menu

28. Obrazek

  • Obrazek w pamici reprezentuje klasa Image
  • Obrazek moe by Mutable lub Immutable
  • Jedyny na pewno wspierany format to PNG

29. Obrazek - wykorzystanie

  • try
  • {
  • Image image =Image.createImage ("/Ikonka.png");
  • Alert alert = new Alert(
  • "Wyjcie",
  • "Czy na pewno chcesz wyj?",
  • image ,
  • null);
  • alert.setCommandListener(this);
  • alert.addCommand(new Command("Zakocz", Command.EXIT, 0));
  • alert.addCommand(new Command("Wr", Command.BACK, 0));
  • Display display = Display.getDisplay(this);
  • display.setCurrent(alert);
  • }
  • catch ( java.io.IOExceptione)
  • {
  • e.printStackTrace();
  • }

Plik w podkatalogu res/ 30. Lista

  • Listm_List;
  • protected void startApp() throws MIDletStateChangeException
  • {
  • m_List = newList ("Lista",Choice.EXCLUSIVE );
  • m_List. append ("Opcja 1", null);
  • m_List. append ("Opcja 2", null);
  • m_List. append ("Opcja 3", null);
  • m_List.setCommandListener(this);
  • m_List.addCommand(new Command("Zakocz", Command.EXIT, 0));
  • m_List.addCommand(new Command("OK", Command.OK, 0));
  • Display display = Display.getDisplay(this);
  • display.setCurrent(m_List);
  • }
  • public void commandAction(Command c, Displayable d)
  • {
  • if (c.getCommandType() == Command.EXIT)
  • notifyDestroyed();
  • else if (c.getCommandType() == Command.OK)
  • GoFurther(m_List. getSelectedIndex ());
  • }

31. Lista wielokrotnego wyboru

  • List m_List;
  • protected void startApp() throws MIDletStateChangeException
  • {
  • m_List = new List("Lista",Choice.MULTIPLE );
  • m_List.append("Opcja 1", null);
  • m_List.append("Opcja 2", null);
  • m_List.append("Opcja 3", null);
  • m_List.setCommandListener(this);
  • m_List.addCommand(new Command("Zakocz", Command.EXIT, 0));
  • m_List.addCommand(new Command("OK", Command.OK, 0));
  • Display display = Display.getDisplay(this);
  • display.setCurrent(m_List);
  • }
  • public void commandAction(Command c, Displayable d)
  • {
  • if (c.getCommandType() == Command.EXIT)
  • notifyDestroyed();
  • else if (c.getCommandType() == Command.OK)
  • GoFurther(m_List. isSelected (0), m_List. isSelected (1), m_List. isSelected (2));
  • }

32. Lista jako menu

  • List m_List;
  • protected void startApp() throws MIDletStateChangeException
  • {
  • m_List = new List("Lista",Choice.IMPLICIT );
  • m_List.append("Opcja 1", null);
  • m_List.append("Opcja 2", null);
  • m_List.append("Opcja 3", null);
  • m_List.setCommandListener(this);
  • m_List. setSelectCommand (new Command("Wybierz", Command.ITEM, 0));
  • Display display = Display.getDisplay(this);
  • display.setCurrent(m_List);
  • }
  • public void commandAction(Command c, Displayable d)
  • {
  • if (c.getCommandType() == Command.ITEM)
  • GoFurther(m_List.getSelectedIndex());
  • }

33. Czcionka

  • Fontfont =Font. getFont (
  • Font. FACE_MONOSPACE ,
  • Font. STYLE_BOLD ,
  • Font. SIZE_LARGE );
  • m_List = new List("Lista", Choice.IMPLICIT);
  • m_List.append("Opcja 1", null);
  • m_List.append("Opcja 2", null);
  • m_List.append("Opcja 3", null);
  • m_List. setFont (0, font);
  • m_List. setFont (1, font);
  • m_List. setFont (2, font);

34. Czcionka

  • face : FACE_MONOSPACE FACE_PROPORTIONAL FACE_SYSTEM
  • style : STYLE_BOLD STYLE_ITALIC STYLE_PLAIN STYLE_UNDERLINED
  • size : SIZE_LARGE SIZE_MEDIUM SIZE_SMALL
  • Nie zawsze dostajemy podane, rnice si czcionki!

35. TextBox

  • TextBoxm_TextBox;
  • protected void startApp() throws MIDletStateChangeException
  • {
  • m_TextBox = newTextBox ("Login", "", 32, 0);
  • m_TextBox.setCommandListener(this);
  • m_TextBox.addCommand(new Command("OK", Command.OK, 0));
  • Display display = Display.getDisplay(this);
  • display.setCurrent(m_TextBox);
  • }
  • public void commandAction(Command c, Displayable d)
  • {
  • if (c.getCommandType() == Command.OK)
  • GoFurther(m_TextBox. getString ());
  • }

36. TextBox - Constraints

  • Ograniczenia: TextField.ANY TextField.EMAILADDR TextField.NUMERIC TextField.PHONENUMBER TextField.URL TextField.DECIMAL
  • Modyfikatory: TextField.PASSWORD TextField.UNEDITABLE TextField.SENSITIVE TextField.NON_PREDICTIVE TextField.INITIAL_CAPS_WORD TextField.INITIAL_CAPS_SENTENCE

37. Formularz

  • m_Form = newForm ("Formularz");
  • Item item;
  • item =newStringItem ("Twoje dane", "Tu wpisz swoje dane", 0);
  • item.setLayout(Item.LAYOUT_2 | Item.LAYOUT_NEWLINE_AFTER);
  • m_Form.append(item);
  • item =newTextField ("Imi", "Twoje imi", 32, 0);
  • item.setLayout(Item.LAYOUT_2 | Item.LAYOUT_NEWLINE_AFTER);
  • m_Form.append(item);
  • item = new TextField("Nazwisko", "Twoje nazwisko", 32, 0);
  • item.setLayout(Item.LAYOUT_2 | Item.LAYOUT_NEWLINE_AFTER);
  • m_Form.append(item);
  • m_Form.setCommandListener(this);
  • m_Form.addCommand(new Command("OK", Command.OK, 0));
  • Display display = Display.getDisplay(this);
  • display.setCurrent(m_Form);
  • Kilka rnych kontrolek na jednym ekranie.

38. Kontrolki statyczne

  • m_Form = new Form("Formularz");
  • Image image;
  • try
  • {
  • image = Image.createImage("/Ikonka2.png");
  • }
  • catch (java.io.IOException e)
  • {
  • e.printStackTrace();
  • image = null;
  • }
  • m_Form.append(newStringItem (null, "Napis...", Item.PLAIN));
  • m_Form.append(newSpacer (32, 32));
  • m_Form.append(newImageItem (null, image, ImageItem.LAYOUT_DEFAULT, null));
  • m_Form.setCommandListener(this);
  • m_Form.addCommand(new Command("OK", Command.OK, 0));
  • Display display = Display.getDisplay(this);
  • display.setCurrent(m_Form);

39. TextField

  • Pole do wprowadzania tekstu
  • Flagi takie same jak dla TextBox
  • m_Form.append(newTextField (
  • "URL",
  • "http://www.google.pl/",
  • 256,
  • TextField.URL));

40. Gauge

  • Suwak do wybierania wartoci liczbowej
  • m_Form.append(newGauge (
  • "Gono", // label
  • true,// interactive
  • 9,// maxValue
  • 5));// initialValue

41. DateTime

  • Wybr daty i/lub czasu
  • m_Form.append(newDateField (
  • "Data",DateField.DATE ));
  • m_Form.append(newDateField (
  • "Czas",DateField.TIME ));
  • m_Form.append(newDateField (
  • "Data i czas",DateField.DATE_TIME ));

42. ChoiceGroup

  • Lista, podobnie jak ekran List
  • String[] elements = {
  • "Opcja 1", "Opcja 2", "Opcja 3"
  • };
  • m_Form.append(newChoiceGroup (
  • "ChoiceGroup",// label
  • Choice.EXCLUSIVE , // choiceType
  • elements,// elements
  • null));// imageElements

43. ChoiceGroup - rodzaje

  • Choice.EXCLUSIVE
  • Choice.MULTIPLE
  • Choice.POPUP

44. Alert raz jeszcze - Indicator

  • Inne zastosowanie kontrolki Gauge
    • Pokazywanie postpu wewntrz ekranu Alert
  • Alert alert = new Alert(
  • "Loading",
  • "Trwa adowanie gry, prosz czeka...",
  • null,
  • AlertType.INFO);
  • alert. setIndicator (newGauge (
  • null,// label
  • false, // interactive
  • 9,// maxValue
  • 0));// initialValue
  • alert.setTimeout(Alert.FOREVER);

Musi tak by Flagi: INDEFINITE, CONTINUOUS_IDLE, CONTINUOUS_RUNNING, INCREMENTAL_IDLE, INCREMENTAL_UPDATING 45. Ticker

  • Tekst przelatujcy u gry ekranu
    • Dostpny na dowolnym ekranie metoda setTicker klasy Displayable
  • Alert alert = new Alert(
  • "Loading",
  • "Trwa adowanie gry, prosz czeka...",
  • null,
  • AlertType.INFO);
  • alert.setTimeout(Alert.FOREVER);
  • Ticker ticker = newTicker ("REKLAMA!!!");
  • alert. setTicker (ticker);

46. Timer, TimerTask

  • java.util.Timer pozwala zakolejkowa zadania do wykonania za/co okrelony czas
  • java.util.TimerTask klasa bazowa dla zada
  • Kady Timer to osobny wtek
    • Tre zadania jest wykonywana w osobnym wtku.
    • Czy nie warto czasem napisa wasny wtek zamiast uywa Timera?

47. Timer - przykad

  • Gauge m_Gauge;
  • java.util.Timerm_Timer;
  • protected void startApp()
  • throws MIDletStateChangeException
  • {
  • Alert alert = new Alert(
  • "Loading",
  • "Trwa adowanie gry, prosz czeka...",
  • null,
  • AlertType.INFO);
  • alert.setTimeout(Alert.FOREVER);
  • m_Gauge = new Gauge(null, false, 9, 0);
  • alert.setIndicator(m_Gauge);
  • Display display = Display.getDisplay(this);
  • display.setCurrent(alert);
  • m_Timer =new java.util.Timer ();
  • m_Timer. schedule (new MyTask(), 500, 500);
  • }
  • private class MyTask
  • extends java.util.TimerTask
  • {
  • public voidrun ()
  • {
  • m_Gauge.setValue(
  • m_Gauge.getValue() + 1);
  • }
  • }

48. Wejcie-wyjcie java.io 49. Wejcie-wyjcie

  • Pakiet java.io - strumienie

50. Wejcie-wyjcie

  • InputStream- abstrakcyjna klasa bazowa do odczytywania danych binarych jako bajty
  • OutputStream- abstrakcyjna klasa bazowa do zapisywania bajtw jako dane binarne
  • DataInput- interfejs do odczytywania danych binarnych jako rne typy
    • DataInputStream- nakadka na InputStream do odczytywania danych binarnych jako rne typy
  • DataOutput- interfejs do zapisywania rnych typw jako dane binarne
    • DataOutputStream- nakadka na OutputStream do zapisywania rnych typw jako dane binarne
  • Writer abstrakcyjna klasa bazowa do zapisywania znakw
    • OutputStreamWriter- nakadka na strumie zapisujca do niego znaki
  • Reader- abstrakcyjna klasa bazowa do odczytywania znakw
    • InputStreamReader- nakadka na strumie odczytujca z niego znaki

51. Wczytanie pliku tekstowego

  • String s;
  • try
  • {
  • java.io.InputStreamis =
  • this. getClass().getResourceAsStream ("/Test.txt");
  • StringBuffer sb = new StringBuffer();
  • int i;
  • while ( (i = is. read ()) != -1 )
  • sb.append( (char)i );
  • s = sb.toString();
  • }
  • catch ( java.io.IOExceptione)
  • {
  • e.printStackTrace();
  • s = "";
  • }
  • // Plik resTest.txt

52. Wczytanie pliku binarnego

  • String s;
  • try
  • {
  • java.io.InputStream is =
  • this.getClass().getResourceAsStream("/Test.bin");
  • java.io.DataInputStreamdis =
  • new java.io.DataInputStream(is);
  • int i = dis. readInt() ;
  • s = Integer.toString(i);
  • }
  • catch (java.io.IOException e)
  • {
  • e.printStackTrace();
  • s = "";
  • }
  • // Plik resTest.bin (Big Endian!)

53. Internet javax.microedition.io 54. Internet

  • HTTP javax.microedition.io.HttpConnection
  • HTTPS, SSL/TLS javax.microedition.io.HttpsConnection javax.microedition.io.SecureConnection
  • TCP, UDP javax.microedition.io.SocketConnection javax.microedition.io.ServerSocketConnection javax.microedition.io.DatagramConnection javax.microedition.io.UDPDatagramConnection
  • Push javax.microedition.io.PushRegistry
  • Port szeregowy javax.microedition.io.CommConnection

55. HTTP - przykad

  • import java.io.*;
  • import javax.microedition.io.*;
  • try {
  • HttpConnectionc =
  • (HttpConnection) Connector.open ("http://www.google.pl");
  • int ResponseCode = c. getResponseCode ();
  • if (ResponseCode != HttpConnection.HTTP_OK)
  • // Bd!
  • String ContentType = c. getType ();
  • int Length = (int)c. getLength ();
  • InputStream is = c. openInputStream ();
  • ...
  • }
  • catch (java.io.IOException e)
  • {
  • ...
  • }

56. Grafika 2D

    • Canvas
    • Graphics

57. Canvas

  • Klasajavax.microedition.lcdui.Canvas
    • Dziedziczy z Displayable
    • Ekran cakowicie do dyspozycji dla programisty
    • Rczne rysowanie i obsuga wejcia
  • Sposb uycia:
    • Zdefiniowa klas dziedziczc zCanvas
    • Zaimplementowa metody: Obowizkowo:paint Opcjonalnie:sizeChanged, showNotify, hideNotify, keyPressed, keyReleased, keyRepeated, pointerDragged, pointerPressed, pointerReleased

58. Canvas - przykad

  • private class MyCanvasextends Canvas
  • {
  • protected voidpaint ( Graphicsg)
  • {
  • g.setColor(0xFF000000);
  • g.fillRect(0, 0, getWidth(), getHeight());
  • g.setColor(0xFFFFFFFF);
  • g.drawString("Hello World!", 4, 4,
  • Graphics.TOP | Graphics.LEFT);
  • }
  • }
  • protected void startApp()
  • throws MIDletStateChangeException
  • {
  • MyCanvas canvas = new MyCanvas();
  • Display display = Display.getDisplay(this);
  • display.setCurrent(canvas);
  • }

59. Sprawdzanie moliwoci

  • Pami Runtime rt = Runtime.getRuntime(); rt.totalMemory(), rt.freeMemory()
  • Wywietlacz Display d = Display.getDisplay(this); d.isColor(), d.numColors(), d.numAlphaLevels()
  • Canvas c.getWidth(), c.getHeight(), c.isDoubleBuffered(), c.hasPointerEvents(), c.hasPointerMotionEvents(), c.hasRepeatEvents()

60. Rnorodno moliwoci

  • Klawiatura
    • Zestaw wymaganych klawiszy + niestandardowe
    • Problemy z klawiszami wciskanymi jednoczenie
  • Urzdzenie wskazujce
    • Cakowicie opcjonalnie
  • Ekran
    • Bardzo rnorodne rozdzielczoci 128x128, 128x160 176x220, 240x320 i inne...
    • Niektre ekrany s wysze, inne szersze! 640x200, 320x240 i inne...
    • FullScreen nawet wtedy mog pozosta paski! canvas.setFullScreenMode(true);

61. Graphics ustawienia

  • Prostokt przycinania
  • Kolor
  • Czcionka
  • Styl linii SOLID, DOTTED
  • Pocztek ukadu wsprzdnych

62. Graphics rysowanie

  • g. drawLine (4, 4, 32, 32);
  • g. drawRect (36, 4, 28, 28);
  • g. drawRoundRect (68, 4, 28, 28, 16, 16);
  • g. drawArc (100, 4, 28, 28, 20, 200);
  • g. fillTriangle (4, 36, 32, 50, 4, 64);
  • g. fillRect (36, 36, 28, 28);
  • g. fillRoundRect (68, 36, 28, 28, 16, 16);
  • g. fillArc (100, 36, 28, 28, 20, 200);

63. Graphics tekst, obrazek

  • g. drawString ("Hello World!", getWidth()/2, 4,
  • Graphics. TOP| Graphics. HCENTER );
  • g. drawImage (m_Image, getWidth()/2, getHeight()/2,
  • Graphics. HCENTER| Graphics. VCENTER );
    • Anchor: Graphics.BOTTOM, TOP, VCENTER, BASELINE, LEFT, VCENTER, RIGHT

64. Canvas - klawiatura

  • private class MyCanvas extends Canvas
  • {
  • protected voidkeyPressed (intkeyCode )
  • {
  • // ...
  • }
  • protected voidkeyReleased (intkeyCode )
  • {
  • // ...
  • }
  • protected voidkeyRepeated (intkeyCode )
  • {
  • // ...
  • }
  • // ...

Canvas.KEY_NUM0 KEY_NUM9 KEY_STAR (*) KEY_POUND (#) if (keyCode > 0) char ch = (char)keyCode; Niestandardowe... Dziaa tylko jeli hasRepeatEvents() 65. Klawisze do gier

  • Mapowanie klawiszy zwykych na akcje gry: getGameAction
  • Stae akcji gry: Canvas.UP, DOWN, LEFT, RIGHT, FIRE, GAME_A, GAME_B, GAME_C, GAME_D
  • protected void keyPressed(int keyCode)
  • {
  • int game_action =getGameAction (keyCode);
  • if (game_action == Canvas. FIRE )
  • Fire();
  • else if (game_action == Canvas. UP )
  • Jump();
  • // ...
  • }

66. Programowanie gier 2D

    • GameCanvas
    • Layer
    • LayerManager

67. GameCanvas

  • Pakietjavax.microedition.lcdui.game
    • Klasy przeznaczone do pisania gier 2D
  • KlasaGameCanvas
    • Dziedziczy z Canvas
    • Zapewnie podwjne buforowanie obrazu
    • Umoliwia odpytywanie o wcinite klawisze
  • Ptl gry trzeba zrealizowa samemu
    • Za pomoc Timera lub
    • Za pomoc wasnego wtku

68. Ptla gry propozycja

  • private class MyCanvas
  • extends GameCanvas
  • implements Runnable
  • {
  • public MyCanvas()
  • {
  • super(false);
  • setFullScreenMode(true);
  • }
  • public void run()
  • {
  • Graphics g = getGraphics();
  • while (true){
  • int keyState =getKeyStates() ;
  • if ((keyState & LEFT_PRESSED ) !=0)
  • // ...
  • // Obliczenia...
  • // Rysowanie...
  • g.setColor(0xFF000000);
  • g.fillRect(0, 0,
  • getWidth(), getHeight());
  • flushGraphics() ; // Koniec rysowania
  • }
  • }
  • }
  • MyCanvas m_MyCanvas;
  • Thread m_Thread;
  • protected void startApp()
  • throws MIDletStateChangeException
  • {
  • m_MyCanvas = new MyCanvas();
  • Display display = Display.getDisplay(this);
  • display.setCurrent(m_MyCanvas);
  • m_Thread = newThread (m_MyCanvas);
  • m_Thread. start ();
  • }

69. Wejcie z klawiatury

  • getKeyStates() Zwraca flagi bitowe z wcinitymi w danej chwili klawiszami
  • super(false); Zdarzenia keyPressed, keyReleased, keyRepeated nie bd generowane - wydajno!
      • Stae GameCanvas.
      • LEFT_PRESSED RIGHT_PRESSED UP_PRESSED DOWN_PRESSED
      • FIRE_PRESSED
      • GAME_A_PRESSED GAME_B_PRESSED GAME_C_PRESSED GAME_D_PRESSED

70. Pomiar czasu i FPS

  • long StartTime =System.currentTimeMillis() ;
  • long LastTime = 0;
  • long t = 0, dt = 0;
  • long LastFpsTime = 0;
  • int FpsCounter = 0, Fps = 0;
  • while (true) {
  • int KeyStates = getKeyStates();
  • CalcFrame (t, dt, KeyStates);
  • DrawFrame (g);
  • DrawFPS (Fps);
  • flushGraphics();
  • LastTime = t;
  • t =System.currentTimeMillis()- StartTime;
  • dt = t LastTime;
  • FpsCounter++;
  • if (LastFpsTime + 1000 0 fragment obrazka rdowego
  • < 0 komrka animowana
  • Zastosowanie np. animowana woda

78. Sprite - kolizje

  • Wsparcie dla kolizji midzy obiektami
    • Take z kafelkami TiledLayer
    • Take na poziomie przezroczystoci pojedynczych pikseli !!!

79. LayerManager

  • Klasa upraszczajca zarzdzanie obiektami 2D
    • Jej wykorzystanie jest opcjonalne.
  • Przechowuje list obiektw klasy Layer
    • Pamita kolejno
    • Pozwala je narysowa jednym wywoaniem
  • Oddzielenie prostokta ekranu od prostokta rysowanej sceny
    • Zaleta #1: Rysowanie widoku tylko w ograniczonym prostokcie
    • Zaleta #2: Przewijanie mapy

80. Kilka drobiazgw Wibracja Waciwoci systemu Obsuga bdw 81. Wibracja

  • Dodatkowy efekt zmysowy!
    • Niedostpny na PC
    • Chyba, e gracz ma joypad z Force Feedback i uywasz DirectInput...
  • Display display = Display.getDisplay(this);
  • display. vibrate (200);
  • Wywoanie jest asynchroniczne nie blokuje
  • Podawany czas jest w milisekundach
    • 0 oznacza wyczenie wibracji

82. Waciwoci systemu

  • System.getProperty
  • Waciwoci standardowe microedition.profiles microedition.configuration microedition.locale itd...
  • Waciwoci dodatkowe microedition.m3g.version Bluetooth.api.version video.encodings itd...

83. Obsuga bdw

  • Trzeba zawsze apa wyjtki lub deklarowa ich zgaszanie
    • Jak zawsze w Javie.
    • S to np.:
      • java.io.IOException podczas wczytywania plikw
      • java.lang.InterruptedException przy oczekiwaniu w Thread, np. join(), sleep()
  • W emulatorze dziaaSystem.out.println()
    • A wic takeThrowable.printStackTrace()
  • Image image;
  • try {
  • image = Image.createImage("/Obrazek.png);
  • }
  • catch ( java.io.IOExceptione) {
  • e. printStackTrace ();
  • image = null;
  • }

84. Baza danych javax.microedition.rms.RecordStore 85. Baza danych???

  • MIDP nie daje dostpu do systemu plikw
    • Chyba, e przez rozszerzenie JSR-75
    • Nie ma innej moliwoci zachowania trwaych danych ni RMS
  • RMS Record Management System
    • Pakietjavax.microedition.rms , klasaRecordStore
    • Aplikacja moe tworzy i uywa baz danych. Kada ma nazw.
    • Baza danych skada si z rekordw. Kady ma identyfikator oraz tre surowe dane binarne.

86. Dodawanie rekordu

  • import java.io.*;
  • import javax.microedition.rms.*;
  • try
  • {
  • RecordStorers = RecordStore. openRecordStore ("Baza1", true);
  • ByteArrayOutputStreambaos = new ByteArrayOutputStream();
  • DataOutputStreamdos = new DataOutputStream(baos);
  • dos.writeUTF("Mieczysaw");
  • dos.writeInt(1000);
  • byte[] data = baos.toByteArray();
  • int rec_id = rs. addRecord (data, 0, data.length);
  • }
  • catch (RecordStoreException e) { }
  • catch (IOException e) { }

87. Enumeracja rekordw

  • try
  • {
  • RecordStore rs = RecordStore.openRecordStore("Baza1", true);
  • RecordEnumerationre = rs. enumerateRecords (null, null, false);
  • while (re. hasNextElement ())
  • {
  • int id = re. nextRecordId ();
  • ByteArrayInputStreambais =
  • new ByteArrayInputStream(rs. getRecord (id));
  • DataInputStreamdis = new DataInputStream(bais);
  • String name = dis.readUTF();
  • int score = dis.readInt();
  • System.out.println(name + " - " + score);
  • }
  • }
  • catch (RecordStoreException e) { }
  • catch (IOException e) { }

88. Enumeracja - filtrowanie

  • private class MyFilterimplements RecordFilter
  • {
  • public booleanmatches (byte[] candidate)
  • {
  • try {
  • ByteArrayInputStream bais = new ByteArrayInputStream(candidate);
  • DataInputStream dis = new DataInputStream(bais);
  • String name = dis.readUTF();
  • int score = dis.readInt();
  • return (score > 1000);
  • }
  • catch (IOException e) { e.printStackTrace(); return false; }
  • }
  • }
  • ...
  • RecordEnumeration re = rs.enumerateRecords( new MyFilter() , null, false);

89. Enumeracja - sortowanie

  • private class MyComparatorimplements RecordComparator
  • {
  • public intcompare (byte[] rec1, byte[] rec2)
  • {
  • try {
  • ByteArrayInputStream bais1 = new ByteArrayInputStream(rec1);
  • ByteArrayInputStream bais2 = new ByteArrayInputStream(rec2);
  • DataInputStream dis1 = new DataInputStream(bais1);
  • DataInputStream dis2 = new DataInputStream(bais2);
  • int score1 = dis1.readInt();
  • int score2 = dis2.readInt();
  • String name1 = dis1.readUTF();
  • String name2 = dis2.readUTF();
  • int cmp = name1.compareTo(name2);
  • if (cmp < 0)returnRecordComparator.PRECEDES ;
  • else if (cmp == 0) returnRecordComparator.EQUIVALENT ;
  • elsereturnRecordComparator.FOLLOWS ;
  • }
  • catch (IOException e) {
  • e.printStackTrace();
  • return RecordComparator.PRECEDES;
  • }
  • }
  • }
  • ...
  • RecordEnumeration re = rs.enumerateRecords(null,new MyComparator() , false);

90. Inne moliwoci

  • Operacje na rekordach addRecord, getRecord, getRecordSize, deleteRecord
  • Nasuchiwanie zmian addRecordListener, removeRecordListener, interfejs RecordListener
  • Informacje o bazie danych getNumRecords, getSize, getSizeAvailable, getLastModified, getVersion
  • Operacje na bazach danych listRecordStores, openRecordStore, deleteRecordStore
  • Wspdzielenie baz danych midzy midletami...

91. MIDP 2.0 Media API javax.microedition.media 92. MIDP 2.0 Media API

  • Zapewnia podstawowe API do odtwarzania multimediw
    • Tylko dwik
    • Rozszerzane przez Mobile Media API (JSR-135)
  • Nie gwarantuje obsugi adnych formatw
    • Jedynie proste generowanie odgosw

93. MIDP 2.0 Media API

  • Manager
    • Klasa statyczna
    • Dostarcza informacji na temat moliwoci multimedialnych urzdzenia
    • Umoliwia tworzenie Playerw
  • Player
    • Odtwarza konkretny zasb multimedialny
    • Pozwala na sterowanie odtwarzaniem
    • Posiada stany
    • Pozwala na pobieranie kontrolerw
  • Control
    • Pozwala na regulacj parametrw odtwarzania, np. gonoci

94. Odtwarzanie dwiku

  • try {
  • Player p =Manager.createPlayer ("http://adres.pl/ding.wav");
  • p.setLoopCount(5);
  • p. start ();
  • }
  • catch (IOException ioe) { }
  • catch (MediaException me) { }
  • try {
  • InputStream is = getClass().getResourceAsStream("/ding.wav");
  • Player p =Manager.createPlayer (is, "audio/X-wav");
  • p. start ();
  • }
  • catch (IOException ioe) { }
  • catch (MediaException me) { }

95. Obsugiwane formaty

  • Content Type typ MIME, np.:
    • Dwik WAV:audio/x-wav
    • Dwik AU:audio/basic
    • Dwik MP3:audio/mpeg
    • Dwik MIDI:audio/midi
    • Tone sequence:audio/x-tone-seq

96. Player stany 97. Rozszerzenia MIDP 2.0 to nie koniec... 98. Przykady rozszerze

  • Grafika 3D
    • Mobile 3D Graphics API M3G (JSR-184)
    • Mascot Capsule
  • Grafika i multimedia
    • Mobile Media API (JSR-135)
    • Nokia UI API
  • Dostp do plikw
    • FileConnection (JSR-75)
  • Dostp do danych PIM (kontakty itp.)
    • PIM (JSR-75)
  • czno
    • Java APIs for Bluetooth (JSR-82)
    • Wireless Messaging API WMA (JSR-120)
  • Wiele innych...