1. Pengenalan

Enjin permainan tidak akan berguna jika kita hanya boleh menggunakannya untuk melukis sesuatu pada skrin. Untuk menulis permainan yang lengkap, kami memerlukannya untuk berinteraksi dengan pengguna! Untuk menjadi lebih tepat, program kami harus menjejaki tindakan pengguna dan bertindak balas kepada mereka.

Untuk melakukan ini, enjin permainan CodeGym mempunyai kaedah khas yang dipanggil apabila pengguna mengklik butang tetikus atau kekunci papan kekunci.

Maksud kelas ialah anda menulis sendiri kaedah ini, dan kemudian enjin permainan CodeGym bertanggungjawab untuk memanggilnya. Apa yang anda perlukan ialah mengisytiharkan kaedah ini dalam kod anda. Ini lebih mudah dilakukan daripada kedengarannya.


2. Bekerja dengan tetikus

Enjin permainan mempunyai dua kaedah untuk bekerja dengan tetikus:

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

Anda hanya mengisytiharkan kaedah ini dalam kelas anda sendiri yang mewarisi Gamekelas. Dan kemudian tulis apa sahaja kod yang anda mahu dalam kaedah ini. Enjin permainan akan memanggil kaedah ini apabila pengguna mengklik butang tetikus.

onMouseLeftClick(int x, int y)dipanggil oleh enjin apabila butang kiri tetikus diklik. Parameternya ialah koordinat sel medan permainan tempat klik berlaku. Koordinat sel kiri atas ialah (0,0). Untuk menggunakan kaedah ini, anda perlu mengatasinya, meletakkan anotasi @Overridesebelum nama kaedah.

onMouseRightClick(int x, int y)dipanggil apabila butang kanan tetikus diklik. Ia berfungsi sama dengan onMouseLeftClick(int x, int y)kaedah.

Contoh penggunaan kaedah 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 mengisytiharkan kedua-dua kaedah: onMouseLeftClick()dan onMouseRightClick(). Kaedah pertama akan dipanggil apabila pengguna mengklik butang kiri tetikus pada sel-sel padang permainan. Kaedah kedua akan dipanggil apabila butang kanan tetikus diklik.

Sebagai hujah, enjin permainan CodeGym akan melepasi (x, y)koordinat sel medan permainan tempat tetikus diklik.



3. Bekerja dengan papan kekunci

Enjin permainan mempunyai dua kaedah untuk bekerja dengan papan kekunci:

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

Jika anda ingin melakukan sesuatu apabila pengguna menekan kekunci, anda hanya perlu mengisytiharkan kaedah ini dalam kelas anda yang mewarisi kelas Game.

Anda menulis kod anda dalam kaedah ini, dan enjin permainan akan memanggilnya apabila pengguna menekan (atau melepaskan) kekunci.

onKeyPress(Key key)dipanggil apabila sebarang kekunci ditekan . Nilai kekunci yang ditekan (atau ) dihantar kepada kaedah sebagai parameter. Untuk menggunakan kaedah ini, anda perlu mengatasinya, meletakkan anotasi sebelum nama kaedah.Key.UNKNOWNkey@Override

onKeyReleased(Key key)dipanggil apabila sebarang kunci dilepaskan . Nilai kunci yang sepadan (atau ) diberikan kepada parameter. Untuk menggunakan kaedah ini, anda perlu mengatasinya, meletakkan anotasi sebelum nama kaedah.Key.UNKNOWNkey@Override

Contoh penggunaan kaedah 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. Senarai semua kunci yang disokong

Apabila enjin CodeGym memanggil kaedah onKeyPress()dan onKeyReleased(), ia menghantar maklumat kepada mereka tentang kekunci yang ditekan (dilepaskan). Untuk melakukan ini, enjin CodeGym mempunyai jenis khas yang dipanggil Key.

Dalam versi semasa enjin, Keyjenis hanya menyokong set terhad 9 nilai:

Nilai Apa yang pengguna tekan
Key.ENTER
Pengguna menekan kekunci Enter
Key.ESCAPE
Pengguna menekan kekunci Esc
Key.PAUSE
Pengguna menekan kekunci Jeda
Key.SPACE
Pengguna menekan kekunci Space
Key.LEFT
Pengguna menekan kekunci Anak Panah Kiri
Key.RIGHT
Pengguna menekan kekunci Anak Panah Kanan
Key.UP
Pengguna menekan kekunci Anak Panah Atas
Key.DOWN
Pengguna menekan kekunci Anak Panah Bawah
Key.UNKNOWN
Mana-mana kunci selain daripada yang disenaraikan di atas

Jika pemain menekan bar ruang, maka onKeyPress()kaedah itu akan dipanggil Key.SPACEsebagai parameter. Jika pengguna menekan anak panah kiri, maka parameternya ialah Key.LEFT. Jika pengguna menekan mana-mana kekunci yang tiada dalam senarai di atas, maka onKeyPress()kaedah tersebut akan dipanggil Key.UNKNOWNsebagai parameter.

Isunya di sini ialah permainan CodeGym sedia ada direka untuk dijalankan pada telefon. Daripada papan kekunci standard, kami mempunyai 8 butang maya:


5. Bekerja dengan pemasa

Banyak permainan berlaku dalam masa nyata, iaitu pengguna mungkin tidak melakukan apa-apa, tetapi peristiwa tertentu masih berlaku dalam permainan. Untuk membolehkan anda melaksanakan permainan sedemikian, kami menambah pemasa pada enjin permainan.

Begini cara ia berfungsi: anda menghidupkan pemasa dan menetapkan masa selepas itu ia harus dicetuskan. Sebagai contoh, 500 ms. Kemudian, setiap setengah saat, enjin permainan CodeGym akan memanggil onTurn()kaedah tersebut. Bilangan kali yang tidak terhingga — sehingga pemasa dimatikan.

Bagaimana anda menggunakan pemasa?

1. Hidupkan pemasa

Untuk menghidupkan pemasa, kami mempunyai kaedahnya void setTurnTimer(int timeMs). Kaedah ini mengambil sebagai hujah tempoh (dalam milisaat atau 1/1000s saat) selang antara panggilan balik. Anda hanya perlu memanggil kaedah ini sekali, dan enjin permainan akan mula memanggil onTurn()kaedah setiap timeMsmilisaat.

2. Gantikan onTurn(int)kaedah

Untuk melakukan ini, anda mesti mengisytiharkan void onTurn(int step)kaedah dalam kelas yang mewarisi Gamekelas. Enjin permainan akan memanggil kaedah ini. Dengan setiap panggilan, enjin menghantar nombor berjujukan yang mengenal pasti panggilan kaedah ( 1, 2, 3, ...).

3. Matikan pemasa

Jika pemasa tidak lagi diperlukan, contohnya kerana pengguna telah menyelesaikan permainan, maka ia boleh dimatikan. Untuk melakukan ini, hanya panggil stopTurnTimer()kaedah.

4 Percepat/tukar pemasa

Dalam sesetengah permainan, kekerapan acara meningkat dengan kerap, jadi lebih mudah untuk dapat mempercepatkan pemasa kami, iaitu mengurangkan masa antara panggilan balik. Dan tiada apa yang lebih mudah — cuma panggil setTurnTimer(int timeMs)sekali lagi dengan nilai baharu, dan masa 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 mudah ini, kami mencipta medan yang 3 sel dengan 3 sel. Kemudian kami menghidupkan pemasa yang akan memanggil onTurn()kaedah setiap setengah saat.

Di sini, warna sel pusat akan berubah setiap setengah saat. Teks sel tidak akan berubah. Selepas 50 saat (100 panggilan balik), warna akan berhenti berubah dan pemasa akan dimatikan.