1. Perkenalan

Mesin game tidak akan banyak berguna jika kita hanya bisa menggunakannya untuk menggambar sesuatu di layar. Untuk menulis game yang lengkap, kami membutuhkannya untuk berinteraksi dengan pengguna! Lebih tepatnya, program kita harus melacak tindakan pengguna dan menanggapinya.

Untuk melakukan ini, mesin game CodeGym memiliki metode khusus yang dipanggil saat pengguna mengklik tombol mouse atau tombol keyboard.

Inti dari kelas ini adalah Anda menulis metode ini sendiri, dan kemudian mesin game CodeGym bertanggung jawab untuk memanggilnya. Yang Anda butuhkan hanyalah mendeklarasikan metode ini dalam kode Anda. Ini lebih mudah dilakukan daripada kedengarannya.


2. Bekerja dengan mouse

Mesin game memiliki dua metode untuk bekerja dengan mouse:

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

Anda cukup mendeklarasikan metode ini di kelas Anda sendiri yang mewarisi Gamekelas tersebut. Dan kemudian tulis kode apa pun yang Anda inginkan dalam metode ini. Mesin game akan memanggil metode ini saat pengguna mengklik tombol mouse.

onMouseLeftClick(int x, int y)dipanggil oleh mesin ketika tombol kiri mouse diklik. Parameternya adalah koordinat sel lapangan permainan tempat klik terjadi. Koordinat sel kiri atas adalah (0,0). Untuk menggunakan metode ini, Anda perlu menimpanya, menempatkan anotasi @Overridesebelum nama metode.

onMouseRightClick(int x, int y)dipanggil ketika tombol kanan mouse diklik. Cara kerjanya mirip dengan onMouseLeftClick(int x, int y)metode.

Contoh penggunaan metode ini:

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, "");
   }
}

Dalam contoh di atas, kami mendeklarasikan kedua metode: onMouseLeftClick()dan onMouseRightClick(). Metode pertama akan dipanggil saat pengguna mengklik tombol kiri mouse pada sel lapangan bermain. Metode kedua akan dipanggil saat tombol kanan mouse diklik.

Sebagai argumen, mesin game CodeGym akan meneruskan (x, y)koordinat sel lapangan permainan tempat mouse diklik.



3. Bekerja dengan keyboard

Mesin game memiliki dua metode untuk bekerja dengan keyboard:

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

Jika Anda ingin melakukan sesuatu saat pengguna menekan tombol, Anda hanya perlu mendeklarasikan metode ini di kelas Anda yang mewarisi Gamekelas tersebut.

Anda menulis kode Anda dalam metode ini, dan mesin game akan memanggilnya saat pengguna menekan (atau melepaskan) tombol.

onKeyPress(Key key)dipanggil saat sembarang tombol ditekan . Nilai dari tombol yang ditekan (atau ) diteruskan ke metode sebagai parameter. Untuk menggunakan metode ini, Anda perlu menimpanya, menempatkan anotasi sebelum nama metode.Key.UNKNOWNkey@Override

onKeyReleased(Key key)dipanggil saat tombol apa saja dilepaskan . Nilai kunci yang sesuai (atau ) ditetapkan ke parameter. Untuk menggunakan metode ini, Anda perlu menimpanya, menempatkan anotasi sebelum nama metode.Key.UNKNOWNkey@Override

Contoh penggunaan metode ini:

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. Daftar semua kunci yang didukung

Saat mesin CodeGym memanggil metode onKeyPress()dan onKeyReleased(), ia memberikan informasi kepada mereka tentang tombol yang ditekan (dilepas). Untuk melakukan ini, mesin CodeGym memiliki tipe khusus yang disebut Key.

Dalam versi mesin saat ini, Keytipe ini hanya mendukung 9 nilai terbatas:

Nilai Apa yang ditekan pengguna
Key.ENTER
Pengguna menekan tombol Enter
Key.ESCAPE
Pengguna menekan tombol Esc
Key.PAUSE
Pengguna menekan tombol Jeda
Key.SPACE
Pengguna menekan tombol Spasi
Key.LEFT
Pengguna menekan tombol Panah Kiri
Key.RIGHT
Pengguna menekan tombol Panah Kanan
Key.UP
Pengguna menekan tombol Panah Atas
Key.DOWN
Pengguna menekan tombol Panah Bawah
Key.UNKNOWN
Kunci apa pun selain yang tercantum di atas

Jika pemain menekan spasi, maka onKeyPress()metode akan dipanggil dengan Key.SPACEparameter. Jika pengguna menekan panah kiri, maka parameternya adalah Key.LEFT. Jika pengguna menekan sembarang tombol yang tidak ada dalam daftar di atas, maka onKeyPress()metode tersebut akan dipanggil dengan Key.UNKNOWNsebagai parameter.

Masalahnya di sini adalah game CodeGym yang ada dirancang untuk dijalankan di ponsel. Alih-alih keyboard standar, kami memiliki 8 tombol virtual:


5. Bekerja dengan pengatur waktu

Banyak game berlangsung dalam waktu nyata, yaitu pengguna mungkin tidak melakukan apa-apa, tetapi peristiwa tertentu masih terjadi di dalam game. Untuk memungkinkan Anda mengimplementasikan game semacam itu, kami menambahkan pengatur waktu ke mesin game.

Begini cara kerjanya: Anda menyalakan pengatur waktu dan menyetel waktu setelah itu harus dipicu. Misalnya, 500 ms. Kemudian, setiap setengah detik, mesin game CodeGym akan memanggil onTurn()metode tersebut. Jumlah yang tak terbatas — sampai timer dimatikan.

Bagaimana Anda menggunakan pengatur waktu?

1. Nyalakan pengatur waktu

Untuk menyalakan timer, kami punya caranya void setTurnTimer(int timeMs). Metode mengambil sebagai argumen durasi (dalam milidetik atau 1/1000 detik) dari interval antara callback. Anda hanya perlu memanggil metode ini satu kali, dan mesin game akan mulai memanggil onTurn()metode tersebut setiap timeMsmilidetik.

2. Ganti onTurn(int)metode

Untuk melakukan ini, Anda harus mendeklarasikan void onTurn(int step)metode di kelas yang mewarisi Gamekelas tersebut. Mesin game akan memanggil metode ini. Dengan setiap panggilan, mesin melewati nomor urut yang mengidentifikasi panggilan metode ( 1, 2, 3, ...).

3. Matikan pengatur waktu

Jika timer sudah tidak diperlukan lagi, misalnya karena pengguna sudah selesai bermain, maka bisa dimatikan. Untuk melakukan ini, cukup panggil metodenya stopTurnTimer().

4 Mempercepat/mengubah timer

Di beberapa game, frekuensi kejadian meningkat secara teratur, jadi akan lebih mudah untuk mempercepat pengatur waktu kita, yaitu mengurangi waktu antar panggilan balik. Dan tidak ada yang lebih mudah — cukup panggil setTurnTimer(int timeMs)lagi dengan nilai baru, dan waktu antara panggilan ke onTurn()akan berubah.

Contoh:

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);
      }
   }
   ...
}

Dalam contoh sederhana ini, kami membuat bidang yang terdiri dari 3 sel kali 3 sel. Kemudian kami menyalakan pengatur waktu yang akan memanggil onTurn()metode setiap setengah detik.

Di sini, warna sel pusat akan berubah setiap setengah detik. Teks sel tidak akan berubah. Setelah 50 detik (100 panggilan balik), warna akan berhenti berubah dan pengatur waktu akan mati.