Ộ Ộ

Ậ Ậ

Ế Ế

Ị Ị

L P TRÌNH J2ME CHO THI T B  DI Đ NG L P TRÌNH J2ME CHO THI T B  DI Đ NG

PH N 2ẦPH N 2Ầ

No love no life

ệ ở ứ ệ ở ứ

ầ ầ

ấ ủ ứ ấ ủ ứ

ụ ụ

3.Các thành ph n giao di n  3.Các thành ph n giao di n

m c th p c a  ng d ng MIDP  m c th p c a  ng d ng MIDP ệ

ủ ệ ằ ấ ả t c  các công vi c b ng tay. Canvas là  ử ế ị t b  trình bày và x  lý s  ki n. L p

 Các hàm API c p cao cho ta t o ra giao di n các  ng d ng theo chu n, các hàm  ớ ưở ể ệ ng c a mình. Canvas và Graphics là 2 l p  API c p th p cho ta th  hi n các ý t ạ ấ chính c a các hàm API c p th p. B n làm t ự ệ ẽ ườ m t khung v  mà ng i phát tri n v  lên thi ụ ẽ ư Graphics cung c p các công c  v  nh  drawRoundRect() và drawString()

ế

ẽ ạ :cung c p m t khung v  t o giao di n tùy bi n ng

 L p Canvas

ự ệ

ẽ ả

ườ ỗ

ươ

ể ử

ng th c trong l p này đ  x  lý s  ki n, v   nh và chu i lên thi

ố i dùng. Đa s   ế ị ể t b  hi n

ầ ọ ộ

ố ượ

ng Canvas ố ượ

ớ các ph ẽ ị th . Trong ph n này s  bao g m các m c: ệ ố •  H  th ng t a đ ạ •  T o đ i t ẽ ng Canvas •  V  lên trên đ i t ử ự ệ •  X  lý các s  ki n hành đ ng ấ ự ệ ử •  X  lý các s  ki n phím nh n ự ệ ử ủ •  X  lý s  ki n hành đ ng c a Game ự ệ ử •  X  lý s  ki n con tr

ộ ỏ

2

ệ ố ệ ố

ớ ề ả ị

ng Canvas ng Canvas    ầ t b . Tr  x tăng d n v  ph i,

ộ ố ượ ộ ố ượ ủ ế ị ể ả

ệ ọ ộ ị ọ ộ ộ ầ ố

ụ ọ ộ ạ ụ ọ ộ ạ H  th ng tr c t a đ , t o m t đ i t H  th ng tr c t a đ , t o m t đ i t ể  H  t a đ  cho l p Canvas: tâm t a đ  là đi m trái trên c a thi ẽ i. Đ  dày bút v  là m t đi m  nh.

tr  y tăng d n khi xu ng d

 Các ph

ươ ứ ủ ề ướ ẽ ộ ề ộ ng th c sau đây s  giúp xác đ nh chi u r ng và chi u cao c a canvas: ị

ề ộ ề ị ủ ủ

 Đ u tiên t o ra m t l p th a k  t

ộ ớ ạ ầ • int getWidth(): xác đ nh chi u r ng c a canvas ị • int getHeight (): xác đ nh chi u cao c a canvas  l p Canvas

ừ ế ừ ớ class TestCanvas extends Canvas implements CommandListener { private Command cmdExit; ... display = Display.getDisplay(this); cmdExit = new Command("Exit", Command.EXIT, 1); addCommand(cmdExit); setCommandListener(this); ... protected void paint(Graphics g) { // Draw onto the canvas   g.setColor(255, 255, 255);                         // Set background color to white   g.fillRect(0, 0, getWidth(), getHeight());  // Fill the entire canvas } } TestCanvas canvas = new TestCanvas(this);

 Ph

ươ ủ ớ ẽ ả ứ ẽ ạ ấ ỗ ạ ng th c paint c a l p Canvas cho phép b n v  các hình d ng, v   nh, xu t chu i

3

ự ệ ự ệ

ự ệ ể ử ộ

ộ    ộ S  ki n hành đ ng S  ki n hành đ ng ể ử

 M t Canvas có th  x  lý các Command. Chúng ta có th  x  lý các s  ki n Command trên

ư ầ ầ thành ph n Canvas cung cách nh  các thành ph n khác

 Mã phím ườ

ế ậ ề ng h p x  lý các hành đ ng c a các phím m m, m t Canvas có th  truy c p đ n 12 mã ộ ấ ỳ ể ế ị ủ ả ợ ử ữ ộ ượ ả c đ m b o luôn luôn có trên b t k  các thi t b  MIDP nào

ứ ể ử ươ ng th c đ  x  lý các mã phím là:

Tr phím. Nh ng mã này đ KEY_NUM0 KEY_NUM1 KEY_NUM2 KEY_NUM3 KEY_NUM4 KEY_NUM5 KEY_NUM6 KEY_NUM7 KEY_NUM8 KEY_NUM9 KEY_STAR KEY_POUND Năm ph void keyPressed(int keyCode); void keyReleased(int keyCode); void keyRepeat(int keyCode); String getKeyName(int keyCode);

KeyEvents,   Ví du sau: Xu ly cac phim, viet ra ma phim – KeyEvents                  viet ra dung ham getKeyname() ­ KeyCodes KeyCodes

4

ử ử

ộ ộ

ơ    ơ Các hành đ ng trong x  lý các trò ch i Các hành đ ng trong x  lý các trò ch i ề

ườ

ơ

ng đ

 MIDP th ượ ị

ượ ử ụ c s  d ng đ  t o các trò ch i trên n n Java. Các h ng s  sau đã  ể ử

ể ạ ự ệ

ế

ơ

ố c đ nh nghĩa đ  x  lý các s  ki n có liên quan đ n trò ch i trong MIDP

ỉ ướ

c ánh x  thành các phím mũi tên ch  h ộ

ế ị

ng c a  ị t b  di đ ng đ u có nh ng giá tr  này.

ượ ạ ả ấ ả t c  các thi ế

ữ ộ

ơ ẽ t b  di đ ng thi u các phím mũi tên thì các hành đ ng c a trò ch i s   ượ

ấ c ánh x  vào các nút b m, ví d  phím trái đ ứ ế ụ

đ UP DOWN LEFT RIGHT FIRE GAME_A GAME_B GAME_C GAME_D ơ Đ n gi n thì các giá tr  này đ ư ế ị thi t b , nh ng không ph i t ế ị ế N u m t thi ượ ạ đ ả ượ ph i đ

c ánh x  vào phím s  2, phím  ư ế c ánh x  vào phím s  5, và c  ti p t c nh  th .

5

ị ị

ủ ủ

ơ ể ọ

 Đo n mã sau mô t

ơ    ơ Xác đ nh các hành đ ng c a trò ch i Xác đ nh các hành đ ng c a trò ch i ạ ủ ươ

ộ  cách xác đ nh các hành đ ng c a trò ch i đ  g i các  ợ ự

ộ ộ ị ng th c thích h p d a trên các hành đ ng x y ra

ph

protected void keyPressed(int keyCode) {     int gameAction = getGameAction(keyCode);     switch(gameAction) {       case UP:     mMessage = "UP";             break;       case DOWN:   mMessage = "DOWN";           break;       case LEFT:   mMessage = "LEFT";           break;       case RIGHT:  mMessage = "RIGHT";          break;       case FIRE:   mMessage = "FIRE";           break;       case GAME_A: mMessage = "GAME_A";         break;       case GAME_B: mMessage = "GAME_B";         break;       case GAME_C: mMessage = "GAME_C";         break;       case GAME_D: mMessage = "GAME_D";         break;       default:     mMessage = ""; break;     } }  Ví d : hi n th  các phím x  lý s  ki n ­

ự ệ KeyMIDlet KeyMIDlet

6

ớL p Graphics  L p Graphics

ử ụ ộ

ố ượ ế ị ể ẽ ng Graphics đ  v  lên m t Canvas.  ị t b  có h  tr  hi n th  màu không?

ặ ị

 Chúng ta s  d ng đ i t boolean isColor(); //thi  ị ọ ể int numColors(); //g i đ  xác đ nh s  màu  M c đ nh (DefaultColorPhone) là 4096 colors (0x1000) isColor=true; colorCount=0x1000;

ỗ ợ ể ố

 Các ph

ề ươ ứ ấ ng th c l y v  màu và thi

ặ ị

ừ ặ ị 0­255

ả ề ệ

ờ ủ ệ ầ ờ

ệ ầ ờ

ụ ủ ỏ ủ ệ ầ ờ

ả ề ặ ứ ế ậ t l p màu: ờ ệ void setColor(int RGB); //Đ t màu hi n th i qua giá tr  RGB void setColor(int red, int green, int blue); //  đ t màu, các giá tr  red,green.. t ờ int getColor(); //  tr  v  màu hi n th i                                                                                                                                   ả ề int getBlueComponent(); // tr  v  thành ph n màu xanh da tr i c a màu hi n th i 0­255                                                                                                                       ả ề int getGreenComponent();// tr  v  thành ph n màu l c c a màu hi n th i 0­255  int getRedComponent(); // tr  v  thành ph n màu đ  c a màu hi n th i 0­255  void setGrayScale(int value); // đ t m c xám

ả ề ị ừ int getGrayScale(); //tr  v  giá tr  xám t 0­255

Ví d : BLACK = 0; WHITE = 0xffffff; RED = 0xf96868; GREY = 0xc6c6c6;  LT_GREY = 0xe5e3e3;

Hay int red = 0, green = 128, blue = 255;

7

ặ Sau đó đ t màu: g.setColor(WHITE); ho c ặ g.setColor(red, green, blue);

ẽ ẽ

ữ ậ ữ ậ

ữ ậ

ế ị ể

V  cung và hình ch  nh t  V  cung và hình ch  nh t  ọ

ẳ , cung và hình ch  nh t trên thi

ị t b  hi n th .

 Ch n nét khi v  đ

ng th ng ả ề ể

c đ nh nghĩa trong l p Graphics là nét ch m, và nét li n

ẽ ườ ẽ int getStrokeStyle(); //tr  v  ki u nét v ể void setStrokeStyle(int style); // đ t ki u nét v ẽ ượ ị Hai ki u nét v  đ g.setStrokeStyle(Graphics.DOTTED); g.setStrokeStyle(Graphics.SOLID);

:

ẽ  V  cung void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle); void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle);

ọ ộ ể

ữ ậ

c bao b i m t hình ch  nh t có t a đ  đi m trái trên

ầ ề ộ

ượ ắ ầ

ẽ ộ ề

ế

g.drawArc(10, 10, 100, 100, 0, 150); Đo n mã trên yêu c u v  m t cung, cung này đ là (10, 10), chi u r ng và chi u dài là 100, góc b t đ u là 0, góc k t thúc là 150.

Ví dụ: VeCungCanvas VeCungCanvas ữ ậ  V  hình ch  nh t

void drawRect(int x, int y, int width, int height);// void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); void fillRect(int x, int y, int width, int height); void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight);

ườ

ườ

Hình ch  nh t có 4 góc là tròn thì b n ph i xác đ nh đ

ng kính theo chi u ngang(arcWidth) và đ

ng kính

ữ ậ ề ọ theo chi u d c(arcHeight). Ví d : ụ VeHinhChuNhat VeHinhChuNhat

8

Font ch  ữ Font ch  ữ

 Các ph

ươ ứ ự ủ ớ ng th c d ng c a l p Font:

ủ ớ ộ ố Font getFont(int face, int style, int size); Font getFont(int fontSpecifier); Font getDefaultFont();  M t s  thu c tính c a l p Font

ộ FACE_SYSTEM FACE_MONOSPACE FACE_PROPORTIONAL  STYLE_PLAIN STYLE_BOLD STYLE_ITALIC STYLE_UNDERLINED  SIZE_SMALL SIZE_MEDIUM SIZE_LARGE

ố ể ể ượ ế ợ ử ụ Các tham s  ki u dáng có th  đ hay. Ví d

ộ ố ượ ạ ạ ể ấ ị ng Font, b n có th  truy v n nó đ  xác đ nh ế ủ ộ c k t h p thông qua toán t Font font = Font.getFont(Font.FACE_PROPORTIONAL,  Font.STYLE_BOLD | Font.STYLE_ITALIC, Font.SIZE_MEDIUM); ể ế ộ Sau khi b n có m t tham chi u đ n m t đ i t thông tin c a các thu c tich c a nó.

ủ     Ví d : ụ FontChuDonGian FontChuDonGian

9

ủ ể ể ị ị ể ạ ỉ ị c hi n th , thì đi m neo cho phép b n ch  ra v

ểĐi m neo  Đi m neo  ọ ộ  Đ  xác đ nh t a đ  x, y c a chu i ký t ặ ọ ộ

ự ượ  đ ữ ậ ố ỗ ự ỗ trí mu n đ t t a đ  x, y trên hình ch  nh t bao quanh chu i ký t

ề ữ ủ

i

ữ ậ ử ụ ủ ả ỉ

Chi u ngang LEFT (Bên trái) HCENTER (Chính gi a c a chi u ngang) RIGHT (Bên ph i) ả ọ ề Chi u d c  trên)Ở TOP ( ơ ở ườ BASELINE (Đ ng th ng c  s ) Ở ướ )  BOTTOM (  d ọ ộ ể S  d ng đi m neo ph i ch  ra t a đ  x, y c a hình ch  nh t bao quanh.  g.drawString("developerWorks", 0, 0 , Graphics.TOP | Graphics.LEFT);

10

ỗ ỗ

ẽ ẽ

V  các chu i ký t V  các chu i ký t

ự ự

 void drawChar(char character, int x, int y, int anchor);

void drawChars(char[] data, int offset, int length, int x, int y, int anchor); void drawString(String str, int x, int y, int anchor);

 protected void paint(Graphics g)

{   // Get center of display   int xcenter = getWidth() / 2,       ycenter = getHeight() / 2;   // Choose a font   g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_ITALICS,  Font.SIZE_MEDIUM));   // Specify the center of the text (bounding box) using the anchor point   g.drawString("developerWorks", xcenter, ycenter, Graphics.BASELINE |  Graphics.HCENTER); }

 Ví d : thay doi Font chu –

FontChu1 FontChu1

ố ượ

D ch chuy n đ i t

ng –

Ve2Ve2

11

ớ ớ

 V i MIDP 2 thì có thêm 5 l p:

Các l p Game trong MIDP 2 Các l p Game trong MIDP 2 ớ • GameCanvas •

Sprite  Layer  LayerManager  TiledLayer

 Các l p này tìm trong gói: java.microedition.lcdui.game

ự ế ớ

ừ ượ

 Chúng ta không dùng tr c ti p l p Layer, vì th c ch t đây là l p tr u t

ng dùng

ự trong các l p Spite, LayerManager và TiledLayer.

ả ợ ể ự

 L p ớ GameCanvas

ươ GameCanvas: không ph i đ i đ  th c hi n keyPressed() vì ta có ph ệ

double buffering”b n có th  th c hi n v   ừ

ậ ọ ệ

buffer t

ừ ọ

ứ ng th c  ẽ ở ể ự   ơ ớ i các canvas nhanh h n nhi u. Có  ể ả  g i hàm getGraphics(). flushGraphics() đ  gi

ề i phóng

getKeysState(). Có k  thu t g i là “ “off­screen buffer”khi đó vi c copy t ể ử ụ th  s  d ng Graphic t Graphics…

 Ví d  ta có vi c di chuy n ch  ‘x’ dùng GameCanvas –

ExampleGameCanvas ExampleGameCanvas

12

ớL p Sprite L p Sprite ồ

 Trong Game thì đ  ho  làm nên thành công r t l n. H u h t các đ i t

ạ ố ượ ạ ượ ấ ớ ế ầ

ồ ng đ  ho  đ ể ạ ọ ộ ạ ệ ủ ồ ư ạ c  t c a đ  ho  g i là các Sprite. M t Sprite có th  là bullet,

ộ ặ phân lo i nh  các d ng đ c bi monster, enemies, keys và doors và m t vài cái gì đó…

 Các Sprite đ

ề ộ ộ ượ ạ ừ c nhân nhi u lên là các graphic đ ng, các graphic đ ng này đ c t o nên t

 Sprite Constructor

ư ộ ừ ộ ộ ượ cùng m t Sprite nh ng nhìn t các góc khác nhau. Đây là m t b  Sprite:

ớ ớ ở ạ

ạ ộ

ơ ớ ừ ộ ạ m t Sprite

ạ ộ ớ ừ 2 frame

ủ ề ở Có 3 hàm kh i t o v i l p Sprite    Sprite (Image image); // T o ra khung Sprite đ n, không đ ng    Sprite (Sprite sprite); //T o ra Sprite m i t    Sprite (Image image,int frameWidth, int frameHeight); //T o ra Sprite đ ng v i t ộ ộ tr  lên, frameWidth và frameHeight là đ  r ng và chi u cao c a 1 Sprite

ộ ộ ề ổ

ộ ộ ố ộ ủ  Ta có t ng đ  r ng là 160 pixels, đ  r ng c a 1 frame là 32 pixels, chi u cao là 32pixels. Ta  có frameWidth và frameHeight là gi ng nhau cho 1b  Sprite (các Sprite khác thì khác nhau).

ề ằ ố ố ồ ộ ộ  Các Graphic thì bao g m các Sprite mà đ  r ng và chi u cao là h ng s , vì s  các pixel thì

8=256, 216=65536… màu

ế ố ế liên quan đ n s  màu: n u 1pixel là 8­bit, 16­bit, 24­bit… thì 2

13

Sprite Collision, Display Sprite Sequence Sprite Collision, Display Sprite Sequence

 Sprite Collision:

collidesWith(Image image, int x, int y, boolean pixelLevel); collidesWith(Sprite sprite, boolean pixelLevel); collidesWidth(TiledLayer tiledLayer, Boolean pixelLevel); Ki m tra đ ng đ  thông qua v  trí góc trái trên c a Sprite

ộ  Sprite Sequence:

ầ ử

trong 1dãy

ố getFrameSequenceLength();//s  ph n t ờ ủ ỉ ố ệ getFrame();//ch  s  hi n th i c a frame trong dãy ế ỉ ớ i frame ti p theo nextFrame();// ch  t ướ ỉ ớ c i frame tr prevFrame();// ch  t ờ ặ setFrame(int sequenceIndex);//đ t frame hi n th i

14

Sprite Transforms

ể ạ

 Sprite Transforms: bi n d ng có th  t o  ấ

ư

0  1  2  3  4  5  6  7

ế ạ ố ứ Sprite nh  quay, l y đ i x ng   setTransform(int transform);  TRANS_NONE TRANS_MIRROR_ROT180  TRANS_MIRROR  TRANS_ROT180  TRANS_MIRROR_ROT270  TRANS_ROT90  TRANS_ROT270  TRANS_MIRROR_ROT90  Ví d : ụ ExampleGameSprite ExampleGameSprite

15

ư

ứ  c a các l p gi ng nh  chi u th

ườ

ứ ự ủ ả  LayerManager đ  qu n lý các l p Graphic, th  t ấ i dùng nh t.

3 (tr c z). Th  t

ớL p LayerManager L p LayerManager ể ớ ớ ứ ự  0 là l p g n ng append(Layer layer);

ụ  Thêm 1 l p : ớ

private Sprite playerSprite;   private Sprite backgroundSprite; private LayerManager layerManager; Image playerImage = Image.createImage("/transparent.png");       playerSprite = new Sprite (playerImage,32,32);      Image backgroundImage = Image.createImage("/background.png"); backgroundSprite = new Sprite(backgroundImage);     layerManager = new LayerManager();

layerManager.append(playerSprite);      layerManager.append(backgroundSprite); ạ ỏ ộ ớ  remove(Layer layer);// lo i b  m t l p  insert(Layer layer, int index);// thêm 1 l pớ ớ ể  paint(Graphics g, int x, int y); //mu n hi n th  1 l p

Ví d  : ụ ExampleLayerManager ExampleLayerManager

16

LayerManager and Scrolling Background LayerManager and Scrolling Background

ơ

ể ể ộ

ề ớ ộ

ướ

 Đôi lúc màn hình n n l n h n màn hình hi n th , lúc  ả đó chúng ta ph i cu n màn hình. Có th  cu n sang  ố trái, sang ph i, lên trên xu ng d

i.

ể ạ

 Đi m b t đ u là (50,20), ta có th  t o ra đi m đ ng

ắ ầ ố

ể ể đ  nó cu n trên màn hình. if ((keyStates & LEFT_PRESSED) != 0) { if (scnX ­ 1 > 0)   scnX­­; } if ((keyStates & RIGHT_PRESSED) != 0) { if (scnX + 1 + 140 < backgroundImage.getWidth())   scnX++; } if ((keyStates & UP_PRESSED)!=0){ if (scnY­1>0)   scnY­­; } if ((keyStates & DOWN_PRESSED)!=0){

if (scnY+1+140

}

Ví d : ụ CuonManHinhNen CuonManHinhNen

17

ớL p TiledLayer L p TiledLayer ộ ướ

 M t TiledLayer là m t l

ừ i các ô chia ra t 1

ộ nh.ả

 Ví d  hình bên đ

ụ ượ ỉ c chia thành 6 vùng, ta ch

ạ ượ

c đánh s  (b t  ả ồ ừ ầ ừ ố ừ trái sang ph i r i t ớ ố ắ

ộ ộ

 TiledLayer(int columns, int rows, Image image, int tileWidth, int tileHeight); Có s  hàng, c t và  nh c n chia. Đ  r ng và cao c a tile ặ

ra các Tiled có 32x32 pixel. T o nên 1 l p  ỗ TiledLayer, m i 1 tile này đ  1). Đánh s  t đ u t ướ ố trên xu ng d i,

ấ ả   y  nh

ứ ả ở ị v  trí col,row và l

ả ề

ế

ừ ả ề ề

ả ề

ả ề ố ộ ủ

1,2,…6)  getCell(int col, int row);//tr  v  index c a cell, n u cell là empty tr  v  0   getCellHeight();//tr  v  chi u cao c a m t cell (pixel) ủ   getCellWidth();   getColumns();//tr  v  s  c t c a TileLayer   getRows();   Gi ng nh  các Game khác, ta cũng g i tr c ti p hàm paint() hay dùng LayerManager ọ ự ế ư ố

layerManager.paint(g,0,0);

có tileIndex (  setCell(int col, int row, int tileIndex);//đ t tile vào b c  nh   trên là t

18

ụVí d  TiledLayer Ví d  TiledLayer

private LayerManager layerManager; private TiledLayer tiledBackground;     tiledBackground = initBackground(); layerManager = new LayerManager(); layerManager.append(tiledBackground);

for (int i=0; i < map.length; i++) {       int column = i % 8;       int row = (i ­ column) / 8;       tiledLayer.setCell(column,row,map[i]);     }           return tiledLayer;   }

private TiledLayer initBackground() throws Exception {     Image tileImages = Image.createImage("/tiles.png");     TiledLayer tiledLayer = new TiledLayer(8,9,tileImages,32,32); int[] map = {        5,  1,  1,  4,  1,  1,  1,  1,          5,  1,  3,  1,  1,  3,  1,  1,          5,  1,  2,  1,  1,  2,  1,  1,         5,  1,  2,  3,  1,  2,  1,  1,         5,  1,  4,  2,  1,  2,  1,  1,        5,  1,  1,  4,  1,  2,  1,  1,        5,  1,  1,  1,  1,  4,  1,  1,        5,  1,  1,  1,  1,  1,  1,  1,        5,  1,  1,  1,  1,  1,  1,  1,     }; •  Ví d  : ụ ExampleTiledLayer ExampleTiledLayer

19

Animated Cells (1) Animated Cells (1)

ỉ ố  Animated Cell là t p h p đ ng c a các Tile tĩnh. Các Animated Tile là các ch  s

âm. int createAnimatedTile(int staticTileIndex);

ả ề ỉ ố

T o ra Animated Tile tr  v  ch  s  âm (­1,­2..) setAnimatedtile(int animatedTileIndex, int staticTileIndex);

ế ợ

k t h p Animated Tile v i stattic tile ề

for (int i=0; i < map.length; i++) {       int column = i % 8;       int row = (i ­ column) / 8;       tiledLayer.setCell(column,row,map[i]);     }           animatedIdx = tiledLayer.createAnimatedTile(5);     tiledLayer.setCell(1,1,animatedIdx);     return tiledLayer;   } }

20

ạ  T o n n:     private TiledLayer initBackground() throws Exception {     Image tileImages = Image.createImage("/tiles.png");     TiledLayer tiledLayer = new TiledLayer(8,9,tileImages,32,32);     int[] map = {        5,  1,  1,  4,  1,  1,  1,  1,        5,  1,  3,  1,  1,  3,  1,  1,        5,  1,  2,  1,  1,  2,  1,  1,        5,  1,  2,  3,  1,  2,  1,  1,        5,  1,  4,  2,  1,  2,  1,  1,         5,  1,  1,  4,  1,  2,  1,  1,        5,  1,  1,  1,  1,  4,  1,  1,        5,  1,  1,  1,  1,  1,  1,  1,        5,  1,  1,  1,  1,  1,  1,  1};

Animated Cells (2) Animated Cells (2)

private boolean switchTile; private int animatedIdx;…… if (switchTile) {        tiledBackground.setAnimatedTile(animatedIdx,3);            } else {        tiledBackground.setAnimatedTile(animatedIdx,4);            } switchTile = !switchTile;    layerManager.paint(g,0,0); …………………. animatedIdx = tiledLayer.createAnimatedTile(5); tiledLayer.setCell(1,1,animatedIdx);

Ví d : ụ ExampleTiledLayerAnimated ExampleTiledLayerAnimated

public ExampleGameCanvas() throws Exception {     super(true);     width = getWidth();     height = getHeight();     currentX = width / 2;     currentY = height / 2;     delay = 20;     tiledBackground = initBackground();     layerManager = new LayerManager();     layerManager.append(tiledBackground);   } public void run() {     Graphics g = getGraphics();     while (isPlay == true) {       input();       drawScreen(g);       try {    Thread.sleep(delay);       } catch (InterruptedException ie) {}     }}

21

Ví d  : ụVí d  : ụ Animation  (1) Animation (1)  T o Sprite tĩnh: AnimationSprite.java import javax.microedition.lcdui.game.*; import javax.microedition.lcdui.*; public class AnimationSprite extends Sprite {

• Draw frame private void drawDisplay(Graphics g) { // Animated sprite, show next frame in sequence spSpiral.nextFrame(); lmgr.paint(g, 0, 0);   // Paint layers flushGraphics(); }

public AnimationSprite(Image image, int frameWidth, int frameHeight) { super(image, frameWidth, frameHeight); } }  Ch y Animation: public void start() { running = true; Thread t = new Thread(this); t.start(); } public void run() { Graphics g = getGraphics(); while (running) { drawDisplay(g); Try { Thread.sleep(150);  } catch (InterruptedException ie) { System.out.println("Thread exception"); } }}

22

(2), AnimationCanvas.java AnimationCanvas.java

Animation (2),

Ví d  : ụVí d  : ụ Animation import javax.microedition.lcdui.game.*;

import javax.microedition.lcdui.*;

public class AnimationCanvas extends GameCanvas implements Runnable {

private static final int FRAME_WIDTH = 57;

private static final int FRAME_HEIGHT = 53;

private AnimationSprite spSpiral; // Animated sprite

private LayerManager lmgr; // Manage layers

private boolean running = false; // Thread running?

public AnimationCanvas() {

super(true);

Try {

spSpiral = new AnimationSprite(Image.createImage("/spiral.png"),

FRAME_WIDTH, FRAME_HEIGHT);

spSpiral.defineReferencePixel(FRAME_WIDTH / 2, FRAME_HEIGHT / 2);

spSpiral.setRefPixelPosition(getWidth() / 2, getHeight() / 2);

23

Ví d  : ụVí d  : ụ Animation

(3) Animation (3)

lmgr = new LayerManager(); lmgr.append(spSpiral); } catch (Exception e) { System.out.println("Unable to read PNG image"); }

private void drawDisplay(Graphics g) { spSpiral.nextFrame();  lmgr.paint(g, 0, 0); flushGraphics(); } public void stop() { running = false; } }

} public void start() { running = true; Thread t = new Thread(this); t.start(); } public void run() { Graphics g = getGraphics(); while (running) { drawDisplay(g); Try { Thread.sleep(150); } catch (InterruptedException ie) { System.out.println("Thread exception"); } } }

24

(4), Animation.java

Ví d  : ụVí d  : ụ Animation

Animation (4),

import javax.microedition.midlet.*; import javax.microedition.lcdui.*;

public class Animation extends MIDlet implements CommandListener { private Display display; // Reference to display private AnimationCanvas canvas; // Game canvas private Command cmExit; // Exit command

public Animation() { display = Display.getDisplay(this); cmExit = new Command("Exit", Command.EXIT, 1); if ((canvas = new AnimationCanvas()) != null) { canvas.addCommand(cmExit); canvas.setCommandListener(this); }} public void startApp() { if (canvas != null) { display.setCurrent(canvas); canvas.start(); } } public void pauseApp() {}

public void destroyApp(boolean unconditional) { canvas.stop();  } public void commandAction(Command c,  Displayable s) { if (c == cmExit) { destroyApp(true); notifyDestroyed(); } }  }

25

Collisions, , AppleSprite.java, CubeSprite.java và StarSprite.java

Ví d : ụVí d : ụ Collisions import javax.microedition.lcdui.game.*;

import javax.microedition.lcdui.game.*;

import javax.microedition.lcdui.*;

import javax.microedition.lcdui.*;

public class AppleSprite extends Sprite{

public class CubeSprite extends Sprite{

public AppleSprite(Image image) {

public CubeSprite(Image image){

super(image); // Sprite constructor

super(image); // Sprite constructor

setRefPixelPosition(146, 35); // Set location on canvas

// Set location on canvas

setRefPixelPosition(120, 116);}

}}

}

import javax.microedition.lcdui.game.*;

import javax.microedition.lcdui.*;

public class StarSprite extends Sprite {

public StarSprite(Image image) {

super(image); // Sprite constructor

setRefPixelPosition(5, 65); // Set location on canvas

}}

26

Collisions, AnimatedSprite.java

Ví d : ụVí d : ụ Collisions,  import javax.microedition.lcdui.game.*; import javax.microedition.lcdui.*; public class AnimatedSprite extends Sprite { public AnimatedSprite(Image image, int frameWidth, int frameHeight) { super(image, frameWidth, frameHeight); // Call sprite constructor   }}

 Move Sprite: MoveLeft(), moveRight(int w), moveUp(), moveDown(int h)

ườ

ờ saveXY() trong tr

ộ ng h p Sprite đ ng đ

ả ề ị

ả ư ạ ị  Khi mu n Move Sprite, ta ph i l u l ướ ớ v i Sprite khác, sau đó tr  v  v  trí tr

ệ i v  trí hi n th i  c đó restoreXY()

private void saveXY() {// Save last position

previous_x = x;

previous_y = y;}

public void restoreXY() {

x = previous_x;

y = previous_y;

setPosition(x, y);

}

27

Collisions, Di chuy n Sprite:

ManSprite.java (1)(1)

Ví d : ụVí d : ụ Collisions,  import javax.microedition.lcdui.game.*; import javax.microedition.lcdui.*;

public class ManSprite extends Sprite{ private int x = 0, y = 0, // Current x/y previous_x, previous_y; // Last x/y private static final int MAN_WIDTH = 25; // Width in pixels private static final int MAN_HEIGHT = 25; // Height in pixels

public ManSprite(Image image){ // Call sprite constructor super(image);} public void moveLeft() { if (x > 0) { // If the man will not hit the left edge...  saveXY(); // If less than 3 from left, set to zero, // otherwise, subtract 3 from current location x = (x < 3 ? 0 : x ­ 3); setPosition(x, y); }}

28

Collisions, Di chuy n Sprite:

ManSprite.java (2)(2)

Ví d : ụVí d : ụ Collisions,

public void moveRight(int w) {

if ((x + MAN_WIDTH) < w) { // If the man will not hit the right edge...

saveXY();

// If current x plus width of ball goes over right side,

// set to rightmost position. Otherwise add 3 to current location.

x = ((x + MAN_WIDTH > w) ? (w ­ MAN_WIDTH) : x + 3);

setPosition(x, y); } }

public void moveUp() {

if (y > 0) {// If the man will not hit the top edge...

saveXY();

// If less than 3 from top, set to zero,

// otherwise, subtract 3 from current location.

y = (y < 3 ? 0 : y ­ 3);

setPosition(x, y);

} }

29

Collisions, Di chuy n Sprite:

ManSprite.java (3)(3)

Ví d : ụVí d : ụ Collisions,

public void moveDown(int h){ if ((y + MAN_HEIGHT) < h) { // If the man will not hit the bottom edge... saveXY(); // If current y plus height of ball goes past bottom edge, // set to bottommost position. Otherwise add 3 to current location. y = ((y + MAN_WIDTH > h) ? (h ­ MAN_WIDTH) : y + 3); setPosition(x, y); }} private void saveXY() {// Save last position previous_x = x; previous_y = y; } public void restoreXY() { x = previous_x; y = previous_y; setPosition(x, y); }

}

30

Ví d : ụVí d : ụ Collisions,  Collisions, CollisionCanvas.java (1)(1) ấ ả ề

• Tr  v  true n u có đ ng đ private boolean checkForCollision() { if (spMan.collidesWith(spSpiral, true) || spMan.collidesWith(spApple, true) || spMan.collidesWith(spCube, true) || spMan.collidesWith(spStar, true)) { // Upon collision, restore the last x/y position spMan.restoreXY(); return true; } else return false; }

 Tr  v  phím  n: private void checkForKeys() { int keyState = getKeyStates(); if ((keyState & LEFT_PRESSED) != 0) { spMan.moveLeft(); } else if ((keyState & RIGHT_PRESSED) != 0) { spMan.moveRight(canvas_width); } else if ((keyState & UP_PRESSED) != 0) { spMan.moveUp(); } else if ((keyState & DOWN_PRESSED) != 0) { spMan.moveDown(canvas_height); }}

ế ộ ụ ả ề

31

Collisions, CollisionCanvas.java (2)(2)

Ví d : ụVí d : ụ Collisions,  ớ

 L p CollisionCanvas

public class CollisionCanvas extends GameCanvas implements Runnable {

private AnimatedSprite spSpiral; // Animated sprite

private static final int FRAME_WIDTH = 57; // Width of 1 frame

private static final int FRAME_HEIGHT = 53; // Height of 1 frame

private int canvas_width, canvas_height; // Save canvas info

private ManSprite spMan; // Man (moveable)

private AppleSprite spApple; // Apple (stationary)

private CubeSprite spCube; // Cube "

private StarSprite spStar; // Star "

private LayerManager lmgr; // Manage all layers

private boolean running = false; // Thread running?

private Collisions midlet; // Reference to main midlet

32

Ví d : ụVí d : ụ Collisions,

Collisions, CollisionCanvas.java (3)(3)

// Create and add to layer  manager lmgr = new LayerManager(); lmgr.append(spSpiral); lmgr.append(spMan); lmgr.append(spApple); lmgr.append(spCube); lmgr.append(spStar);

public CollisionCanvas(Collisions midlet) { // Gamecanvas constructor super(true); this.midlet = midlet; Try {// Nonanimated sprites spMan = new ManSprite(Image.createImage("/man.png")); spApple = new AppleSprite(Image.createImage("/apple.png")); spCube = new CubeSprite(Image.createImage("/cube.png")); spStar = new StarSprite(Image.createImage("/star.png")); // Animated sprite spSpiral = new AnimatedSprite(Image.createImage("/spiral.png"), FRAME_WIDTH, FRAME_HEIGHT); // Change the reference pixel to the middle of sprite spSpiral.defineReferencePixel(FRAME_WIDTH / 2, FRAME_HEIGHT / 2); // Center the sprite on the canvas // (center of sprite is now in center of display) spSpiral.setRefPixelPosition(getWidth() / 2, getHeight() / 2);

33

Ví d : ụVí d : ụ Collisions,

Collisions, Collisions.java public class Collisions extends MIDlet implements CommandListener { protected Display display; // Reference to display private CollisionCanvas canvas; // Game canvas private Command cmExit; // Exit command

public Collisions() { display = Display.getDisplay(this); if ((canvas = new CollisionCanvas(this)) != null) { // Create game canvas and exit command cmExit = new Command("Exit", Command.EXIT, 1); canvas.addCommand(cmExit); canvas.setCommandListener(this); }} public void startApp() { if (canvas != null) { display.setCurrent(canvas); canvas.start(); } }

34