Prezentacja wprowadzająca do programowania niskopoziomowego w j2me. Przygotowana i wygłoszona przez Marcina Stachniuka 05.11.2009.
Prezentacja wygłoszona w ramach Warsztatów programowania telefonów komórkowych w j2me przy Studenckim Kole Naukowym Informatyki Systemów Autonomicznych i Adaptacyjnych ISA^2.
02 Tworzenie graficznego inferface’u użytkownika niskiego poziomu w j2me
1. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Tworzenie graficznego inferface’u użytkownika
niskiego poziomu
Marcin Stachniuk
mstachniuk@gmail.com
Politechnika Wrocławska
Wydział Elektroniki
Studenckie Koło Naukowe Informatyki Systemów Autonomicznych
i Adaptacyjnych ISA2
5 listopad 2009
Marcin Stachniuk Tworzenie GUI niskiego poziomu 1/44
2. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Plan prezentacji
1 Podstawy rysowania
2 Obsługa klawiszy i ekranu dotykowego
3 Ulepszony Canvas
4 Sprite
5 TiledLayer
6 Podsumowanie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 2/44
3. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Plan prezentacji
1 Podstawy rysowania
2 Obsługa klawiszy i ekranu dotykowego
3 Ulepszony Canvas
4 Sprite
5 TiledLayer
6 Podsumowanie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 3/44
4. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Displayable
Display.setCurrent(Displayable nextDisplayable) - ustawienie co ma
być wyswietlane na ekranie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 4/44
5. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Canvas
Canvas
Klasa bazowa do pisania aplikacji wykorzystujących GUI
niskopoziomowe (low-level).
O Canvas’ie należy myśleć jak o przestrzeni po której możemy
malować.
Marcin Stachniuk Tworzenie GUI niskiego poziomu 5/44
6. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Canvas - możliwości
Metody:
boolean isDoubleBuffered() - test czy Canvas jest podwójnie
buforowany
repaint() - zgłoszenie konieczności odmalowania ekranu
serviceRepaints() - wymuszenie odmalowania
setFullScreenMode(boolean mode) - ustawienie pełnego
ekranu (od MIDP 2.0)
protected abstract void paint(Graphics g) - abstrakcyjna
metoda, w której odbywa się rysowanie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 6/44
7. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Graphics
Graphics
Klasa służąca do rysowania prymitywów, obrazków i tekstów.
Metody:
setColor(int RGB) / setColor(int red, int green, int blue) -
ustawienie aktualnego koloru
drawLine(int x1, int y1, int x2, int y2) - malowanie linii
drawRect(int x, int y, int width, int height) - malowanie
prostokąta
fillRect(int x, int y, int width, int height) - malowanie
wypełnionego prostokąta
Marcin Stachniuk Tworzenie GUI niskiego poziomu 7/44
8. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Graphics
Malowanie tekstu:
setFont(Font font) - ustawienie czcionki
drawString(String str, int x, int y, int anchor) - wydrukowanie
napisu
drawChar(char character, int x, int y, int anchor) -
wydrukowanie znaku
Marcin Stachniuk Tworzenie GUI niskiego poziomu 8/44
9. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Graphics - anchor
Wyrównanie textu w poziomie:
LEFT - do lewej
HCENTER - wyśrodkowane
RIGHT - do prawej
Wyrównanie textu w pionie:
TOP - do góry
BASELINE - wyśrodkowanie do lini bazowej
BOTTOM - do dołu
Marcin Stachniuk Tworzenie GUI niskiego poziomu 9/44
10. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Image
Metody:
static Image createImage(String name) - wczytywanie orazka
z pliku
int getHeight() - pobranie wysokości obrazka
int getWidth() - pobranie szerokości obrazka
Wyświetlanie za pomocą klasy Graphics:
drawImage(Image img, int x, int y, int anchor) - malowanie
obrazka
Marcin Stachniuk Tworzenie GUI niskiego poziomu 10/44
11. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Szkielet aplikacji cz. 1 I
LowLevel01.java
1 public class LowLevel01 extends MIDlet implements Runnable {
2
3 private LowLevelCanvas canvas;
4
5 public void startApp() {
6 canvas = new LowLevelCanvas();
7 Display display = Display.getDisplay(this);
8 display.setCurrent(canvas);
9 Thread thread = new Thread(this);
10 thread.start();
11 }
Marcin Stachniuk Tworzenie GUI niskiego poziomu 11/44
13. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Szkielet aplikacji cz. 3 I
LowLevelCanvas.java
1 public class LowLevelCanvas extends Canvas {
2 private boolean endGame = false;
3
4 public LowLevelCanvas() {
5 init();
6 }
7
8 private void init() {
9 }
10
11 public void think() {
12 }
13
14 public void paint(Graphics g) {
15 }
16 public boolean isEndGame() {
17 return endGame;
18 }
19 }
Marcin Stachniuk Tworzenie GUI niskiego poziomu 13/44
14. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Podstawy rysowania - demo
LowLevel01.zip LowLevel02.zip
Marcin Stachniuk Tworzenie GUI niskiego poziomu 14/44
15. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Plan prezentacji
1 Podstawy rysowania
2 Obsługa klawiszy i ekranu dotykowego
3 Ulepszony Canvas
4 Sprite
5 TiledLayer
6 Podsumowanie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 15/44
16. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Obsługa klawiszy
Metody:
keyPressed(int keyCode) - naciśnięto klawisz
keyReleased(int keyCode) - puszczono klawisz
keyRepeated(int keyCode) - powtórzono klawisz
Kody klawiszy
KEY NUM0, KEY NUM1, KEY NUM2, KEY NUM3,
KEY NUM4, KEY NUM5, KEY NUM6, KEY NUM7,
KEY NUM8, KEY NUM9, KEY STAR, KEY POUND
Akcje gry
UP, DOWN, LEFT, RIGHT, FIRE, GAME A, GAME B, GAME C,
GAME D
Marcin Stachniuk Tworzenie GUI niskiego poziomu 16/44
17. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Obsługa klawiszy - przykład I
1 protected void keyPressed(int keyCode) {
2 switch (getGameAction(keyCode)) {
3 case Canvas.LEFT:
4 // naciśnięto w lewo
5 break;
6
7 case Canvas.RIGHT:
8 // naciśnięto w prawo
9 break;
10 }
11 }
LowLevel03.zip
Marcin Stachniuk Tworzenie GUI niskiego poziomu 17/44
18. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Obsługa ekranu dotykowego
Metody:
boolean hasPointerEvents() - test czy telefon obsługuje ekran
dotykowy
boolean hasPointerMotionEvents() - test czy telefon wspiera
przesuwanie po ekranie dotykowym
pointerPressed(int x, int y) - obsługa ”wciśnięcia” ekranu
pointerReleased(int x, int y) - obsługa ”puszczenia” ekranu
pointerDragged(int x, int y) - obsługa ”przesuwania”
wskaźnikiem po ekranie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 18/44
19. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Plan prezentacji
1 Podstawy rysowania
2 Obsługa klawiszy i ekranu dotykowego
3 Ulepszony Canvas
4 Sprite
5 TiledLayer
6 Podsumowanie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 19/44
20. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
GameCanvas
GameCanvas
Rozszerzenie klasy Canvas, wpomagajace pisanie gier. Umożliwia
zastosowanie podwójnego buffora przy malowaniu i statusu
wciśniętych klawiszy.
Metody:
Graphics getGraphics() - uzyskanie dostępu do buffora
ekranowego
flushGraphics() - podmiana wyświetlanego buffora,
odświeżenie ekranu
int getKeyStates() - pobranie statusu klawiatury
Marcin Stachniuk Tworzenie GUI niskiego poziomu 20/44
21. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
GameCanvas - Szkielet aplikacji cz. 1 I
LowLevel04.java
1 public void run() {
2 while(!canvas.isEndGame()) {
3 canvas.inputKeys();
4 canvas.think();
5 canvas.paint();
6 }
7 destroyApp(false);
8 notifyDestroyed();
9 }
Marcin Stachniuk Tworzenie GUI niskiego poziomu 21/44
23. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
GameCanvas - demo
LowLevel05.zip
Marcin Stachniuk Tworzenie GUI niskiego poziomu 23/44
24. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Plan prezentacji
1 Podstawy rysowania
2 Obsługa klawiszy i ekranu dotykowego
3 Ulepszony Canvas
4 Sprite
5 TiledLayer
6 Podsumowanie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 24/44
25. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Sprite
http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/game/Sprite.html
Marcin Stachniuk Tworzenie GUI niskiego poziomu 25/44
26. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Sprite - podstawowe właściwości
Metody:
int getHeight() - pobranie wysokości
int getWidth() - pobranie szerokości
int getX() - pobranie współrzędnej X
int getY() - pobranie współrzędnej Y
setPosition(int x, int y) - ustawienie pozycji
move(int dx, int dy) - przesuniecie o dany wektor
paint(Graphics g) - namalowanie Sprite’a
setVisible(boolean visible) - ustawienie widoczności
boolean isVisible() - sprawdzenie widoczności
Marcin Stachniuk Tworzenie GUI niskiego poziomu 26/44
27. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Sprite - możliwość animacji
Konstruktor:
Sprite(Image image, int frameWidth, int frameHeight)
Metody:
setFrameSequence(int[] sequence) - ustawienie sekwencji
kolejnych klatek animacji
nextFrame() - następna klatka
prevFrame() - poprzednia klatka
int getFrame() - pobranie numeru aktualnej klatki
setFrame(int sequenceIndex) - ustawienie aktualnej klatki
animacji
Marcin Stachniuk Tworzenie GUI niskiego poziomu 27/44
28. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Sprite - możliwość transformacji
Transformacje:
TRANS MIRROR, TRANS MIRROR ROT180,
TRANS MIRROR ROT270, TRANS MIRROR ROT90,
TRANS NONE, TRANS ROT180, TRANS ROT270,
TRANS ROT90
http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/game/Sprite.html
Marcin Stachniuk Tworzenie GUI niskiego poziomu 28/44
29. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Sprite - demo
LowLevel06.zip
Marcin Stachniuk Tworzenie GUI niskiego poziomu 29/44
30. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Sprite - wykrywanie kolizji
Metody:
boolean collidesWith(Image image, int x, int y, boolean
pixelLevel) - test kolizji z obrazkiem
boolean collidesWith(Sprite s, boolean pixelLevel) - test kolizji
z innym Sprite’m
defineCollisionRectangle(int x, int y, int width, int height) -
definicja obszaru kolizyjnego
Marcin Stachniuk Tworzenie GUI niskiego poziomu 30/44
31. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Sprite - wykrywanie kolizji - demo
LowLevel07.zip
Marcin Stachniuk Tworzenie GUI niskiego poziomu 31/44
32. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Plan prezentacji
1 Podstawy rysowania
2 Obsługa klawiszy i ekranu dotykowego
3 Ulepszony Canvas
4 Sprite
5 TiledLayer
6 Podsumowanie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 32/44
33. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
TiledLayer
http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/game/TiledLayer.html
Marcin Stachniuk Tworzenie GUI niskiego poziomu 33/44
34. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
TiledLayer
http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/game/TiledLayer.html
Marcin Stachniuk Tworzenie GUI niskiego poziomu 34/44
35. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
TiledLayer
Konstruktor:
TiledLayer(int columns, int rows, Image image, int tileWidth,
int tileHeight) - tworzenie nowego TiledLayer’a
Metody:
fillCells(int col, int row, int numCols, int numRows, int
tileIndex) - częściowe wypełnianie wartościami
setCell(int col, int row, int tileIndex) - ustawienie wartości
danej komórki
getAnimatedTile(int animatedTileIndex) - utworzenie
animawonego kafelka
setAnimatedTile(int animatedTileIndex, int staticTileIndex) -
ustawienie numeru kafelka, który będzie teraz aktualny
Marcin Stachniuk Tworzenie GUI niskiego poziomu 35/44
36. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
TiledLayer - demo
LowLevel08.zip
Marcin Stachniuk Tworzenie GUI niskiego poziomu 36/44
37. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Jak to wszystko wykorzystać?
Sprite: boolean collidesWith(TiledLayer t, boolean pixelLevel) -
sprawdzanie kolizji Sprite’a z TiledLayer’em
Marcin Stachniuk Tworzenie GUI niskiego poziomu 37/44
38. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Sprite i TiledLayer - demo
LowLevel09.zip
Marcin Stachniuk Tworzenie GUI niskiego poziomu 38/44
39. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
GameBuilder
Marcin Stachniuk Tworzenie GUI niskiego poziomu 39/44
40. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Plan prezentacji
1 Podstawy rysowania
2 Obsługa klawiszy i ekranu dotykowego
3 Ulepszony Canvas
4 Sprite
5 TiledLayer
6 Podsumowanie
Marcin Stachniuk Tworzenie GUI niskiego poziomu 40/44
41. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Czego się dzisiaj nauczyliśmy?
Działanie Canvas’u i GameCanvas’u
Malowanie po ekranie za pomocą Graphics
Obsługa klawiszy
Działanie klas Sprite i TiledLayer
Jak można pisać pierwsze gry
Marcin Stachniuk Tworzenie GUI niskiego poziomu 41/44
42. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Pytania
?
Marcin Stachniuk Tworzenie GUI niskiego poziomu 42/44
43. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Kolejne spotkanie
Temat: Tworzenie GUI wysokiego poziomu
Prowadzenie: Marcin Majak
Data: 12.11.2009, godzina: 17.00
Gdzie: sala 23 C-3
Marcin Stachniuk Tworzenie GUI niskiego poziomu 43/44
44. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 5 listopad 2009
Więcej informacji
Kontakt z autorem:
mstachniuk@gmail.com
Strona koła naukowego ISA2
http://autonom.ict.pwr.wroc.pl/
Strona warsztatów:
http://autonom.ict.pwr.wroc.pl/∼mstachniuk
Adres tego dokumentu:
http://autonom.ict.pwr.wroc.pl/∼mstachniuk/files/warsztaty2009/03-lowlevel-2009.11.05.pdf
Pliki z kodami źródłowymi wykorzystywanymi w prezentacji:
http://autonom.ict.pwr.wroc.pl/∼mstachniuk/files/warsztaty2009/LowLevelAll.zip
Tworzenie GUI niskiego poziomu
http://midlety.net/site/praktyka/LowLevelGUI.html
MID Profile - dokumentacja Javadoc
http://java.sun.com/javame/reference/apis/jsr118/
Creating 2D Action Games with the Game API
http://developers.sun.com/mobility/midp/articles/game/
Working with the TiledLayer Class
http://www.dbarnes.com/midlet/tiledlayer/
Getting Started With the MIDP 2.0 Game API
http://developers.sun.com/mobility/midp/articles/gameapi/
GameCanvas - czyli dalej rysujemy po ekranie
http://4programmers.net/Java/J2ME/GameCanvas - czyli dalej rysujemy po ekranie
NetBeans
http://www.netbeans.org/
Marcin Stachniuk Tworzenie GUI niskiego poziomu 44/44