Sau đây, tôi xin giới thiệu tới các bạn một kỹ thuật tạo menu cho game bằng hình ảnh sử dụng các class LayerManager và Sprite trong gói javax.microedition.lcdui.game. Lưu ý, trong ví dụ này, tôi giả định rằng, độ rộng màn hình bằng 240, chiều cao màn hình 308(đây là chiều rộng và chiều cao mặc định trong emulator của Sun Wireless Toolkit). Giao diện của nó như sau:
Ứng dụng bao gồm 2 class: MenuScreen và MenuMidlet, lớp MenuScreen như sau:
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
/**
*
* @author mobilesprogramming’s blog
*/
public class MenuScreen extends Canvas {
final static String IMG_BACKGROUND = “/back2.png”;
final static String IMG_SELECTED = “/back2_active.png”;
Sprite sprBackground, sprSelected;
LayerManager lmMenu;
MenuMidlet midlet;
final static int N_ITEMS = 6;
final static int ID_NEW_GAME = 0;
final static int ITEM_HEIGHT = 30;
final static int ITEM_WIDTH = 240;
final static int[] posX = new int[N_ITEMS];
final static int[] posY = new int[N_ITEMS];
int selectedIndex = 0; // mac dinh ban dau selectedIndex = 0 <–> chon phan tu dau tien
final static int X0_A = 0;
final static int Y0_A = 60;
static int X0;
static int Y0;
static int viewWidth, viewHeight;
Graphics g;
public MenuScreen(MenuMidlet midlet, int selectedIndex) {
this.midlet = midlet;
this.setFullScreenMode(true);
Image imgBackground = null;
imgBackground = this.createImage(IMG_BACKGROUND);
sprBackground = new Sprite(imgBackground, imgBackground.getWidth(), imgBackground.getHeight());
sprBackground.setPosition(X0, Y0);
viewWidth = imgBackground.getWidth();
viewHeight = imgBackground.getHeight();
//X0 = (getWidth() – imgBackground.getWidth()) / 2;
//Y0 = (getHeight() – imgBackground.getHeight()) / 2;
X0 = (240 – imgBackground.getWidth()) / 2;
Y0 = (308 – imgBackground.getHeight()) / 2;
for (int i = 0; i < N_ITEMS; i++) {
posX[i] = X0_A;
posY[i] = Y0_A + i * ITEM_HEIGHT;
}
this.selectedIndex = selectedIndex;
Image imgSelected = null;
imgSelected = this.createImage(IMG_SELECTED);
sprSelected = new Sprite(imgSelected, ITEM_WIDTH, ITEM_HEIGHT);
lmMenu = new LayerManager();
lmMenu.append(sprSelected);
lmMenu.append(sprBackground);
}
public void keyPressed(int keyCode) {
switch (getGameAction(keyCode)) {
case UP:
selectedIndex = (selectedIndex + N_ITEMS – 1) % N_ITEMS;
break;
case DOWN:
selectedIndex = (selectedIndex + 1) % N_ITEMS;
break;
case FIRE:
this.processMenu();
}
this.repaint();
}
public void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(150, 150, 150);
sprSelected.setFrame(selectedIndex);
sprSelected.setPosition(posX[selectedIndex], posY[selectedIndex]);
lmMenu.paint(g, X0, Y0);
}
private void processMenu() {
switch (selectedIndex) {
case 0:
this.midlet.processNewGame();
break;
case 1:
this.midlet.processHighScore();
break;
case 2:
this.midlet.processOption();
break;
case 3:
this.midlet.processAbout();
break;
case 4:
this.midlet.processHelp();
break;
case 5:
this.midlet.exit();
}
}
private Image createImage(String img) {
try {
return Image.createImage(img);
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
}
}
Lớp MenuMidlet được xây dựng như sau:
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.*;
/**
* @author mobilesprogramming’s blog
*/
public class MenuMidlet extends MIDlet {
private Canvas menuScreen;
private Display display;
public void startApp() {
menuScreen = new MenuScreen(this, 0);
display = Display.getDisplay(this);
display.setCurrent(menuScreen);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
/**
* thoat khoi ung dung
*/
public void exit() {
this.destroyApp(true);
}
/**
* xu ly khi chon NewGame trong Menu
*/
public void processNewGame(){
}
/**
* xu ly khi chon HighScore trong Menu
*/
public void processHighScore(){
}
/**
* xu ly khi chon Option trong Menu
*/
public void processOption(){
}
/**
* xu ly khi chon About trong Menu
*/
public void processAbout(){
}
/**
* xu ly khi chon Help trong Menu
*/
public void processHelp(){
}
}
Đây là toàn bộ code và image của chương trình here.
Bạn thấy bài viết này thế nào?


15 responses to “Tạo Menu Sử dụng LayerMananger”
hung
April 11th, 2010 at 12:21
rất cảm ơn bạn , các bài viết của bạn rất hay
ngoc
April 13th, 2010 at 22:49
bài viết rất hay,cảm ơn bạn nhìu.hi vọng bạn post nhìu bài như vậy nữa
bin
April 13th, 2010 at 23:33
bạn ơi,làm sao tạo những hình ảnh trong thư mục res như của bạn,mình đang làm menu cho game ai là triệu phú mà đang bí chỗ hình ảnh.help me
mobilesprogramming
April 14th, 2010 at 18:24
Chào bạn!
Trong ví dụ trên, mình ko bỏ ảnh trong thư mục res, mà bỏ vào trong thư mục src. Nếu bạn muốn bỏ ảnh vào thư mục res, thì cứ vào thư mục src, rồi tạo thư mục res. Sau đó, muốn tạo image thì chỉ thêm đường dẫn. Ví dụ:
String IMG_BACKGROUND = “/res/back2.png”;
Image img=Image.create(IMG_BACKGROUND);
Chúc bạn thành công!
Kien
April 14th, 2010 at 21:57
neu do dai man hinh thay doi, man anh be khong chua het cac option thi ban xu ly the nao?
mobilesprogramming
April 14th, 2010 at 23:21
Nếu bạn đã sử dụng hình ảnh thì tốt nhất bạn nên thiết kế ứng dụng theo từng màn hình, ví dụ như : 128×128,… Nếu ko thì bạn sử dụng thuật toán để resize lại image.
bin
April 14th, 2010 at 23:46
cho mình hỏi cách tạo 2 hình ảnh trên?bạn làm bằng photoshop ah?
Khanh
October 6th, 2010 at 16:57
Over wonderful!
THUHUONG_3388
October 14th, 2010 at 07:15
CAM ON BAN RAT NHIEU, BAI VIET RAT HAY,SAU SAC VA DE HIEU, HI VONG BAN CO NHUNG BAI HUU ICH NAY VA TOT HONNUA DE CHIA SE VOI MOI NGUOI NHE!!
Nhuong
November 24th, 2010 at 14:47
Làm sao để tạo Menu dạng này cho tất cả các điện thoại vậy !!!
username01
April 3rd, 2011 at 21:35
code này của bạn chạy ra mỗi cái hình điện thoại rồi mất luôn! bạn sửa lại đi!
mobilesprogramming
April 10th, 2011 at 11:05
Mình chạy ok mà.
anh quan
May 2nd, 2011 at 07:55
đúng rồi. mình cũng chạy thử, ra mỗi cái điện thoại rồi mất luôn
bạn coi lai đi
anh quan
April 30th, 2011 at 07:09
chao a, e dang hoc lap trinh J2ME va co mot de tai viet game xep gach.anh co the huong dan cho em voi duoc khong.neu a lam duoc a co the share code de e tham khao khong ?
cam on nhieu !
giang
May 1st, 2011 at 22:29
bạn ơi mình có chút vấn đề ,bạn có Ym ko pm qua mail mình hỏi xíu :d
cảm ơn bạn