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.UNKNOWN
key
@Override
onKeyReleased(Key key)
ถูกเรียกเมื่อมีการปล่อย คีย์ ใด ๆ ค่าของคีย์ที่เกี่ยวข้อง (หรือ) ถูกกำหนดให้กับพารามิเตอร์ ในการใช้เมธอดนี้ คุณต้องแทนที่เมธอด โดยวางคำอธิบายประกอบไว้หน้าชื่อเมธอดKey.UNKNOWN
key
@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 ค่าเท่านั้น:
ค่า | สิ่งที่ผู้ใช้กด |
---|---|
|
ผู้ใช้กดปุ่มEnter |
|
ผู้ใช้กดปุ่มEsc |
|
ผู้ใช้กดปุ่มหยุดชั่วคราว |
|
ผู้ใช้กดปุ่มSpace |
|
ผู้ใช้กดปุ่มลูกศรซ้าย |
|
ผู้ใช้กดปุ่มลูกศรขวา |
|
ผู้ใช้กดปุ่มลูกศรขึ้น |
|
ผู้ใช้กดปุ่มลูกศรลง |
|
คีย์อื่นนอกเหนือจากที่ระบุไว้ข้างต้น |
หากผู้เล่นกดแป้นเว้นวรรค วิธี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 ครั้ง) สีจะหยุดเปลี่ยนและตัวจับเวลาจะปิด
GO TO FULL VERSION