JavaRush /จาวาบล็อก /Random-TH /ส่วน "เกม" บน 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
คีย์.ESCAPE ผู้ใช้กดปุ่ม Esc
คีย์. PAUSE ผู้ใช้คลิกปุ่มหยุดชั่วคราว
คีย์. SPACE ผู้ใช้กด Space
กุญแจซ้าย ผู้ใช้กดลูกศรซ้าย
คีย์.ขวา ผู้ใช้กดลูกศรขวา
คีย์.อัพ ผู้ใช้กดลูกศรขึ้น
คีย์.ลง ผู้ใช้กดลูกศรลง
คีย์ UNKNOWN คีย์ใดๆ ยกเว้นคีย์ที่ระบุไว้ข้างต้น

3. การทำงานกับตัวจับเวลา

เกมจำนวนมากเกิดขึ้นแบบเรียลไทม์ ซึ่งหมายความว่าแม้ว่าผู้ใช้จะไม่ทำอะไรเลย เหตุการณ์ในเกมก็ยังคงดำเนินอยู่ เพื่อให้คุณสามารถใช้งานเกมดังกล่าวได้ เราได้เพิ่มฟังก์ชันจับเวลาให้กับเอ็นจิ้นเกม มันทำงานดังนี้: คุณเปิดเครื่องจับเวลาและตั้งระยะเวลาที่ควรดับลง เช่น 500 มิลลิวินาที หลังจากนั้นทุกๆ ครึ่งวินาที Game Engine จะเรียกไฟล์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