JavaRush /בלוג Java /Random-HE /סעיף "משחקים" ב-JavaRush: טיפול באירועים

סעיף "משחקים" ב-JavaRush: טיפול באירועים

פורסם בקבוצה
"משחקים" מ-JavaRush הוא מדור חדש עם משימות מעניינות ובקנה מידה גדול ליצירת גרסאות משלך של משחקים פופולריים. זה פשוט: כל פרויקט משחק מחולק לתת-משימות. השלם אותם אחד אחד והמשחק מוכן. אתה יכול לשתף אותו ברשתות חברתיות ולהזמין חברים לשחק. פֶּרֶקבמאמר זה נדבר בפירוט על שיטות לעיבוד אירועים בעת כתיבת משחקים.

1. עבודה עם העכבר

למנוע המשחק יש שתי שיטות לעבודה עם העכבר:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);
אתה פשוט מצהיר על השיטות הללו במחלקת המשחק שעברו בירושה מ Game, וכותבים בהן כל קוד. ומנוע המשחק עצמו יקרא להם כאשר המשתמש ילחץ על כפתורי העכבר.
  1. onMouseLeftClick(int x, int y)- נקרא על ידי המנוע כאשר אתה לוחץ על לחצן העכבר השמאלי. כטיעונים, הוא מקבל את הקואורדינטות של התא של שדה המשחק שבו התרחשה הקליק. לתא השמאלי העליון יש קואורדינטות (0,0). כדי להשתמש בשיטה זו, יש לעקוף אותה.

  2. onMouseRightClick(int x, int y)- נקרא כאשר אתה לוחץ לחיצה ימנית. עובד דומה לשיטה onMouseLeftClick(int x, int y).
דוגמה לשימוש בשיטות:
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() {
        // Устанавливаем размер игрового поля 3x3
        setScreenSize(3, 3);

        // Закрашиваем игровое поле белым цветом
        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) {
        // Ставим символ "X" в клетку по которой кликнули левой кнопкой мыши
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Очищаем клетку по которой кликнули правой кнопкой мыши
        setCellValue(x, y, "");
    }
}

2. עבודה עם המקלדת

למנוע המשחק יש שתי שיטות לעבודה עם המקלדת:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);
אם אתה רוצה שפעולות יתרחשו כאשר המשתמש לוחץ על כפתור במקלדת, הכריז על שיטות אלו במחלקת המשחק שלך שיורשת מ-Game וכתוב בהן את הקוד שלך. מנוע המשחק עצמו יקרא להם כאשר המשתמש ילחץ או ישחרר מקש מקלדת.
  1. onKeyPress (Key key)- נקרא כאשר מקש כלשהו נלחץ. הערך של המקש לחוץ (או Key.UNKNOWN) מועבר למתודה כארגומנט המפתח.

  2. onKeyReleased (Key key)- נקרא כאשר מקש כלשהו במקלדת משוחרר. ארגומנט המפתח לוקח את הערך של המפתח המתאים (או Key.UNKNOWN).
דוגמה לשימוש בשיטות:
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() {
        // Устанавливаем размер игрового поля 3x3
        setScreenSize(3, 3);

        // Закрашиваем игровое поле белым цветом
        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) {
        // При нажатии пробела, центральная клетка становится желтой
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // При отпускании пробела, центральной клетке возвращается белый цвет
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
חָשׁוּב! בגרסה הנוכחית של המנוע, סוג המפתח יכול לקבל רק סט מוגבל של ערכים (9 יחידות):
מַשְׁמָעוּת מה המשתמש לחץ
מקש.ENTER המשתמש לחץ על כפתור Enter
מפתח.בריחה המשתמש לחץ על כפתור Esc
Key.PAUSE המשתמש לחץ על כפתור השהה
מפתח.רווח המשתמש לחץ על רווח
מקש.שמאלה המשתמש לחץ על החץ שמאלה
מפתח.ימין המשתמש לחץ על החץ ימינה
מפתח למעלה המשתמש לחץ על החץ למעלה
מקש.DOWN המשתמש לחץ על החץ למטה
מפתח.לא ידוע כל מפתח מלבד אלו המפורטים למעלה

3. עבודה עם הטיימר

משחקים רבים מתרחשים בזמן אמת, כלומר גם אם המשתמש לא עושה דבר, האירועים במשחק עדיין מבוצעים. כדי שתוכל ליישם משחקים כאלה, הוספנו פונקציונליות טיימר למנוע המשחק. זה עובד בערך כך: אתה מפעיל את הטיימר ומגדיר את פרק הזמן שאחריו הוא אמור לכבות. לדוגמה, 500 מילישניות. לאחר מכן, כל חצי שנייה מנוע המשחק קורא ל- onTurnTimer(). מספר אינסופי של פעמים עד לכיבוי הטיימר. כיצד להשתמש בטיימר?
  1. הפעל את הטיימר.

    יש שיטה מיוחדת לכך void setTurnTimer(int timeMs). כטיעון, השיטה לוקחת את משך המרווח בין שיחות באלפיות שניות (1/1000 של שנייה). מספיק לקרוא לזה פעם אחת, ומנוע המשחק יתחיל לקרוא לשיטה onTurn()בכל פעם אלפיות השנייה.

  2. עוקף את שיטת onTurn(int).

    כדי לעשות זאת, עליך להכריז על שיטה void onTurn(int step)במחלקה שעברה בירושה מהמחלקה Game. שיטה זו תיקרא על ידי מנוע המשחק. במקרה זה, המנוע יעביר בכל פעם את המספר הסידורי של שיחה כזו (1,2,3,...) לשיטה.

  3. כבה את הטיימר.

    אם אין עוד צורך בטיימר, כאשר, למשל, המשתמש השלים את המשחק, ניתן לכבות אותו. כדי לעשות זאת אתה רק צריך להתקשר ל- stopTurnTimer().

  4. האיץ או שנה את הטיימר.

    בחלק מהמשחקים, האירועים מואצים כל הזמן, אז זה יהיה נוח להאיץ את הטיימר שלנו (להפחית את הזמן בין שיחות). אין דבר פשוט יותר: התקשר setTurnTimer(int timeMs)שוב, עם ערך חדש, והזמן בין שיחה onTurn()ישתנה.

דוגמא:
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {@Override
    public void initialize() {
    	// Создаем игровое поле 3x3 клетки
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   //Включаем таймер, интервал между вызовами – 500мс.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // если прошло 100 тактов, выключаем таймер
        }

        if (step % 2 == 1) {
            // Если данный такт нечётный, установить клетке красный фон
            setCellColor(1, 1, Color.RED);
        } else {
            //если данный такт чётный, установить клетке синий фон
            setCellColor(1, 1, Color.BLUE);

        }
    }}
בדוגמה הפשוטה הזו, יצרנו שדה של תאים בגודל 3x3. ואז הפעלנו טיימר שיקרא לשיטה כל חצי שנייה onTurn(). בכל חצי שניה ישתנה צבע התא, אך תוכנו לא ישתנה. לאחר 50 שניות הצבע יפסיק להשתנות. זה הכל! אם אתה רוצה ללמוד עוד על קטע המשחקים, הנה כמה תיעוד שימושי שיכול לעזור:
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION