Bài viết được sự cho phép của tác giả Lê Hồng Kỳ
Lập trình game với java dành cho người mới bắt đầu sẽ trình bày những kiến thức cũng như những xử lý đặc thù khi lập trình game như xử lý va chạm, xử lý chuyển động, xử lý âm thanh, xử lý vòng lặp game,…
Các bạn lưu ý, để học tốt bài này người học phải có kiến thức về lập trình với ngôn ngữ Java. Trong bài học này, người học sẽ dùng ngôn ngữ Java để thiết kế giao diện game, cài đặt xử lý game. Chúng ta hãy bắt đầu bài học bằng một game nhỏ (mini game) với tựa là Mini Tennis.
Game này có luật chơi rất đơn giản. Quả bóng di chuyển từ trên xuống dưới. Nếu đụng biên dưới, trò chơi kết thúc. Người chơi sẽ sử dụng 2 phím mũi tên để di chuyển thanh ngang qua trái/phải sao cho quả bóng không được đụng biên dưới.
Lập trình game với java – Nội dung bài học
- Đồ họa (Graphic)
- Chuyển động và lặp lại (Animation and loop)
- Nhân vật (Sprite)
- Sự kiện (Event)
- Va cham (Collision)
- Âm thanh (Sound)
Lập trình game với java – Đồ hoạ trong game
Để vẽ một cái gì đó, trước tiên chúng ta cần một bề mặt để vẽ. Đó chính là JPanel. Khi vẽ một đối tượng nào đó, chúng ta phải xác định được toạ độ (x, y) và kích thước của đối tượng đó.
Phần code dùng để vẽ các hình oval và hình chữ nhật
public class Game extends JPanel { public void paint(Graphics g) { g.setColor(Color.RED); // Hình oval có tô màu tại vị trí 0,0 g.fillOval(0, 0, 30, 30); // Hình oval không tô màu tại vị trí 0, 50 g.drawOval(0, 50, 30, 30); // Hình chữ nhật có tô màu tại vị trí 50, 0 g.fillRect(50, 0, 30, 30); // Hình chữ nhật không tô màu tại vị trí 50, 50 g.drawRect(50, 50, 30, 30); // Hình oval không tô mau tại vị trí 0, 100 g.drawOval(0, 100, 30, 30); } }
Lập trình game với java – Chuyển động và vòng lặp game (game loop)
Mỗi lần vẽ một đối tượng nào đó, chúng ta phải biết vị trí (x,y) và để di chuyển đối tượng, chúng ta sẽ thay đổi vị trí này theo quy tắc:
- Thay đổi giá trị của x sẽ làm cho đối tượng chuyển động theo chiều ngang
- Thay đổi giá trị của y sẽ làm cho đối tượng chuyển động theo chiều dọc
Xem tuyển dụng Game Developer tại các công ty hàng đầu trên TopDev
Phần code dùng để xử lý chuyển động (move)
private void moveBall() { // Tăng toạ độ x lên 1 x = x + 1; // Tăng toạ độ y lên 1 y = y + 1; }
Phần code dùng để xử lý vòng lặp game (game loop)
while (true) { // Xử lý chuyển động cho quả bóng moveBall(); // Vẽ lại quả bóng ở vị trí mới repaint(); // Delay Thread.sleep(20); }
Lập trình game với java – Nhân vật trong game (Sprite)
Giống như các lĩnh vực nghệ thuật khác, trò chơi có một dàn các nhân vật và mỗi nhân vật có một vai trò cụ thể. Mỗi nhân vật có các đặc điểm như vị trí (x,y), tốc độ và hướng di chuyển.
Tốc độ và hướng di chuyển của nhân vật được hiểu như sau
- Gọi xa, ya đại diện cho tốc độ quả bóng đang di chuyển.
- Nếu xa = 1 thì quả bóng di chuyển về bên phải và xa = -1 thì bóng di chuyển về bên trái.
- Nếu ya = 1 thì bóng di chuyển xuống và ya = -1 thì bóng di chuyển lên trên.
- Mỗi lần di chuyển, tọa độ được cập nhật tăng/giảm một hoặc nhiều hơn một đơn vị tùy thuộc vào hướng di chuyển.
Phần code dùng để xử lý thay đổi hướng di chuyển và tốc độ
private void moveBall() { if (x + xa < 0) xa = 1; if (x + xa > getWidth() - 30) xa = -1; if (y + ya < 0) ya = 1; if (y + ya > getHeight() - 30) ya = -1; //Cập nhật tọa độ x = x + xa; y = y + ya; }
Xem ngay việc làm Java tại TopDev
Lập trình game với java – Xử lý sự kiện trong game
Xử lý sự kiện chính là xử lý sự tương tác giữa người chơi với game. Sự tương tác đó có thể là chạm, nghiêng màn hình (game cho mobile); hoặc khi người chơi click chuột, nhấn một phím trên bàn phím (game cho pc),…
Đối với Mini Tennis, khi người chơi nhấn phím mũi tên left thì cây vợt sẽ chuyển động sang trái, khi người chơi nhấn phím mũi tên right thì cây vợt sẽ chuyển động sang phải. Đây chính là sự kiện bàn phím.
Bên dưới là đoạn code mẫu
KeyListener kl = new KeyListener() { // Xử lý khi một phím được nhả public void keyReleased(KeyEvent arg0) { // Viết xử lý của bạn tại đây } // Xử lý khi một phím được nhấn public void keyPressed(KeyEvent arg0) { // Viết xử lý của bạn tại đây } }; addKeyListener(kl); setFocusable(true);
Lập trình game với java – Xử lý va chạm trong game (collision)
Một trong nhiều phương pháp được xử dụng đó là kiểm tra biên (bound). Đầu tiên người lập trình phải xác định đâu là va chạm trong game. Đối với game Mini Tennis, người lập trình phải xử lý va chạm giữa quả bóng và cây vợt.
Sau khi xác định được va chạm, người lập trình sẽ tạo biên cho những đối tượng này. Tuỳ theo hình dáng của đối tượng mà chúng ta lựa chọn biên cho phù hợp. Hãy xem hình bên dưới.
Phần code mẫu
Tạo biên cho quả bóng
public Rectangle getBallBound() { return new Rectangle(x, y, DIAMETER, DIAMETER); }
Tạo biên cho cây vợt
public Rectangle getBattledoreBound() { return new Rectangle(x, y, WIDTH, HEIGHT); }
Kiểm tra va chạm xử dụng phương thức intersects(). Nếu biên của quả bóng và cây vợt giao nhau thì đông nghĩa quả bóng chạm cây vợt. Phương thức này sẽ trả về true. Phương thức này trả về false cho trường hợp ngược lại.
private boolean isCollision() { return getBattledoreBound().intersects(getBallBound()); }
Lập trình game với java – Bài tập thực hành
Yêu cầu 1: Vẽ quả bóng và cây vợt
- Vẽ hình chữ nhật (Battledore) kích thước 80×20 tại tọa độ y = 300, tọa độ x thay đổi theo điều khiển của người dùng.
- Khi người dùng nhấn phím mũi tên trái/phải, di chuyển Battledore theo hướng tương ứng
Yêu cầu 2: Xử lý va chạm
- Qua bóng (Ball) di chuyển tự động từ trên xuống
- Cây vợt (Battledore) di chuyển sang trái hoặc sang phải theo sự điều khiển của người chơi khi nhấn phím
- Khi quả bóng chạm (Collision) cây vợt thì quả bóng sẽ đổi hướng
Yêu cầu 3: Hoàn thiện game
- Trò chơi sẽ ghi nhận số lần người chơi hứng được quả bóng bằng điểm số. Mỗi lần hứng được quả bóng điểm số tăng lên 1.
- Quả bóng sẽ chuyển động nhanh hơn sau mỗi lần chạm để tăng độ khó.
- Trong game có 3 loại âm thanh: âm thanh quả bóng chạm biên hoặc chạm cây vợt, âm thanh nền và âm thanh khi kết thúc game (game over).
Bài viết gốc được đăng tải tại giasutinhoc.vn
Bạn có thể xem thêm:
- Java map và flatmap – điều gì làm nên khác biệt?
- Hướng dẫn Java Design Pattern – State
- Cách xây dựng ThreadLocal trong Java
Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev
Doc Comment Và Javadoc Trong Java
Bài viết được sự cho phép của tác giả Nhựt Danh
Nhắc Lại Kiểu Documentation Comment
Từ bây giờ chúng ta hãy gọi chức năng này bằng một tên chuẩn tiếng Anh cho thống nhất, hãy gọi chức năng này là Documentation Comment, hay gọi tắt là Doc Comment cũng được. Chúng ta đều hiểu nó là cách comment code theo kiểu document vậy.
Tất cả các kiểu comment đều có một điểm giống nhau là khi build, trình biên dịch sẽ bỏ qua chúng, không build comment vào file build cuối cùng. Nhưng, khác với anh em trong họ comment, Doc Comment không đơn thuần chỉ là để comment, chúng được dùng trong một chuyện khác. Công dụng cụ thể của Doc Comment là gì thì mời bạn xem qua mục sau. Dưới đây là một ví dụ sử dụng comment theo kiểu Doc Comment.
Công Dụng Của Doc Comment
Về phía kinh nghiệm code bao lâu nay của mình, mình vẫn rất thích kiểu Doc Comment này hơn các kiểu comment khác, là vì có các lợi ích sau đây.
Thứ nhất, về mặt giải thích cho các dòng code bạn đang làm, thì Doc Comment sẽ luôn rõ ràng hơn do chúng có được sự hỗ trợ về mặt định dạng nổi bật hơn cho các tham số.
Thứ hai, là lợi ích về mặt sử dụng các dòng code có comment theo kiểu Doc Comment này. Thì khi sử dụng các thành phần được comment “chuẩn”, bạn sẽ thấy comment, hay document sẽ xuất hiện ở thanh ngữ cảnh của Eclipse hay InteiJ (bạn dễ dàng nhìn thấy các document này khi đưa chuột vào lớp hay hàm có Doc Comment).
Thứ ba, về mặt xuất xưởng các thư viện. Doc Comment sẽ được một công cụ có tên Javadoc build ra một trang mô tả theo kiểu HTML. Nó là một trang Web được xây dựng hoàn chỉnh và bạn có thể dùng để publish hay nhúng vào trang Web khác. Rất thích hợp để bạn tạo ra các thư viện Java và gửi đến người dùng thư viện của bạn với đầy đủ các hướng dẫn sử dụng các Java code mà bạn xây dựng. Với lợi ích thứ ba này thì mình mời các bạn đến với mục tiếp theo để trải nghiệm nhé.
Thử Tạo Một HTML Document
Bước này chúng ta hãy cũng trải nghiệm việc sử dụng công cụ Javadoc để tạo ra một HTML document xịn xò.
Thật may là Eclipse hay InteliJ đều hỗ trợ các tương tác đến công cụ Javadoc một cách dễ dàng. Bạn hãy chọn một trong hai công cụ này để thực hành theo các chỉ dẫn sau.
Tạo HTML Document trên Eclipse
Với Eclipse. Với project đang mở. Và dĩ nhiên phải có một vài Doc Comment đã được bạn định nghĩa trong source code. Bạn hãy chọn theo menu Project > Generate Javadoc….
Một cửa sổ xuất hiện, bạn hãy để nguyên như mặc định. Chúng là các thiết lập đường dẫn đến file thực thi Javadoc, project cần tạo Javadoc, cũng như nơi mà thành phẩm HTML document được trích xuất ra (đó chính là thư mục /doc bên trong project của bạn).
Hãy đảm bảo các chọn lựa của bạn giống như hình trên. Sau đó nhấn Next. Một cửa sổ chọn lựa khác xuất hiện như sau.
Ở bước trên, bạn hãy nhập vào tiêu đề cho document (mục Document title). Khi này bạn có thể nhấn Finish vì thực chất bước sau nữa cũng không có gì đáng chú ý cả.
Sau một lúc, bạn sẽ thấy xuất hiện thêm một thư mục /doc bên trong project của bạn ở của sổ Package Explorer. Hãy xổ thư mục này ra và tìm đến file index.html và click đúp vào đó, bạn sẽ thấy nội dung document đã được tạo ra tự động y như một trang Web thực thụ vậy. Và đây là những gì chúng ta đã comment vào source code theo dạng Doc Comment.
Bạn hãy thử trải nghiệm bằng cách click chuột đi tới đi lui trong trang Web này để xem Javadoc giúp tạo các hướng dẫn cho code của chúng ta như thế nào.
Ở mục sau chúng ta sẽ tìm hiểu sâu hơn việc tạo document một cách chỉn chu hơn, đầy đủ và chuyên nghiệp hơn như thế nào nhé.
Tham khảo việc làm Java hấp dẫn trên TopDev
Tạo HTML Document Trên InteliJ
Với InteliJ. Với project đang mở. Và dĩ nhiên phải có một vài Doc Comment đã được bạn định nghĩa trong source code. Bạn hãy chọn theo menu Tools > Generate JavaDoc….
Một cửa sổ xuất hiện, bạn hãy để nguyên như mặc định. Chúng là các thiết lập phạm vi áp dụng để tạo HTML document (scope), cấp độ chia sẻ private/package/protected/public. Và thiết lập nơi mà thành phẩm HTML document được trích xuất ra, bạn có thể chỉ định xuất vào thư mục /doc bên trong project của bạn như dưới đây.
Sau khi nhấn OK ở cửa sổ trên, bạn sẽ thấy ngay lập tức Web Browser mặc định trên máy bạn được mở ra với nội dung chính là giới thiệu về project của bạn kèm với các Doc Comment trong đó.
Bạn hãy thử trải nghiệm bằng cách click chuột đi tới đi lui trong trang Web này để xem Javadoc giúp tạo các hướng dẫn cho code của chúng ta như thế nào.
Ở mục sau chúng ta sẽ tìm hiểu sâu hơn việc tạo document một cách chỉn chu hơn, đầy đủ và chuyên nghiệp hơn như thế nào nhé.
Định Dạng Java Doc Thông Qua Sử Dụng Tag
Ở các ví dụ trên đây, bạn đã nhìn thấy một số Tag được dùng trong Javadoc như @author, @version, @since, @param. Và bạn đã hiểu các Tag này giống như các tham số giúp cho Javadoc có thể tạo ra các HTML và truyền các định nghĩa của từng Tag vào HTML như thế nào rồi đúng không nào. Các Tag trong Javadoc thường không ràng buộc một công thức nào kèm theo cả, bạn chỉ cần vận dụng Tag ở những nơi bạn cần HTML làm nổi bật thông tin đó lên thôi, vì dù sao Doc Comment cũng chỉ là một kiểu comment, nên bạn cứ thoải mái sử dụng đi nhé.
Mình sẽ không giải thích dài dòng về Tag nữa mà vào cụ thể việc sử dụng Tag trong Javadoc như thế nào luôn.
@author, @version, @since
Mời bạn xem ví dụ sử dụng Tag và kết quả xuất ra dưới dạng HTML document.
{@code}, @param
Chi tiết về cách sử dụng 2 Tag này được thể hiện qua ví dụ dưới đây.
@deprecated, {@link}
“Hiệu ứng” của các Tag này được minh họa bằng các ví dụ dưới.
@exception, @throws
Hai Tag này có công dụng như nhau. Giúp thêm một thông tin Throws trong document báo hiệu phương thức này sẽ tung ra một exception.
@return, @see
{@value}
Giúp hiển thị giá trị của các static field.
Tham Khảo Thêm Các Định Dạng Khác
Trên đây mình có trình bày qua các định dạng Tag phổ biến trong Javadoc. Tuy nhiên vẫn còn một số định dạng khác, chẳng hạn như vận dụng thêm các thẻ HTML vào Doc Comment, thì bạn có thể làm quen thông qua việc tìm hiểu chính source code của “chính chủ” Oracle, hoặc bạn hãy để ý các Doc Comment từ các source code của các thư viện khác. Đảm bảo bạn sẽ thấy thích và ngộ ra được nhiều phong cách Doc Comment từ các nguồn này, bạn sẽ nhanh “lên tay” hơn cho việc comment cho source code của chính bạn thôi.
Để xem source code của JDK, đơn giản, khi Eclipse hoặc InteliJ đang mở, hãy nhấn giữ phím Ctrl (Windows) hoặc Command (Mac) và click vào lớp được xây dựng sẵn từ JDK. Như ví dụ dưới đây mình mở ra lớp String, bạn sẽ nhanh chóng nhìn thấy source code của lớp này trên chính IDE của bạn.
Hoặc bạn có thể xem ở một số link online cũng được. Như một vài link mình liệt kê sau.
Kết Luận
Chúng ta vừa xem qua các cách sử dụng Doc Comment trong lập trình Java như thế nào. Hi vọng thông qua bài viết này, các bạn sẽ nâng cao hơn tính “thẩm mỹ” và tính dễ đọc đối với các source code của các bạn thông qua việc nâng cao kỹ năng comment. Cũng như hiểu rõ các document được tạo ra như thế nào ở các thư viện mà các bạn đang dùng.
Bài viết gốc được đăng tải tại yellowcodebooks.com
Xem thêm:
Tìm việc làm IT mọi cấp độ tại TopDev