Penanganan acara

kasedhiya

1. Pambuka

A engine game bakal sethitik nggunakake yen kita mung bisa nggunakake kanggo tarik soko ing layar. Kanggo nulis game lengkap, kita kudu sesambungan karo pangguna! Kanggo luwih tepat, program kita kudu nglacak tumindak pangguna lan nanggapi.

Kanggo nindakake iki, mesin game CodeGym duwe cara khusus sing diarani nalika pangguna ngeklik tombol mouse utawa tombol keyboard.

Titik kelas sing nulis cara iki dhewe, lan banjur mesin game CodeGym tanggung jawab kanggo nelpon. Sampeyan mung kudu ngumumake metode kasebut ing kode sampeyan. Iki luwih gampang kanggo nindakake saka muni.


2. Nggarap mouse

Mesin game duwe rong cara kanggo nggarap mouse:

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

Sampeyan mung ngumumake metode kasebut ing kelas sampeyan dhewe sing marisi Gamekelas kasebut. Banjur tulis kode apa wae sing dikarepake ing metode kasebut. Mesin game bakal nelpon cara kasebut nalika pangguna ngeklik tombol mouse.

onMouseLeftClick(int x, int y)disebut dening engine nalika tombol mouse kiwa diklik. Parameter kasebut minangka koordinat sel ing lapangan dolanan ing ngendi klik ana. Koordinat sel kiwa ndhuwur yaiku (0,0). Kanggo nggunakake metode iki, sampeyan kudu ngilangi, nyelehake @Overrideanotasi sadurunge jeneng metode.

onMouseRightClick(int x, int y)diarani nalika tombol mouse tengen diklik. Kerjane padha karo onMouseLeftClick(int x, int y)cara.

Conto nggunakake cara iki:

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

Ing conto ing ndhuwur, kita nyatakake loro cara: onMouseLeftClick()lan onMouseRightClick(). Cara pisanan bakal diarani nalika pangguna ngeklik tombol mouse kiwa ing sel ing lapangan dolanan. Cara kapindho bakal diarani nalika tombol mouse tengen diklik.

Minangka bantahan, mesin game CodeGym bakal ngliwati (x, y)koordinat sel ing lapangan dolanan ing ngendi mouse diklik.



3. Nggarap keyboard

Mesin game duwe rong cara kanggo nggarap keyboard:

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

Yen sampeyan pengin nindakake soko nalika pangguna mencet tombol, sampeyan mung kudu wara-wara cara iki ing kelas sing oleh warisan kelas Game.

Sampeyan nulis kode ing cara iki, lan mesin game bakal nelpon nalika pangguna mencet (utawa ngeculake) tombol.

onKeyPress(Key key)diarani nalika sembarang tombol ditekan . Nilai tombol sing dipencet (utawa ) diterusake menyang metode minangka parameter. Kanggo nggunakake metode iki, sampeyan kudu ngilangi, nyelehake anotasi sadurunge jeneng metode.Key.UNKNOWNkey@Override

onKeyReleased(Key key)diarani nalika sembarang tombol dirilis . Nilai saka tombol sing cocog (utawa ) bakal ditugasake menyang parameter. Kanggo nggunakake metode iki, sampeyan kudu ngilangi, nyelehake anotasi sadurunge jeneng metode.Key.UNKNOWNkey@Override

Conto nggunakake cara iki:

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. Dhaptar kabeh tombol didhukung

Nalika mesin CodeGym nelpon onKeyPress()lan onKeyReleased()cara, iku liwat informasi kanggo wong-wong mau bab tombol dipencet (dirilis). Kanggo nindakake iki, mesin CodeGym duwe jinis khusus sing diarani Key.

Ing versi mesin saiki, Keyjinis mung ndhukung set winates 9 nilai:

Nilai Apa pangguna dipencet
Key.ENTER
Pangguna menet tombol Enter
Key.ESCAPE
Pangguna menet tombol Esc
Key.PAUSE
Pangguna menet tombol Ngaso
Key.SPACE
Pangguna menet tombol Space
Key.LEFT
Pangguna menet tombol Panah Kiri
Key.RIGHT
Pangguna menet tombol Panah Kanan
Key.UP
Pangguna menet tombol panah munggah
Key.DOWN
Pangguna menet tombol panah mudhun
Key.UNKNOWN
Tombol apa wae kajaba sing kasebut ing ndhuwur

Yen pamuter menet spasi, banjur onKeyPress()cara bakal disebut Key.SPACEminangka parameter. Yen pangguna menet panah kiwa, parameter kasebut bakal dadi Key.LEFT. Yen pangguna mencet tombol apa wae sing ora ana ing dhaptar ing ndhuwur, metode kasebut onKeyPress()bakal diarani Key.UNKNOWNminangka parameter.

Masalah ing kene yaiku game CodeGym sing wis ana dirancang kanggo mbukak ing telpon. Tinimbang keyboard standar, kita duwe 8 tombol virtual:


5. Nggarap timer

Akeh game njupuk Panggonan ing wektu nyata, IE pangguna bisa nindakake apa-apa, nanging acara tartamtu isih dumadi ing game. Kanggo ngidini sampeyan ngleksanakake game kasebut, kita nambahake timer menyang mesin game.

Mangkene cara kerjane: sampeyan nguripake timer lan nyetel wektu sawise iku kudu micu. Contone, 500 ms. Banjur, saben setengah detik, mesin game CodeGym bakal nelpon onTurn()cara kasebut. Kaping pirang-pirang tanpa wates — nganti timer dipateni.

Kepiye cara nggunakake timer?

1. Nguripake timer

Kanggo nguripake timer, kita duwe void setTurnTimer(int timeMs)cara. Cara kasebut njupuk minangka argumen durasi (ing milidetik utawa 1/1000 detik) interval antarane callback. Sampeyan mung kudu nelpon cara iki sapisan, lan mesin game bakal miwiti nelpon onTurn()cara saben timeMsmilliseconds.

2. Ngganti onTurn(int)cara

Kanggo nindakake iki, sampeyan kudu ngumumake void onTurn(int step)metode ing kelas sing marisi Gamekelas kasebut. Mesin game bakal nelpon cara iki. Kanthi saben telpon, mesin ngliwati nomer urut-urutan sing ngenali panggilan metode ( 1, 2, 3, ...).

3. Pateni timer

Yen timer ora dibutuhake maneh, contone amarga pangguna wis rampung game, banjur bisa dipateni. Kanggo nindakake iki, mung nelpon stopTurnTimer()cara.

4 Nyepetake/ngganti wektu

Ing sawetara game, frekuensi acara mundhak kanthi reguler, saengga luwih trep yen bisa nyepetake wektu, yaiku nyuda wektu ing antarane panggilan balik. Lan ora ana sing luwih gampang - mung nelpon setTurnTimer(int timeMs)maneh kanthi nilai anyar, lan wektu antarane telpon bakal onTurn()ganti.

Tuladha:

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

Ing conto prasaja iki, kita nggawe lapangan sing 3 sel dening 3 sel. Banjur kita nguripake timer sing bakal nelpon onTurn()cara saben setengah detik.

Ing kene, warna sel tengah bakal ganti saben setengah detik. Teks sel ora bakal diganti. Sawise 50 detik (100 callback), werna bakal mandheg ganti lan timer bakal mati.


Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar