โค้ดยิม/หลักสูตรจาวา/All lectures for TH purposes/การจัดการเหตุการณ์

การจัดการเหตุการณ์

มีอยู่

1. บทนำ

เอ็นจิ้นเกมจะมีประโยชน์เพียงเล็กน้อยหากเราใช้มันเพื่อวาดบางสิ่งบนหน้าจอเท่านั้น ในการเขียนเกมเต็มรูปแบบ เราจำเป็นต้องให้เกมโต้ตอบกับผู้ใช้! เพื่อให้แม่นยำยิ่งขึ้น โปรแกรมของเราควรติดตามการกระทำของผู้ใช้และตอบสนองต่อพวกเขา

ในการทำเช่นนี้ เอ็นจิ้นเกม CodeGym มีเมธอดพิเศษที่เรียกใช้เมื่อผู้ใช้คลิกปุ่มเมาส์หรือแป้นคีย์บอร์ด

ประเด็นของชั้นเรียนคือคุณต้องเขียนเมธอดเหล่านี้ด้วยตัวเอง จากนั้นเอ็นจิ้นเกม CodeGym จะรับผิดชอบในการเรียกใช้เมธอดเหล่านี้ สิ่งที่คุณต้องทำคือประกาศวิธีการเหล่านี้ในรหัสของคุณ สิ่งนี้ทำได้ง่ายกว่าที่ฟังดู


2. การทำงานกับเมาส์

เอ็นจิ้นเกมมีสองวิธีในการทำงานกับเมาส์:

void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)

คุณเพียงแค่ประกาศเมธอดเหล่านี้ในคลาสของคุณเองที่สืบทอดGameคลาส จากนั้นเขียนโค้ดอะไรก็ได้ที่คุณต้องการในเมธอดเหล่านี้ เอ็นจิ้นเกมจะเรียกใช้เมธอดเหล่านี้เมื่อผู้ใช้คลิกปุ่มเมาส์

onMouseLeftClick(int x, int y)ถูกเรียกใช้โดยเครื่องยนต์เมื่อคลิกปุ่มซ้ายของเมาส์ พารามิเตอร์คือพิกัดของเซลล์ของสนามเด็กเล่นที่มีการคลิกเกิดขึ้น พิกัดของเซลล์บนซ้าย(0,0)คือ ในการใช้เมธอดนี้ คุณต้องแทนที่เมธอด โดยวาง@Overrideคำอธิบายประกอบไว้หน้าชื่อเมธอด

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) {
      // 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, "");
   }
}

ในตัวอย่างข้างต้น เราประกาศทั้งสองวิธี: onMouseLeftClick()และ onMouseRightClick()วิธีแรกจะถูกเรียกใช้เมื่อผู้ใช้คลิกปุ่มซ้ายของเมาส์บนเซลล์ของสนามเด็กเล่น วิธีที่สองจะถูกเรียกเมื่อคลิกปุ่มเมาส์ขวา

ตามข้อโต้แย้ง เอ็นจิ้นเกม CodeGym จะส่ง(x, y)พิกัดของเซลล์ของสนามเด็กเล่นที่มีการคลิกเมาส์



3. การทำงานกับแป้นพิมพ์

เอ็นจิ้นเกมมีสองวิธีในการทำงานกับแป้นพิมพ์:

void onKeyPress(Key key);
void onKeyReleased(Key key);

หากคุณต้องการทำบางสิ่งเมื่อผู้ใช้กดปุ่ม คุณเพียงแค่ต้องประกาศเมธอดเหล่านี้ในคลาสของคุณที่สืบทอดGameคลาส

คุณเขียนโค้ดของคุณด้วยวิธีการเหล่านี้ และเอ็นจิ้นเกมจะเรียกใช้โค้ดเหล่านี้เมื่อผู้ใช้กด (หรือปล่อย) คีย์

onKeyPress(Key key)ถูกเรียกใช้เมื่อกด ปุ่มใด ๆ ค่าของคีย์ที่กด (หรือ) จะถูกส่งผ่านไปยังเมธอดเป็นพารามิเตอร์ ในการใช้เมธอดนี้ คุณต้องแทนที่เมธอด โดยวางคำอธิบายประกอบไว้หน้าชื่อเมธอดKey.UNKNOWNkey@Override

onKeyReleased(Key key)ถูกเรียกเมื่อมีการปล่อย คีย์ ใด ๆ ค่าของคีย์ที่เกี่ยวข้อง (หรือ) ถูกกำหนดให้กับพารามิเตอร์ ในการใช้เมธอดนี้ คุณต้องแทนที่เมธอด โดยวางคำอธิบายประกอบไว้หน้าชื่อเมธอดKey.UNKNOWNkey@Override

ตัวอย่างของการใช้วิธีการเหล่านี้:

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. รายการคีย์ที่รองรับทั้งหมด

เมื่อกลไก CodeGym เรียกonKeyPress()และonKeyReleased()เมธอด มันจะส่งข้อมูลไปยังพวกเขาเกี่ยวกับคีย์ที่กด (ปล่อย) ในการทำเช่นนี้ เอ็นจิ้น CodeGym มีชนิดพิเศษที่เรียกว่าKey.

ในเครื่องยนต์เวอร์ชันปัจจุบันKeyประเภทรองรับชุดค่าจำกัดเพียง 9 ค่าเท่านั้น:

ค่า สิ่งที่ผู้ใช้กด
Key.ENTER
ผู้ใช้กดปุ่มEnter
Key.ESCAPE
ผู้ใช้กดปุ่มEsc
Key.PAUSE
ผู้ใช้กดปุ่มหยุดชั่วคราว
Key.SPACE
ผู้ใช้กดปุ่มSpace
Key.LEFT
ผู้ใช้กดปุ่มลูกศรซ้าย
Key.RIGHT
ผู้ใช้กดปุ่มลูกศรขวา
Key.UP
ผู้ใช้กดปุ่มลูกศรขึ้น
Key.DOWN
ผู้ใช้กดปุ่มลูกศรลง
Key.UNKNOWN
คีย์อื่นนอกเหนือจากที่ระบุไว้ข้างต้น

หากผู้เล่นกดแป้นเว้นวรรค วิธีonKeyPress()การจะถูกเรียกKey.SPACEเป็นพารามิเตอร์ หากผู้ใช้กดลูกศรซ้าย พารามิเตอร์จะKey.LEFTเป็น หากผู้ใช้กดคีย์ใด ๆ ที่ไม่ได้อยู่ในรายการด้านบน เมธอดonKeyPress()จะถูกเรียกใช้Key.UNKNOWNเป็นพารามิเตอร์

ปัญหาที่นี่คือเกม CodeGym ที่มีอยู่ได้รับการออกแบบให้ทำงานบนโทรศัพท์ แทนที่จะใช้แป้นพิมพ์มาตรฐาน เรามีปุ่มเสมือนจริง 8 ปุ่ม:


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

เกมหลายเกมเกิดขึ้นแบบเรียลไทม์ กล่าวคือ ผู้ใช้อาจไม่ทำอะไรเลย แต่เหตุการณ์บางอย่างยังคงเกิดขึ้นในเกม เพื่อให้คุณสามารถใช้เกมดังกล่าวได้ เราได้เพิ่มตัวจับเวลาให้กับเอนจิ้นเกม

นี่คือวิธีการทำงาน: คุณเปิดตัวจับเวลาและตั้งเวลาที่ควรจะเรียกใช้งาน ตัวอย่างเช่น 500 มิลลิวินาที จากนั้นทุกๆ ครึ่งวินาที โปรแกรมเกม CodeGym จะเรียกใช้onTurn()เมธอด ไม่จำกัดจำนวนครั้ง — จนกว่าตัวจับเวลาจะปิด

คุณใช้ตัวจับเวลาอย่างไร?

1. เปิดเครื่องจับเวลา

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

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 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);
      }
   }
   ...
}

ในตัวอย่างง่ายๆ นี้ เราสร้างฟิลด์ที่มีขนาด 3 เซลล์คูณ 3 เซลล์ จากนั้นเราก็เปิดตัวจับเวลาที่จะเรียกonTurn()ใช้เมธอดทุกครึ่งวินาที

ที่นี่สีของเซลล์กลางจะเปลี่ยนทุกครึ่งวินาที ข้อความของเซลล์จะไม่เปลี่ยนแปลง หลังจาก 50 วินาที (โทรกลับ 100 ครั้ง) สีจะหยุดเปลี่ยนและตัวจับเวลาจะปิด


ความคิดเห็น
  • เป็นที่นิยม
  • ใหม่
  • เก่า
คุณต้องลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
หน้านี้ยังไม่มีความคิดเห็นใด ๆ