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 Game
kelas. 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 @Override
sebelum 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.UNKNOWN
key
@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.UNKNOWN
key
@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, Key
jenis hanya menyokong set terhad 9 nilai:
Nilai | Apa yang pengguna tekan |
---|---|
|
Pengguna menekan kekunci Enter |
|
Pengguna menekan kekunci Esc |
|
Pengguna menekan kekunci Jeda |
|
Pengguna menekan kekunci Space |
|
Pengguna menekan kekunci Anak Panah Kiri |
|
Pengguna menekan kekunci Anak Panah Kanan |
|
Pengguna menekan kekunci Anak Panah Atas |
|
Pengguna menekan kekunci Anak Panah Bawah |
|
Mana-mana kunci selain daripada yang disenaraikan di atas |
Jika pemain menekan bar ruang, maka onKeyPress()
kaedah itu akan dipanggil Key.SPACE
sebagai 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.UNKNOWN
sebagai 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 timeMs
milisaat.
2. Gantikan onTurn(int)
kaedah
Untuk melakukan ini, anda mesti mengisytiharkan void onTurn(int step)
kaedah dalam kelas yang mewarisi Game
kelas. 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.