XtGem Forum catalog

MXH AVATAR[iOS, ANDROI, JAVA]
IWIN ONLINE 2013[iOS, ANDROI, JAVA]
NAM QUỐC SƠN HÀ - KHÍ PHÁCH ANH HÙNG[iOS, ANDROI, JAVA]
MOBIARMY- SO TÀI SÚNG NHỰA[iOS, ANDROI, JAVA]
MUSIC CITY-NHẢY AUDITION[iOS, ANDROI, JAVA]
Lý thuyết j2me

display(initMainForm());
}
} elseif (display == helpForm) {
if (cmd == comBack) {
display(initMainForm());
}
} elseif (display == newHighScoreForm) {
if (cmd == highScoreSave) {
int pos = Integer.parseInt(highScorePosition.getText())-1;
// advance all the scores
for -1{
scores.name = scores[i-1">.name;
scores.value = scores[i-1">.value;
scores.when = scores[i-1">.when;
}
// insert new score
scores[pos">.name = highScoreName.getString();
scores[pos">.value = Integer.parseInt(highScoreValue.getText());
scores[pos">.when = newDate();
display(initScoreForm());
}
}
}Tất cả các logic menu cho các MIDlet được xác định bên trong phương thức commandAction() này. Quyết định làm gì tiếp theo phụ thuộc vào màn hình hiển thị và command được chọn lựa. Từ menu chính, tôi chỉ đơn giãn chuyển hướng người dùng đến mỗi màn hình cụ thể. Các màn hình hiện tại chỉ có một back command, chỉ duy nhất một form NewHighScores có command save dùng để lưu thông tin về điểm số(score).
Bạn lưu ý cách thức sử dụng phương thức display(), vì đây là cách đơn giãn để kích hoạt đối tượng Displayable.
publicvoid display(Displayable display) {
// shows display in the screen.
Display.getDisplay(this).setCurrent(display);
}
Bài tiếp theo sẽ mô tả làm thế nào để cài đặt một Game Screen.
Phát triển game đơn giãn trên Mobile(P3)
Ở bài trước, chúng ta đã hoàn thành một giao diện menu cho game.Tuy nhiên, màn hình Game Screen vẫn chưa được tạo ra. Mục đích của bài này là sinh ra một Game Screen có giao diện như hình dưới:
Các thành phần giao diện cấp cao không thể sử dụng cho game screen bởi vì chúng ta phải điều khiển tất cả các phần tử trong game khi chúng được vẽ và làm thế nào để game tương tác trở lại với keypad. Để làm được điều này, chúng ta phải sử dụng các class giao diện low-level. Các class thuộc nhóm low-level cho phép bạn kiểm soát chi tiết các phần tử và sự kiện trên màn hình game.Sử dụng các class này, bạn có thể xác định rõ vị trí, màu sắc và kích thước.Cũng chính vì vậy, bạn phải thiết kế màn hình game screen cho mỗi loại màn hình ứng với mỗi thiết bị.
Diagram sau cho biết các lớp chính trong giao diện low-level :
Với entry point là lớp Canvas, nó cho phép bạn truy cập các sự kiện của hệ thống:
• keyPressed(), keyReleased(), keyRepeated() thông báo tới Canvas khi keypad được sử dụng.
• pointerPressed(), pointerDragged(), pointerReleased() thông báo tới Canvas khi pointer được sử dụng, đây là các phương thức xử lý trong các màn hình cảm ứng.
• paint() thông báo đến Canvas khi nó cần vẽ lên màn hình, phương thức này dùng để truy cập vào đối tượng Graphics.
• getWidth(), getHeight() truy cập vào kích thước hiện tại của màn hình được vẽ.
Lớp Graphics cung cấp các phương thức để vẽ trực tiếp lên màn hình:
• drawLine() vẽ đường thẳng.
• drawRect(), fillRect() vẽ hay đổ màu một rectangle lên màn hình.
• drawArc() vẽ một cung(arc) lên màn hình, có thể dùng nó để vẽ đường tròn.
• drawChar() vẽ một ký tự lên màn hình.
• drawString() vẽ một chuỗi lên màn hình.
• drawImage() vẽ một bitmap image lên màn hình
• setFont() thiết lập Font chữ.
• setColor() thiết lập màu.
Ngoài ra trong MIDP 2.0 còn nhiều phương thức khác, bạn tự tìm hiểu thêm.
Để tạo Game Screen, bạn phải tạo một lớp extends từ lớp Canvas và cài đặt phương thức paint().
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
publicclass MyCanvas extendsCanvas{
int width;
int height;
public MyCanvas() {
}
protectedvoid paint(Graphics g) {
// stores width and height
width = getWidth();
height = getHeight();
// set background color
g.setColor(0,0,0);
// clear screen
g.fillRect(0, 0, width, height);
// draw a red circle that represents a ball
g.setColor(255,0,0);
g.drawArc(100, 100, 5, 5, 0, 360);
// draws a blue rectangle for the pad
g.setColor(0,0,255);
g.fillRect(100, 200, 15, 15);
}
}
Để kích hoạt Canvas, tạo nó trong lớp MIDlet và hiển thị nó trong phương thức commandAction()
public Displayable initGameCanvas() {
if (gameCanvas == null){
gameCanvas = new MyCanvas();
// add a back Command to return to the menu screen
gameCanvas.addCommand(initBackCommand());
// set the listener to our actions
gameCanvas.setCommandListener(this);
}
return gameCanvas;
}
Vòng lặp game:
Trước khi bắt đầu, bạn phải hiểu những cách thức thông thường mà một ứng dụng game hoạt động. Một game hay animation được xây dựng dựa trên một mẫu(piece) code thực thi được lặp đi lặp lại. Mẫu code này theo dõi giá trị của các biến và các trạng thái game. Dựa trên trạng thái game, đoạn code sẽ vẽ hay vẽ lại các phần tử trên game. Các giá trị của biến có thể được thay đổi bởi các tương tác của người dùng hay các hành vi của game bên trong.
Điều này được tạo ra bằng cách đặt đoạn code đó lặp đi lặp lại trong một vòng lặp liên tục. Trước khi vào vòng lặp, một biến có thể sẽ được kiểm tra xem game còn chạy hay không. Nếu không, vòng lặp có thể được thoát. Các đoạn code trong vòng lặp nên cho phép thread thực thi hiện hành sleep vài giây để điều khiển tốc độ(rate) mỗi khi trạng thái game được cập nhật(đó là sau bao lâu thì màn hình game được refresh). Code có dạng sau:
publicclass MyCanvas extends GameCanvas implementsRunnable{

publicvoid start() {
run = true;
Thread t = newThread(this);
t.start();
}
publicvoid stop() {
run = false;
}
publicvoid run(){
init();
while (run){
// update game elements, positions, collisions, etc..
updateGameState();
// check user input
checkUserInput();
// render screen
updateGameScreen();
// redraws screen
flushGraphics();
// controls at which rate the updates are done
Thread.sleep(10);
}
}

}
Ở đoạn code trên, lớp GameCanvas được sử dụng. Lớp GameCanvas là một trường hợp đặc biệt của lớp Canvas, được optimize cho các game. Nó sử dụng với các kỹ thuật sau:
• Bộ đệm đôi(double buffer): GameCanvas sử dụng một image off-screen mà image này được sử dụng cho tất cả các thao tác vẽ. Khi thao tác vẽ hoàn tất, nó được vẽ lên màn hình nhờ sử dụng phương thức flushGraphics(). Điều này giúp tránh tình trạng màn hình bị flick và các chuyển động mượt mà hơn.
• Lưu trữ trạng thái phím trong một mảng: Thông qua phương thức getKeyStates(), bạn có thể truy cập vào một mảng bit tương ứng với trạng thái của mỗi phím sử dụng các giá trị hằng(constant) được định nghĩa trong Canvas.
Bên cạnh sử dụng GameCanvas, bạn cần sử dụng một Thread để giữ các chuyển động trong game độc lập với các event của MIDlet. Bằng cách này, các animation sẽ không cần chờ các event của hệ thống vẽ lại chính nó. Trong ví dụ này, game có 3 thực thể:
• Pad: là một hình chữ nhật nhỏ di chuyển từ trái sang phải nằm phái dưới màn hình.
• Ball: nằm trước Pad, khi bạn nhấn phím Fire, nó sẽ di chuyển với tốc độ theo chiều dọc ngang của Pad.
• Brick: các khối tĩnh nằm phía trên màn hình, khi chúng trúng Ball thì chúng sẽ biến mất.
Mục đích của game là làm cho các Brick biến mất càng nhanh càng tốt, và không để cho Ball chạy ra khỏi phía dưới của màn hình. Game cần theo dõi 3 biến:
• Điểm số của người chơi. Người chơi sẽ nhận được 10 điểm mỗi lần làm một Brick biến mất.
• Số lượt chơi: mỗi lần Ball chạy ra khỏi phía dưới màn hình, người chơi mất một lượt.
• Thời gian chơi game: người chơi phải hoàn tất game trong khoảng thời gian cho phép hay giới hạn.
Lớp Entity là supeclass của 3 thực thể trên, gồm có các thuộc tính và chức năng sau:
• x, y: Xác định vị trí hiện tại của thực thể.
• speedX, speedY: Xác định tốc độ của thực thể.
• width, height: Xác định kích thước của thực thể.
• update(): Xác định hành vi của các thực thể.
• paint(): phương thức được lớp Graphics sử dụng để vẽ các thực thể....
«12345 ... 7»
5"/>
Từ khóa: Lý, thuyết, j2me
Lên trên Có thể bạn quan tâm
5