Oop lab/gdx/pacman rev
- หน้านี้เป็นส่วนหนึ่งของ oop lab
เราจะแสดงตัวอย่างรูปแบบหนึ่งของการสร้าง subclass เราจะสร้าง subclass ของ Pacman ชื่อคลาส ReversePacman ที่เป็น Pacman ตระกูลหนึ่ง ซึ่งเวลาเดินจะเดินกลับทิศกับ Pacman อื่น ๆ
คำศัพท์ที่เกี่ยวข้อง
- subclass / superclass
- inheritance
สร้างคลาสใหม่
เราสามารถสร้างคลาสใหม่โดยกด New จากนั้นค่อยมาป้อนว่าคลาส inherit จากคลาสใด ด้วยคีย์เวิร็ด extends ก็ได้ หรือจะเลือกจากเมนูเลยก็ได้ (ดูรูปด้านล่าง)
เราจะเลือกคลาสที่จะ inherit มาโดยกำหนดที่ superclass เราสามารถพิมพ์บางส่วนของชื่อ เช่น Pacman แล้วกด Browse ได้
เมื่อสร้างเสร็จจะได้คลาสเปล่า ๆ มา
อย่างไรก็ตาม คลาสนั้นยังใช้งานไม่ได้เพราะว่ายังไม่ได้เขียน Constructor (ถ้าคลาสแม่มี constructor ที่ไม่รับพารามิเตอร์ Java จะอนุโลมให้ไปใช้ constructor นั้นได้ แต่กรณีของ Pacman นั้นไม่มี เราจึงต้องเขียนเอง) อย่างไรก็ตาม Eclipse สามารถสร้างโค้ด constructor ที่ไปเรียก constructor ของคลาสแม่ให้ได้ด้วย จะได้โค้ดดังด้านล่าง
public class ReversePacman extends Pacman {
public ReversePacman(int x, int y, World world) {
super(x, y, world);
}
}
Override method
เราจะปรับ ReversePacman ให้รับ nextDirection กลับทิศกลับทางแทน โดยเราจะไปแก้เมท็อด setNextDirection เราเขียนเมท็อดใหม่โดยใส่ annotation @Override ไว้ด้วย (ใส่ทำไม? อ่านสาเหตุที่นี่)
@Override
public void setNextDirection(int dir) {
}
จากนั้นแก้ให้กำหนดค่าเป็นทิศสลับกัน ในการคำนวณทิศที่สลับด้านดังกล่าว เราจะสร้างตัวแปร reverseDirMap เพื่อเก็บค่าเอาไว้ก่อน
public class ReversePacman extends Pacman {
private int [] reverseDirMap;
public ReversePacman(int x, int y, World world) {
super(x, y, world);
reverseDirMap = new int[5];
reverseDirMap[Pacman.DIRECTION_STILL] = Pacman.DIRECTION_STILL;
reverseDirMap[Pacman.DIRECTION_LEFT] = Pacman.DIRECTION_RIGHT;
reverseDirMap[Pacman.DIRECTION_RIGHT] = Pacman.DIRECTION_LEFT;
reverseDirMap[Pacman.DIRECTION_UP] = Pacman.DIRECTION_DOWN;
reverseDirMap[Pacman.DIRECTION_DOWN] = Pacman.DIRECTION_UP;
}
@Override
public void setNextDirection(int dir) {
int revDir = reverseDirMap[dir];
super.setNextDirection(revDir);
}
}
สร้างใน World
public class World {
// ...
World(PacmanGame pacmanGame) {
// ...
//pacman = new Pacman(60,60,this);
pacman = new ReversePacman(60,60,this);
// ...
}
}