J2ME – Tạo màn hình load game

Posted: 16/06/2011 in J2ME
Tags: ,

bài này tôi sẽ hướng dẫn các bạn tạo màn hình loading game trong J2ME

Từ Netbeans các bạn tạo mới Project J2ME, chọn cấu hình CLDC 1.0 , MIDP 2.0 , chọn device là DefaultcldcMsaPhone1

ta xây dựng 3 lớp Point.java ,LoadingScreen.Java, và Midlet : MainMidlet.java

https://i1.wp.com/nzoqla.bay.livefilestore.com/y1pDN__w9A2oZzcNeFugWN0OSYMc83YYIy2qi9IzazO6O0e5Kngb80RBxdkyv-7RYRc5h80iXOZDZ23t4BoplTSfSQ_2eO3E1pO/j2me2.png

Lớp Point.java


package Zstar;

/**
*
* @author zstar
*/
public class Point {

private int X = 0;
private int Y = 0;

public Point() {
}

public Point(int x, int y) {
this.X = x;
this.Y = y;
}

public int getX() {
return this.X;
}

public int getY() {
return this.Y;
}
}

Lớp LoadingScreen.java


package Zstar;

import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;

/**
* @author ZSTAR
*/
public class LoadingScreen extends GameCanvas {

private Graphics g;
private String logo = "/Images/logo.png";
private String text1 = "Game tiếng việt trên điện thoại";
private String text2 = "Đang tải...";
private Image imageLogo;
private Point root = new Point(30, 50);
private Font fontNormal;
private Font fontBold;
//thanh loading
private int colorBorder = 0x000000;
private int colorLoading = 0xcc3301;
private int loadingLength = 150;
private int loadingHeight = 5;
private int loadingCurrent = 0;
private int h = 10;
private MainMidlet mainMidlet;

public LoadingScreen(MainMidlet main) {
super(false);
this.mainMidlet = main;
this.g = this.getGraphics();
this.fontNormal = g.getFont();
this.fontBold = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
setFullScreenMode(true);
try {
imageLogo = Image.createImage(logo);
} catch (IOException ex) {
ex.printStackTrace();
}
this.root = new Point(getWidth() / 2 - imageLogo.getWidth() / 2, root.getY());

}

public void start() {
clearScreen();
draw();
draw_next_loading();
}

public void draw() {
g.setColor(0x000000);
g.drawImage(imageLogo, root.getX(), root.getY(), Graphics.TOP | Graphics.LEFT);
g.drawString(text1, getWidth() / 2 - fontNormal.stringWidth(text1) / 2, root.getY() + imageLogo.getHeight(), Graphics.TOP | Graphics.LEFT);
g.setFont(fontBold);
g.drawString(text2, getWidth() / 2 - fontBold.stringWidth(text2) / 2, root.getY() + imageLogo.getHeight() + 40, Graphics.TOP | Graphics.LEFT);
g.setFont(fontNormal);
//draw loading
g.setColor(colorBorder);
g.drawRect(getWidth() / 2 - loadingLength / 2, root.getY() + imageLogo.getHeight() + 30, loadingLength, loadingHeight);
g.setColor(colorLoading);
g.fillRect(getWidth() / 2 - loadingLength / 2, root.getY() + imageLogo.getHeight() + 30, loadingCurrent, loadingHeight);
g.setColor(colorBorder);
this.flushGraphics();
}

private void draw_next_loading() {
clearLoading();
//timer.schedule(task, interval,interval);
for (int i = 0; i < loadingLength / h; i++) {
if (loadingCurrent < loadingLength) {
loadingCurrent += h;
//draw loading
g.setColor(colorBorder);
g.drawRect(getWidth() / 2 - loadingLength / 2, root.getY() + imageLogo.getHeight() + 30, loadingLength, loadingHeight);
g.setColor(colorLoading);
g.fillRect(getWidth() / 2 - loadingLength / 2, root.getY() + imageLogo.getHeight() + 30, loadingCurrent, loadingHeight);
g.setColor(colorBorder);
this.flushGraphics();
try {
Thread.sleep(100);
} catch (Exception e) {
}
} else {
loadingCurrent = 0;
break;
}
}

}

private void clearLoading() {
g.setColor(0xffffff);
g.fillRect(getWidth() / 2 - loadingLength / 2, root.getY() + imageLogo.getHeight() + 30, loadingLength, loadingHeight);
this.flushGraphics();
}

public void clearScreen() {
g.setColor(0xffffff); // white
g.fillRect(0, 0, getWidth(), getHeight());
this.flushGraphics();
}
}

Lớp MainMidlet.java

các bạn thêm 1 midlet vào source package và code như sau


package Zstar;

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

/**
* @author ZSTAR
*/
public class MainMidlet extends MIDlet {
private LoadingScreen loadingScreen;

public void startApp() {
loadingScreen=new LoadingScreen(this);
Display.getDisplay(this).setCurrent(loadingScreen);
loadingScreen.start();
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
}

Nhấn F6 để chạy ứng dụng ta được kết quả :

https://i2.wp.com/nzoqla.bay.livefilestore.com/y1piOGrn7x2igHBjohKf24uM4_yRfvAoCORZSmc8d_debTBGJSKolk69NC_SZHBhrCwqBwkhIZSYgsZAHrr9BbaZm2GfRtg30l9/j2me1.png

Comments
  1. Phạm Văn Đoan says:

    Mình đã test code rồi, ok. Thanks nhiều nhé!
    A mới tự học J2ME nên trình độ còn non lắm.
    A học bên Cầu đường nên cũng chỉ viết vài ứng dụng chủ yếu mang tính chất tính toán, ko đồ họa. Cũng chỉ thế thôi nhưng cũng đã gặp rất nhiều khó khăn. Vì vậy, chú cho a hỏi code mấy vấn đề này cái:
    1- Hàm làm tròn số thập phân. VD: có 1.2476 bây giờ muốn lấy thành: 1.25 thôi.

    2- Hàm tính e^x và logarit (code thì càng tốt, ko thì thuật toán cũng được).

    3- Cách tạo đăng ký tài khoản cá nhân cho ứng dụng, nghĩa là: sau khi khởi động ứng dụng lên thì gặp 1 trong 2 kiểu tình huống đăng nhập sau:

    3.a) Kiểu 1: Ứng dụng tự nhận biết được đây là lần chạy đầu tiên và yêu cầu đăng ký tài khoản (gồm tên và mật khẩu). Sau khi đăng ký thành công thì trong lần chạy sau sẽ không hỏi đăng ký nữa mà chỉ yêu cầu đăng nhập thôi. Kiểu này, chỉ cho phép đăng ký 1 tài khoản.

    3.b) Kiểu 2: Giống như cách đăng ký ở các diễn đàn. Nghĩa là: nếu có tài khoản rồi thì đăng nhập, còn chưa có thì đăng ký. Kiểu này, sẽ có nhiều tài khoản sử dụng ứng dụng này.

    Mong chú sớm cho a ý kiến ý nhé, thanks!
    Nếu ko có code thì chú cho a xin cái ý tưởng cũng được, đặc biệt là phần 3.a và 3.b ý. Email của a là: doan281@gmail.com.
    GoodFun!

  2. Huy Hoàng says:

    Bạn ơi, mình có tự viết ứng dụng J2ME. Trong ứng dụng mình có sử dụng 1 vài hình ảnh để ứng dụng đẹp mắt! Mình đã thử chạy trên emulator và đểu ok cả. Tuy nhiên khi đưa sang chạy máy thật (Nokia 2700 classic) thì nó báo lỗi Null Pointer Exception. Mình thử bỏ hình ảnh đi thì lại chạy được. Không biết có phải là khi đóng gói file JAR, các file hình ảnh ko được đóng vào đó hay sao ấy. Bạn có biết lỗi gì không, chỉ mình với!

    Cám ơn trước nha!

    • zstar says:

      cho mình xem code của bạn nào😀 . bạn có thể cài thêm Nokia SDK để kiểm tra. nếu trên nokia sdk như thế nào thì 99% trên máy nokia thật sẽ như vậy. bạn cũng nên dùng try, catch để tìm ra đoạn code gây lỗi. null pointer trong trường hợp này có thể là do biến chưa được khởi tạo mà đã draw, 2 là đường dẫn ảnh ko chính xác, dẫn đến biến image null

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s