Ộ Ộ
Ậ Ậ
Ế Ế
Ị Ị
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
ặ ị
ừ ặ ị 0255
ả ề ệ
ờ ủ ệ ầ ờ
ệ ầ ờ
ụ ủ ỏ ủ ệ ầ ờ
ả ề ặ ứ ế ậ 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 0255 ả ề int getGreenComponent();// tr v thành ph n màu l c c a màu hi n th i 0255 int getRedComponent(); // tr v thành ph n màu đ c a màu hi n th i 0255 void setGrayScale(int value); // đ t m c xám
ụ
ả ề ị ừ int getGrayScale(); //tr v giá tr xám t 0255
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à “ “offscreen 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à 8bit, 16bit, 24bit… 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 (scnY1>0) scnY; } if ((keyStates & DOWN_PRESSED)!=0){
if (scnY+1+140 } Ví d : ụ CuonManHinhNen
CuonManHinhNen 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 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 ủ ậ ộ ợ ỉ ố
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;
}
} ạ
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}; 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) {}
}} • 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"); } }} 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); 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");
} } } 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();
} } } 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 }} Move Sprite: MoveLeft(), moveRight(int w), moveUp(), moveDown(int h) ườ ụ ợ ộ
ng h p Sprite đ ng đ ả ề ị private void saveXY() {// Save last position previous_x = x; previous_y = y;} public void restoreXY() { x = previous_x; y = previous_y; setPosition(x, y); } ể ManSprite.java (1)(1) 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);
}} ể ManSprite.java (2)(2) 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); } } ể ManSprite.java (3)(3) 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);
} } • 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);
}} ế ộ ụ ả ề 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 // 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); 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();
} }17
ớ
ớL p TiledLayer
L p TiledLayer
ộ ướ
18
ụ
ụVí d TiledLayer
Ví d TiledLayer
19
Animated Cells (1)
Animated Cells (1)
20
Animated Cells (2)
Animated Cells (2)
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 {
ạ
22
(2), AnimationCanvas.java
AnimationCanvas.java
Animation (2),
Ví d : ụVí d : ụ Animation
import javax.microedition.lcdui.game.*;
23
Ví d : ụVí d : ụ Animation
(3)
Animation (3)
24
(4), Animation.java
Ví d : ụVí d : ụ Animation
Animation (4),
25
Collisions, , AppleSprite.java, CubeSprite.java và StarSprite.java
Ví d : ụVí d : ụ Collisions
import javax.microedition.lcdui.game.*;
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
}}
ố
ờ saveXY() trong tr
ả ư ạ ị
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()
27
Collisions, Di chuy n Sprite:
Ví d : ụVí d : ụ Collisions,
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
28
Collisions, Di chuy n Sprite:
Ví d : ụVí d : ụ Collisions,
29
Collisions, Di chuy n Sprite:
Ví d : ụVí d : ụ Collisions,
30
Ví d : ụVí d : ụ Collisions,
Collisions, CollisionCanvas.java (1)(1)
ấ
ả ề
31
Collisions, CollisionCanvas.java (2)(2)
Ví d : ụVí d : ụ Collisions,
ớ
32
Ví d : ụVí d : ụ Collisions,
Collisions, CollisionCanvas.java (3)(3)
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
34