Overview
Có một vấn đề đặt ra ở đây là bạn đang viết game cho vui hay để kiếm tiền. nếu thật sự bạn muốn kiếm tiền từ game thì cần phải biết và áp dụng được kĩ thuật game design và xử lý các hàm (methodology process) trong game development. Vâng có rất nhiều vấn đề làm hao tốn cả thời gian và cản trở những việc hiện thực hóa ý tưởng sáng tạo của chúng ta. Phát triển game là một ngành chứa rất nhiều thử thách và bên cạnh đó là rất nặng về sáng tạo, đồ họa (graphic), hoạt cảnh (animation). Nó thật sự khác rất nhiều khi so sánh với các ngành khác trong ngành phát triển phần mềm nói chung. Và sẽ càng thử thách hơn trong thời điểm hiện tại khi mà ngành công nghiệp game đang chuyển sang hướng multiplayer (chơi nhiều người) và MMOG (chơi trực tuyến nhiều người). Điều này vẫn đúng với lĩnh vực game mobile khi mà hầu hết các tựa game chơi đơn đang đứng trước sự thúc đẩy chuyển lên chơi network.
// Chương này chả có gì ngoài cái môn Nhập môn công nghệ phần mềm
=> chương 3 tán phét .. bỏ qua
Chapter 5: MIDP 2 Game Classes ( KẾT THÚC TẠI 37/219 J2ME GAME DEVELOPMENT WITH MIDP 2.0)
Sự phổ biến của J2ME và game trên di động đã dẫn đến sự phát triển của một vài nhà cung cấp dịch vụ và các nhà cung cấp những công cụ để giúp cho việc phát triển game. Dĩ nhiên, vấn đề chính ở đây là sự tương thích giữa những nền tản công cụ này với các loại máy điện thoại. Ví dụ : nếu sử dụng nền tảng Siemens Sprite sẽ rất khó để nó hoạt động tốt trên những thiết bị của nokia. Và cách đơn giản nhất để có thể chạy tương thích là bạn phải thực hiện lại công việc trên 1 nền tảng khác.
Nhưng giờ đây với sự ra đời của MIDP 2.0 một số vấn đề về sự tương thích của game đã được giải quyết với 5 class cơ bản :
GameCanvas
Sprite
Layer
LayerManger
TiledLayer
và dĩ nhiên bạn có thể không sử dụng các lớp này một cách trực tiếp, nó có thể là những lớp trừu tượng được sử dụng bởi Spirte, LayerManager TiledLayer. Những lớp này bạn có thể tìm thấy trong gói java.microedition.lcdui.game
Không chỉ là vấn đề về tính tương thích mà còn là vấn đề các game class bạn viết ra có thể trở nên nhỏ gọn hơn rất nhiều và bạn không phải thực hiện lại nó trên những lớp tùy chọn khác như Sprite. Các lớp trong MIDP 2.0 là một phần của môi trường Java (java enviroment) đã được cài đặt bên dưới thiết bị
GameCanvas:
GameCanvas mang lại 2 đặt trưng quanh trọng mới để giải quyết 2 vấn đề gặp phải trong phiên bản phía trước nó (MIDP 1.0). Vấn đề đầu tiên là giờ đây là tạo ra một single buffer (vùng nhớ đệm) cho mỗi GameCanvas. Điều này quan trọng vì nó không chỉ hạn chế tối đa việc sử dụng vùng nhớ heap trong các hàm trong game mà còn làm cho việc điều khiển tất cả quá trình trong game chỉ còn ở trong 1 vòng lặp vô tận duy nhất. Chúng ta hay nhìn vào cách cũ khi chúng ta muốn looping trong game sử dụng MIDP 1.0
public void theGameCanvas extends Canvas implements Runnable {
public void run() {
while (true) {
repaint(); // update game display
}
}
public void paint(Graphics g) {
// painting // redraw occurs here
}
protected void keyPressed(int keyCode) {
// obtain user inputs
}
}
Như bạn có thể nhìn thấy ở trên là 3 vùng khác nhau có chức năng hác nhau. Vẽ lại màn hình , vùng run() và key input. Tất cả đều được chạy trên những thread (luồng ) khác nhau.(chạy song song, độc lập). Vì nhiều luồng chạy độc lập với nhau nên kết quả hiển thị cuối cùng cho người dùng có thể đôi lúc giống như bị giật giật đặc biệt là trong những thể loại game hành động yêu cầu nhiều về đồ họa và tương tác.
Giờ đây với MIDP 2 và sự thêm vào của GameCanvas, mọi vấn đề hầu như đã được giải quyết. Dễ dàng để sử dụng và hiệu quả hơn. Bên cạnh việc chạy từ trên duy nhất 1 luồng (single thread) GameCanvas không còn chờ đợi những event phát ra từ bàn phím mà thay vào đó là sử dụng kỹ thuật gọi polling. Điều đó có nghĩa là bạn có thể xác định được thời điểm bất kì mà người dùng nhất phím bằng cách sử dụng hàm getKeysState() được cung cấp bởi GameCanvas. Với cách sử dụng bộ nhớ đệm trong gameCanvas trong công nghệ game người ta thường gọi là double buffering graphic (bộ nhớ đệm đồ họa kép) . Và việc xử lý lớp đệm này được thực hiện một cách tự động bởi GameCanvas. Tất cả những gì bạn phải làm là gọi hàm flushGraphics() để xuất những hoạt họa đó ra màn hình. Double Buffering là công nghệ được dùng để tránh bị nháy hình trong lúc hiển thị bằng cách vẽ tạm hình ảnh lên vùng nhớ nhưng không hiển thị ... Chỉ hiển thị khi hình ảnh đã được vẽ hoàn tất.
Một ví dụ cơ bản cho lớp GameCanvas
Theo ví dụ này sẽ có một chữ "x" di chuyển theo sự nhập vào của người dùng
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class ExampleGameCanvas extends GameCanvas implements Runnable {
private boolean isPlay; // Game Loop runs when isPlay is true
private long delay; // To give thread consistency
private int currentX, currentY; // To hold current position of the 'X'
private int width; // To hold screen width
private int height; // To hold screen height
// Constructor and initialization
public ExampleGameCanvas() {
super(true);
width = getWidth();
height = getHeight();
currentX = width / 2;
currentY = height / 2;
delay = 20;
}
// Automatically start thread for game loop
public void start() {
isPlay = true;
Thread t = new Thread(this);
t.start();
}
public void stop() { isPlay = false; }
// Main Game Loop
public void run() {
Graphics g = getGraphics();
while (isPlay == true) {
input();
drawScreen(g);
try { Thread.sleep(delay); }
catch (InterruptedException ie) {}
}
}
// Method to Handle User Inputs
private void input() {
int keyStates = getKeyStates();
// Left
if ((keyStates & LEFT_PRESSED) != 0)
currentX = Math.max(0, currentX - 1);
// Right
if ((keyStates & RIGHT_PRESSED) !=0 )
if ( currentX + 5 < width)
currentX = Math.min(width, currentX + 1);
// Up
if ((keyStates & UP_PRESSED) != 0)
currentY = Math.max(0, currentY - 1);
// Down
if ((keyStates & DOWN_PRESSED) !=0)
if ( currentY + 10 < height)
currentY = Math.min(height, currentY + 1);
}
// Method to Display Graphics
private void drawScreen(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0x0000ff);
g.drawString("X",currentX,currentY,Graphics.TOP|Graphics.LEFT);
flushGraphics();
}
}
Class Main MIDLET (tương tự hàm main trong C & C++)
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class ExampleGameCanvasMidlet extends MIDlet {
private Display display;
public void startApp() {
display = Display.getDisplay(this);
ExampleGameCanvas gameCanvas = new ExampleGameCanvas();
gameCanvas.start();
display.setCurrent(gameCanvas);
}
public Display getDisplay() {
return display;
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
exit();
}
public void exit() {
System.gc();
destroyApp(false);
notifyDestroyed();
}
}
Link demo http://www.mediafire.com/?y40lr5yn7a42lec
Using Sun java toolkit .
có thể thay đổi emulator nếu bạn chưa cài đặt sun java toolkit
cảm ơn bạn rất nhiều. Mong bạn tiếp tục trong chủ đề này. Rất hữu ích
ReplyDelete