CodeGym /จาวาบล็อก /สุ่ม /ส่วนเกมใน CodeGym: การจัดการกิจกรรม
John Squirrels
ระดับ
San Francisco

ส่วนเกมใน CodeGym: การจัดการกิจกรรม

เผยแพร่ในกลุ่ม
"เกม" จาก CodeGymเป็นส่วนใหม่ที่มีภารกิจที่น่าสนใจมากมาย ซึ่งคุณสร้างเกมยอดนิยมในเวอร์ชันของคุณเอง ง่ายมาก: แต่ละโครงการของเกมจะแบ่งออกเป็นงานย่อย กรอกทีละรายการและเกมจะเสร็จสิ้น คุณสามารถแชร์บนโซเชียลเน็ตเวิร์กและเชิญเพื่อนมาเล่นได้ ส่วน "เกม" ใน CodeGym: การจัดการเหตุการณ์ - 1ในบทความนี้ เราจะอธิบายรายละเอียดเกี่ยวกับ วิธี การจัดการเหตุการณ์ที่ใช้ในการเขียนเกม

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.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) {
        // Set "X" in the cell where the left mouse click occurred
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Clear the cell where the right mouse click occurred
        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.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 space bar is pressed, the center cell turns yellow
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // When the space bar is released, the center cell changes back to white
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
สำคัญ! ในเอ็นจิ้นเกมเวอร์ชันปัจจุบัน ประเภทคีย์มีชุดค่าจำกัดเก้าค่า:
ค่า คีย์กดโดยผู้ใช้
คีย์.ENTER ผู้ใช้กด Enter
คีย์ ESCAPE ผู้ใช้กด Esc
คีย์หยุดชั่วคราว ผู้ใช้กดหยุดชั่วคราว
คีย์.SPACE ผู้ใช้กด Space
กุญแจ ซ้าย ผู้ใช้กดปุ่มลูกศรซ้าย
คีย์ขวา ผู้ใช้กดปุ่มลูกศรขวา
คีย์ขึ้น ผู้ใช้กดปุ่มลูกศรขึ้น
คีย์ลง ผู้ใช้กดปุ่มลง
คีย์ไม่รู้จัก ผู้ใช้กดปุ่มอื่นที่ไม่ใช่ปุ่มด้านบน

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

หลายเกมเกิดขึ้นในเวลาจริง กล่าวคือ แม้ว่าผู้ใช้ไม่ได้ทำอะไรเลย เหตุการณ์ก็ยังคงเกิดขึ้นในเกม เพื่อให้คุณสามารถใช้เกมดังกล่าวได้ เราได้เพิ่มตัวจับเวลาให้กับเอนจิ้นเกม มันทำงานในลักษณะนี้: คุณเปิดตัวจับเวลาและตั้งช่วงเวลาของตัวจับเวลา ตัวอย่างเช่น 500 มิลลิวินาที จากนั้น ทุก ๆ ครึ่งวินาที เอ็นจิ้นเกมจะเรียกใช้onTurnTimer()เมธอด ครั้งแล้วครั้งเล่าตลอดไป—จนกว่าตัวจับเวลาจะปิด แล้วคุณใช้ตัวจับเวลาอย่างไร?
  1. เปิดเครื่องจับเวลา

    ในการทำเช่นนี้มีvoid setTurnTimer(int timeMs)วิธี พิเศษ วิธีการใช้เป็นอาร์กิวเมนต์ช่วงเวลาระหว่างการโทรเป็นมิลลิวินาที (1 มิลลิวินาที = 1/1000 วินาที) คุณต้องเรียกใช้เพียงครั้งเดียว และเอ็นจิ้นเกมจะเริ่มเรียกใช้เมธอดonTurn()ทุก ๆ วินาทีมิลลิวินาที

  2. แทนที่เมธอด onTurn(int)

    ในการทำเช่นนี้ คุณต้องประกาศvoid onTurn(int step)เมธอดในคลาสที่สืบทอดGameมา วิธีนี้จะถูกเรียกใช้โดยเกมเอนจิ้น ยิ่งไปกว่านั้น ในการเรียกแต่ละครั้ง เอ็นจิ้นเกมจะส่งตัวระบุลำดับสำหรับการโทรไปยังเมธอด (1, 2, 3, …)

  3. ปิดตัวจับเวลา

    หากไม่ต้องการตัวจับเวลาอีกต่อไป เช่น เมื่อผู้ใช้เล่นเกมเสร็จ คุณสามารถปิดตัวจับเวลาได้ ในการทำเช่นนี้คุณเพียงแค่เรียกstopTurnTimer()เมธอด

  4. เร่งความเร็วหรือเปลี่ยนตัวจับเวลา

    ในบางเกม อัตราเหตุการณ์ที่เกิดขึ้นจะเร่งขึ้นอย่างต่อเนื่อง ดังนั้นจึงเป็นการสะดวกที่จะเร่งเวลาของเรา (ลดเวลาระหว่างการโทร) ไม่มีอะไรจะง่ายไปกว่านี้แล้ว: โทรsetTurnTimer(int timeMs)อีกครั้งด้วยค่าใหม่ และเวลาระหว่างonTurn()การโทรจะเปลี่ยนไป

ตัวอย่างเช่น:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
    …
    @Override
    public void initialize() {
    	// Create a playing field that is 3 cells x 3 cells
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   // Turn on the timer, the interval between calls is 500ms.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // If 100 calls have been made, turn off the timer
        }

        if (step % 2 == 1) {
            // If this call is odd, set the cell background to red
            setCellColor(1, 1, Color.RED);
        } 
        else {
            // If this call is even, set the cell background to blue
            setCellColor(1, 1, Color.BLUE);

        }
    }
    …
}
ในตัวอย่างง่ายๆ นี้ เราสร้างฟิลด์ที่มีขนาด 3 เซลล์ x 3 เซลล์ จากนั้นเราเริ่มจับเวลาที่จะเรียกonTurn()ใช้เมธอดทุกครึ่งวินาที ทุกครึ่งวินาที สีของเซลล์จะเปลี่ยนไป แต่เนื้อหาจะไม่เปลี่ยนแปลง หลังจาก 50 วินาที สีจะไม่เปลี่ยนอีกต่อไป นั่นคือทั้งหมดที่สำหรับตอนนี้! หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับส่วน "เกม" ต่อไปนี้เป็นเอกสารที่มีประโยชน์ซึ่งสามารถช่วยได้:
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION