1. Giới thiệu

Một công cụ trò chơi sẽ ít được sử dụng nếu chúng ta chỉ có thể sử dụng nó để vẽ một thứ gì đó trên màn hình. Để viết một trò chơi chính thức, chúng tôi cần nó tương tác với người dùng! Nói chính xác hơn, chương trình của chúng tôi sẽ theo dõi hành động của người dùng và phản hồi chúng.

Để làm điều này, công cụ trò chơi CodeGym có các phương thức đặc biệt mà nó gọi khi người dùng nhấp vào nút chuột hoặc phím bàn phím.

Mục đích của lớp học là bạn tự viết các phương thức này và sau đó công cụ trò chơi CodeGym chịu trách nhiệm gọi chúng. Tất cả những gì bạn cần là khai báo các phương thức này trong mã của mình. Điều này dễ thực hiện hơn âm thanh.


2. Thao tác với chuột

Công cụ trò chơi có hai phương pháp để làm việc với chuột:

void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)

Bạn chỉ cần khai báo các phương thức này trong lớp của riêng bạn, lớp kế thừa Gamelớp đó. Và sau đó viết bất kỳ mã nào bạn muốn trong các phương thức này. Công cụ trò chơi sẽ gọi các phương thức này khi người dùng nhấp vào nút chuột.

onMouseLeftClick(int x, int y)được gọi bởi động cơ khi nhấp vào nút chuột trái . Các tham số của nó là tọa độ của ô của sân chơi nơi nhấp chuột xảy ra. Tọa độ của ô trên cùng bên trái là (0,0). Để sử dụng phương thức này, bạn cần ghi đè lên nó, đặt @Overridechú thích trước tên phương thức.

onMouseRightClick(int x, int y)được gọi khi nhấp chuột phải . Nó hoạt động tương tự như onMouseLeftClick(int x, int y)phương pháp.

Ví dụ về việc sử dụng các phương pháp này:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
   @Override
   public void initialize() {
      // Set the size of the playing field to 3x3
      setScreenSize(3, 3);

      // Paint the playing field white
      for (int x = 0; x < 3; x++) {
         for (int y = 0; y < 3; y++) {
            setCellColor(x, y, Color.WHITE);
         }
      }
   }

   @Override
   public void onMouseLeftClick(int x, int y) {
      // Put a "X" in the cell that was clicked with the left mouse button
      setCellValue(x, y, "X");
   }

   @Override
   public void onMouseRightClick(int x, int y) {
      // Clear the cell that was clicked with the right mouse button
      setCellValue(x, y, "");
   }
}

Trong ví dụ trên, chúng tôi đã khai báo cả hai phương thức: onMouseLeftClick()onMouseRightClick(). Phương thức đầu tiên sẽ được gọi khi người dùng nhấp chuột trái vào các ô của sân chơi. Phương thức thứ hai sẽ được gọi khi nhấp chuột phải.

Là đối số, công cụ trò chơi CodeGym sẽ chuyển (x, y)tọa độ của ô của sân chơi nơi nhấp chuột.



3. Thao tác với bàn phím

Công cụ trò chơi có hai phương pháp để làm việc với bàn phím:

void onKeyPress(Key key);
void onKeyReleased(Key key);

Nếu bạn muốn làm gì khi người dùng nhấn phím, bạn chỉ cần khai báo các phương thức này trong lớp kế thừa lớp của bạn Game.

Bạn viết mã của mình theo các phương thức này và công cụ trò chơi sẽ gọi chúng khi người dùng nhấn (hoặc nhả) một phím.

onKeyPress(Key key)được gọi khi bất kỳ phím nào được nhấn . Giá trị của phím được nhấn (hoặc ) được truyền cho phương thức dưới dạng tham số. Để sử dụng phương thức này, bạn cần ghi đè lên nó, đặt chú thích trước tên phương thức.Key.UNKNOWNkey@Override

onKeyReleased(Key key)được gọi khi bất kỳ phím nào được giải phóng . Giá trị của khóa tương ứng (hoặc ) được gán cho tham số. Để sử dụng phương thức này, bạn cần ghi đè lên nó, đặt chú thích trước tên phương thức.Key.UNKNOWNkey@Override

Ví dụ về việc sử dụng các phương pháp này:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
   @Override
   public void initialize() {
      // Set the size of the playing field to 3x3
      setScreenSize(3, 3);

      // Paint the playing field white
      for (int x = 0; x < 3; x++) {
         for (int y = 0; y < 3; y++) {
            setCellColor(x, y, Color.WHITE);
         }
      }
   }

   @Override
   public void onKeyPress(Key key) {
      // When the spacebar is pressed, the center cell turns yellow
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.YELLOW);
      }
   }

   @Override
   public void onKeyReleased(Key key) {
      // When the spacebar is released, the center cell returns to white
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.WHITE);
      }
   }
}


4. Danh sách tất cả các khóa được hỗ trợ

Khi công cụ CodeGym gọi các phương thức onKeyPress()onKeyReleased(), nó sẽ chuyển thông tin cho chúng về phím được nhấn (nhả). Để làm điều này, công cụ CodeGym có một loại đặc biệt được gọi là Key.

Trong phiên bản hiện tại của công cụ, Keyloại chỉ hỗ trợ một bộ giới hạn gồm 9 giá trị:

Giá trị Nội dung người dùng đã nhấn
Key.ENTER
Người dùng nhấn phím Enter
Key.ESCAPE
Người dùng nhấn phím Esc
Key.PAUSE
Người dùng nhấn phím Tạm dừng
Key.SPACE
Người dùng nhấn phím Space
Key.LEFT
Người dùng nhấn phím mũi tên trái
Key.RIGHT
Người dùng nhấn phím mũi tên phải
Key.UP
Người dùng nhấn phím mũi tên lên
Key.DOWN
Người dùng nhấn phím mũi tên xuống
Key.UNKNOWN
Bất kỳ khóa nào khác với những khóa được liệt kê ở trên

Nếu người chơi nhấn phím cách, thì onKeyPress()phương thức sẽ được gọi với Key.SPACEtham số. Nếu người dùng nhấn mũi tên trái thì tham số sẽ là Key.LEFT. Nếu người dùng nhấn bất kỳ phím nào không có trong danh sách trên, thì phương onKeyPress()thức sẽ được gọi với Key.UNKNOWNtham số.

Vấn đề ở đây là các trò chơi CodeGym hiện tại được thiết kế để chạy trên điện thoại. Thay vì bàn phím tiêu chuẩn, chúng ta có 8 nút ảo:


5. Làm việc với bộ đếm thời gian

Nhiều trò chơi diễn ra trong thời gian thực, tức là người dùng có thể không làm gì cả, nhưng một số sự kiện nhất định vẫn diễn ra trong trò chơi. Để cho phép bạn triển khai các trò chơi như vậy, chúng tôi đã thêm bộ hẹn giờ vào công cụ trò chơi.

Đây là cách nó hoạt động: bạn bật bộ hẹn giờ và đặt thời gian sau đó nó sẽ được kích hoạt. Ví dụ: 500 ms. Sau đó, cứ sau nửa giây, công cụ trò chơi CodeGym sẽ gọi onTurn()phương thức này. Vô số lần — cho đến khi tắt bộ hẹn giờ.

Làm thế nào để bạn sử dụng một bộ đếm thời gian?

1. Bật hẹn giờ

Để bật hẹn giờ, chúng ta có void setTurnTimer(int timeMs)phương pháp. Phương thức này lấy đối số là thời lượng (tính bằng mili giây hoặc 1/1000 giây) của khoảng thời gian giữa các lần gọi lại. Bạn chỉ cần gọi phương thức này một lần và công cụ trò chơi sẽ bắt đầu gọi onTurn()phương thức này sau mỗi timeMsmili giây.

2. Ghi đè onTurn(int)phương thức

Để làm điều này, bạn phải khai báo một void onTurn(int step)phương thức trong một lớp kế thừa Gamelớp đó. Công cụ trò chơi sẽ gọi phương thức này. Với mỗi lệnh gọi, công cụ chuyển một số thứ tự xác định lệnh gọi phương thức ( 1, 2, 3, ...).

3. Hẹn giờ tắt

Nếu bộ đếm thời gian không còn cần thiết, chẳng hạn như vì người dùng đã hoàn thành trò chơi, thì có thể tắt nó đi. Để làm điều này, chỉ cần gọi stopTurnTimer()phương thức.

4 Tăng tốc/thay đổi bộ hẹn giờ

Trong một số trò chơi, tần suất của các sự kiện tăng lên thường xuyên, vì vậy sẽ rất thuận tiện nếu chúng tôi có thể tăng tốc bộ đếm thời gian, tức là giảm thời gian giữa các lần gọi lại. Và không gì có thể dễ dàng hơn — chỉ cần gọi setTurnTimer(int timeMs)lại với giá trị mới và thời gian giữa các lần gọi đến onTurn()sẽ thay đổi.

Ví dụ:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
   ...
   @Override
   public void initialize() {
      // Create a 3x3 playing field
      setScreenSize(3, 3);
      showGrid(false);
      setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

      setTurnTimer(500); // Turn on the timer. The interval between callbacks is 500ms.
   }

   @Override
   public void onTurn(int step) {
      if (step == 100) {
         stopTurnTimer(); // If this is the 100th callback, then turn off the timer
      }

      if (step % 2 == 1) {
         // If this is an odd calllback, then set the cell background to red
         setCellColor(1, 1, Color.RED);
      } else {
         // If this is an even callback, then set the cell background to blue
         setCellColor(1, 1, Color.BLUE);
      }
   }
   ...
}

Trong ví dụ đơn giản này, chúng tôi đã tạo một trường có kích thước 3 ô x 3 ô. Sau đó, chúng tôi bật bộ đếm thời gian sẽ gọi onTurn()phương thức cứ sau nửa giây.

Ở đây, màu của ô trung tâm sẽ thay đổi sau mỗi nửa giây. Văn bản của ô sẽ không thay đổi. Sau 50 giây (100 lần gọi lại), màu sẽ ngừng thay đổi và bộ hẹn giờ sẽ tắt.