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 Game
klase. 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 @Override
anotasyon 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 Game
klase.
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.UNKNOWN
key
@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.UNKNOWN
key
@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, Key
sinusuportahan lamang ng uri ang isang limitadong hanay ng 9 na halaga:
Halaga | Ano ang pinindot ng gumagamit |
---|---|
|
Pinindot ng user ang Enter key |
|
Pinindot ng user ang Esc key |
|
Pinindot ng user ang Pause key |
|
Pinindot ng user ang Space key |
|
Pinindot ng user ang Left Arrow key |
|
Pinindot ng user ang Right Arrow key |
|
Pinindot ng user ang Up Arrow key |
|
Pinindot ng user ang Down Arrow key |
|
Anumang susi maliban sa mga nakalista sa itaas |
Kung pinindot ng player ang space bar, ang onKeyPress()
pamamaraan ay tatawagin Key.SPACE
bilang 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.UNKNOWN
bilang 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 timeMs
millisecond.
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 Game
klase. 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.