Programowanie i instrumenty regionalnej polityki miejskiej na ...
Programowanie na komórki
-
Upload
adam-sawicki -
Category
Technology
-
view
1.467 -
download
4
description
Transcript of Programowanie na komórki
- 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...