Bu lektsiyada loyihalar-o'yinlar yozishda
voqealarni qayta ishlash usullari haqida batafsil gapiramiz.
1. Sichqoncha bilan ishlash
Sichqoncha bilan ishlash uchun o'yin dvijokida ikki metod bor:void onMouseLeftClick(int x, int y);void onMouseRightClick(int x, int y);
Game dan meros qilib olingan o'yin sinfida e'lon qilasiz va ularga istalgan kod yozasiz. Dvijok foydalanuvchi sichqoncha tugmachalarini bosganida o'z-o'zidan ularni chaqiradi.
onMouseLeftClick(int x, int y)— sichqonchaning chap tugmasi bosilganda dvijok tomonidan chaqiriladi. Argumentlar sifatida klik sodir bo'lgan o'yin maydoni hujayrasining koordinatlarini oladi. Eng chap yuqori hujayra koordinatalarga ega (0,0). Bu metoddan foydalanish uchun uni qayta aniqlash kerak.onMouseRightClick(int x, int y)— sichqonchaning o'ng tugmasi bosilganda chaqiriladi.onMouseLeftClick(int x, int y)metodiga o'xshash ishlaydi.
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;
public class MySuperGame extends Game {
@Override
public void initialize() {
// O'yin maydoni o'lchamini 3x3 ga o'rnatamiz
setScreenSize(3, 3);
// O'yin maydonini oq rangga bo'yaymiz
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) {
// Sichqonchaning chap tugmasi bilan bosilgan hujayrada "X" belgisini o'rnatamiz
setCellValue(x, y, "X");
}
@Override
public void onMouseRightClick(int x, int y) {
// Sichqonchaning o'ng tugmasi bilan bosilgan hujayrani tozalaymiz
setCellValue(x, y, "");
}
}
2. Klaviatura bilan ishlash
Klaviatura bilan ishlash uchun dvijokda ikki metod bor:void onKeyPress(Key key);void onKeyReleased(Key key);
onKeyPress (Key key)— klaviaturaning istalgan tugmasi bosilganda chaqiriladi. Metodga argument sifatida bosilgan tugmaning qiymati (yoki Key.UNKNOWN) o'tkaziladi.onKeyReleased (Key key)— klaviaturaning istalgan tugmasi bo'shatilganda chaqiriladi. Argument sifatida tegishli tugmaning qiymati (yoki Key.UNKNOWN) oladi.
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;
public class MySuperGame extends Game {
@Override
public void initialize() {
// O'yin maydoni o'lchamini 3x3 ga o'rnatamiz
setScreenSize(3, 3);
// O'yin maydonini oq rangga bo'yaymiz
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) {
// Probel bosilganda, markaziy hujayra sariq bo'ladi
if (key == Key.SPACE) {
setCellColor(1, 1, Color.YELLOW);
}
}
@Override
public void onKeyReleased(Key key) {
// Probel bo'shatilganda, markaziy hujayraga oq rang qaytariladi
if (key == Key.SPACE) {
setCellColor(1, 1, Color.WHITE);
}
}
}
Diqqat! Dvigatelning hozirgi versiyasida Key turidagi argument qiymati faqat cheklangan qiymatlar to'plamini (9 ta) qabul qilishi mumkin:
| Qiymat | Foydalanuvchi nima bosdi |
|---|---|
| Key.ENTER | Foydalanuvchi Enter tugmasini bosdi |
| Key.ESCAPE | Foydalanuvchi Esc tugmasini bosdi |
| Key.PAUSE | Foydalanuvchi Pause tugmasini bosdi |
| Key.SPACE | Foydalanuvchi Probelni bosdi |
| Key.LEFT | Foydalanuvchi Chapga oʻq tugmasini bosdi |
| Key.RIGHT | Foydalanuvchi O'ngga oʻq tugmasini bosdi |
| Key.UP | Foydalanuvchi Yuqoriga oʻq tugmasini bosdi |
| Key.DOWN | Foydalanuvchi Pastga oʻq tugmasini bosdi |
| Key.UNKNOWN | Yuqorida aytilganlardan boshqa istalgan tugma |
3. Taymer bilan ishlash
Ko'p o'yinlar real vaqt rejimida sodir bo'ladi, ya'ni foydalanuvchi hech narsa qilmasa ham, o'yindagi voqealar amalga oshadi. Siz bunday o'yinlarni amalga oshirishingiz uchun biz o'yin dvijokiga taymer bilan ishlash imkoniyatini qo'shdik. Bu taxminan quyidagicha ishlaydi: taymerni yoqing va uni ishga tushishi kerak bo'lgan vaqti belgilab qo'ying. Masalan, 500 millisekund. Shundan keyin har yarim soniyada dvijokonTurnTimer() metodini chaqiradi. Cheksiz marta, taymer o'chirilganicha. Qanday qilib taymerdan foydalanamiz?
Taymerni yoqing.
Buning uchun maxsus
void setTurnTimer(int timeMs)metod mavjud. Argument sifatida metod chaqiruvlar orasidagi interval davomiyligini millisekundlarda (1/1000 sekund) qabul qiladi. Uni bir marta chaqirish kifoya, va o'yin dvijokionTurn()metodini har timeMs millisekundda chaqiradi.onTurn(int) metodini qayta aniqlash.
Buning uchun
void onTurn(int step)metodiniGamesinfidan olingan sinfda e'lon qilish kerak. Bu metodni o'yin dvijoki chaqiradi. Shu bilan birga, dvijok har safar metodga chaqiruvning ketma-ket raqamini o'tkazadi (1,2,3, ...). Uni takt deb atash mumkinTaymerni o'chirish.
Agar taymer kerak bo'lmasa, masalan, foydalanuvchi o'yinni o'ynab o'tib ketgan bo'lsa, uni o'chirish mumkin. Buning uchun faqat
stopTurnTimer()metodini chaqirish kerak.Taymerni tezlashtirish yoki o'zgartirish.
Ba'zi o'yinlarda voqealar doimo tezlashadi, shuning uchun taymerimizni tezlashtirish (chaqiruvlar orasidagi vaqtni qisqartirish) qulay bo'ladi. Buning uchun hech qanday qiyinchilik yo'q:
setTurnTimer(int timeMs)ni yangi qiymat bilan yana bir marta chaqiring vaonTurn()chaqiruvlari orasidagi vaqt o'zgaradi.
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
public class MySuperGame extends Game {
…
@Override
public void initialize() {
// 3x3 hujayrali o'yin maydonini yaratamiz
setScreenSize(3, 3);
showGrid(false);
setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);
setTurnTimer(500); //Taymerni yoqing, chaqiruvlar orasidagi interval - 500ms.
}
@Override
public void onTurn(int step) {
if(step == 100) {
stopTurnTimer(); // agar 100 takt o'tgan bo'lsa, taymerni o'chiring
}
if (step % 2 == 1) {
// Agar bu takt juftsiz bo'lsa, hujayraga qizil fon o'rnatish
setCellColor(1, 1, Color.RED);
} else {
//agar bu takt juft bo'lsa, hujayraga ko'k fon o'rnatish
setCellColor(1, 1, Color.BLUE);
}
}
…
}
Bu oddiy misolda biz 3x3 o'lchamli maydon yaratdik. Keyin har yarim soniyada
onTurn() metodini chaqiradigan taymerni yoqdik. Har yarim soniyada hujayra rangi o'zgaradi, lekin uning mazmuni o'zgarmaydi. 50 soniyadan so'ng rang o'zgarishdan to'xtaydi.
GO TO FULL VERSION