1. Panimula

Walang gaanong silbi ang isang game engine kung magagamit lang natin ito upang gumuhit ng isang bagay sa screen. Upang magsulat ng isang ganap na laro, kailangan namin ito upang makipag-ugnayan sa user! Upang maging mas tumpak, dapat na subaybayan ng aming programa ang mga aksyon ng gumagamit at tumugon sa mga ito.

Upang gawin ito, ang CodeGym game engine ay may mga espesyal na pamamaraan na tinatawag nito kapag nag-click ang user sa mga pindutan ng mouse o keyboard key.

Ang punto ng klase ay ikaw mismo ang sumulat ng mga pamamaraang ito, at pagkatapos ay ang CodeGym game engine ay may pananagutan sa pagtawag sa kanila. Ang kailangan mo lang ay ipahayag ang mga pamamaraang ito sa iyong code. Ito ay mas madaling gawin kaysa ito ay tunog.


2. Paggawa gamit ang mouse

Ang engine ng laro ay may dalawang pamamaraan para sa pagtatrabaho gamit ang mouse:

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

Idedeklara mo lang ang mga pamamaraang ito sa sarili mong klase na nagmamana sa Gameklase. At pagkatapos ay isulat ang anumang code na gusto mo sa mga pamamaraang ito. Tatawagin ng game engine ang mga pamamaraang ito kapag na-click ng user ang mga pindutan ng mouse.

onMouseLeftClick(int x, int y)ay tinatawag ng makina kapag na-click ang kaliwang pindutan ng mouse . Ang mga parameter nito ay ang mga coordinate ng cell ng playing field kung saan naganap ang pag-click. Ang mga coordinate ng kaliwang itaas na cell ay (0,0). Upang magamit ang paraang ito, kailangan mong i-override ito, ilagay ang @Overrideanotasyon bago ang pangalan ng pamamaraan.

onMouseRightClick(int x, int y)ay tinatawag kapag ang kanang pindutan ng mouse ay na-click. Gumagana ito katulad ng onMouseLeftClick(int x, int y)pamamaraan.

Mga halimbawa ng paggamit ng mga pamamaraang ito:

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

Sa halimbawa sa itaas, idineklara namin ang parehong mga pamamaraan: onMouseLeftClick()at onMouseRightClick(). Ang unang paraan ay tatawagin kapag na-click ng user ang kaliwang pindutan ng mouse sa mga cell ng playing field. Ang pangalawang paraan ay tatawagin kapag ang kanang pindutan ng mouse ay na-click.

Bilang mga argumento, ipapasa ng CodeGym game engine ang (x, y)mga coordinate ng cell ng playing field kung saan na-click ang mouse.



3. Paggawa gamit ang keyboard

Ang engine ng laro ay may dalawang paraan para sa pagtatrabaho sa keyboard:

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

Kung gusto mong gumawa ng isang bagay kapag pinindot ng user ang isang key, kailangan mo lang ideklara ang mga pamamaraang ito sa iyong klase na nagmamana sa Gameklase.

Isusulat mo ang iyong code sa mga pamamaraang ito, at tatawagan sila ng game engine kapag pinindot (o inilabas) ng user ang isang key.

onKeyPress(Key key)ay tinatawag kapag pinindot ang anumang key . Ang halaga ng pinindot na key (o ) ay ipinapasa sa pamamaraan bilang parameter. Upang magamit ang paraang ito, kailangan mong i-override ito, ilagay ang anotasyon bago ang pangalan ng pamamaraan.Key.UNKNOWNkey@Override

onKeyReleased(Key key)ay tinatawag kapag ang anumang susi ay inilabas . Ang halaga ng kaukulang key (o ) ay itatalaga sa parameter. Upang magamit ang paraang ito, kailangan mong i-override ito, ilagay ang anotasyon bago ang pangalan ng pamamaraan.Key.UNKNOWNkey@Override

Mga halimbawa ng paggamit ng mga pamamaraang ito:

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. Listahan ng lahat ng sinusuportahang key

Kapag tinawag ng CodeGym engine ang onKeyPress()at onKeyReleased()mga pamamaraan, ipinapasa nito ang impormasyon sa kanila tungkol sa pinindot (pinakawalan) na key. Upang gawin ito, ang CodeGym engine ay may espesyal na uri na tinatawag na Key.

Sa kasalukuyang bersyon ng engine, Keysinusuportahan lamang ng uri ang isang limitadong hanay ng 9 na halaga:

Halaga Ano ang pinindot ng gumagamit
Key.ENTER
Pinindot ng user ang Enter key
Key.ESCAPE
Pinindot ng user ang Esc key
Key.PAUSE
Pinindot ng user ang Pause key
Key.SPACE
Pinindot ng user ang Space key
Key.LEFT
Pinindot ng user ang Left Arrow key
Key.RIGHT
Pinindot ng user ang Right Arrow key
Key.UP
Pinindot ng user ang Up Arrow key
Key.DOWN
Pinindot ng user ang Down Arrow key
Key.UNKNOWN
Anumang susi maliban sa mga nakalista sa itaas

Kung pinindot ng player ang space bar, ang onKeyPress()pamamaraan ay tatawagin Key.SPACEbilang parameter. Kung pinindot ng user ang kaliwang arrow, ang parameter ay Key.LEFT. Kung pinindot ng user ang anumang key na wala sa listahan sa itaas, ang onKeyPress()pamamaraan ay tatawagin Key.UNKNOWNbilang parameter.

Ang isyu dito ay ang umiiral na mga laro ng CodeGym ay idinisenyo upang tumakbo sa isang telepono. Sa halip na karaniwang keyboard, mayroon kaming 8 virtual na pindutan:


5. Paggawa gamit ang isang timer

Maraming mga laro ang nagaganap sa real time, ibig sabihin, ang gumagamit ay maaaring walang magawa, ngunit ang ilang mga kaganapan ay nangyayari pa rin sa laro. Upang payagan kang ipatupad ang mga naturang laro, nagdagdag kami ng timer sa engine ng laro.

Narito kung paano ito gumagana: ino-on mo ang timer at itinakda ang oras kung kailan dapat itong ma-trigger. Halimbawa, 500 ms. Pagkatapos, bawat kalahating segundo, tatawagin ng CodeGym game engine ang onTurn()pamamaraan. Isang walang katapusang bilang ng beses — hanggang sa i-off ang timer.

Paano ka gumamit ng timer?

1. I-on ang timer

Upang i-on ang timer, mayroon kaming void setTurnTimer(int timeMs)paraan. Kinukuha ng pamamaraan bilang argumento ang tagal (sa millisecond o 1/1000s ng isang segundo) ng agwat sa pagitan ng mga callback. Kailangan mo lang tawagan ang pamamaraang ito nang isang beses, at magsisimulang tawagan ng game engine ang onTurn()pamamaraan tuwing timeMsmillisecond.

2. I-override ang onTurn(int)pamamaraan

Upang gawin ito, dapat kang magdeklara ng isang void onTurn(int step)pamamaraan sa isang klase na nagmamana sa Gameklase. Tatawagin ng game engine ang pamamaraang ito. Sa bawat tawag, ipinapasa ng makina ang isang sequential number na nagpapakilala sa method call ( 1, 2, 3, ...).

3. I-off ang timer

Kung hindi na kailangan ang timer, halimbawa dahil natapos na ng user ang laro, maaari itong i-off. Upang gawin ito, tawagan lamang ang stopTurnTimer()pamamaraan.

4 Pabilisin/palitan ang timer

Sa ilang mga laro, ang dalas ng mga kaganapan ay regular na tumataas, kaya magiging maginhawa upang mapabilis ang aming timer, ibig sabihin, bawasan ang oras sa pagitan ng mga callback. At walang mas madali — tumawag lang setTurnTimer(int timeMs)muli gamit ang bagong halaga, at onTurn()magbabago ang oras sa pagitan ng mga tawag.

Halimbawa:

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

Sa simpleng halimbawang ito, gumawa kami ng field na 3 cell sa 3 cell. Pagkatapos ay binuksan namin ang isang timer na tatawag sa onTurn()pamamaraan bawat kalahating segundo.

Dito, magbabago ang kulay ng gitnang cell bawat kalahating segundo. Hindi magbabago ang text ng cell. Pagkatapos ng 50 segundo (100 callback), hihinto ang pagbabago ng kulay at mag-o-off ang timer.