ผลต่างระหว่างรุ่นของ "Oop lab/gdx/pacman rev"
Jittat (คุย | มีส่วนร่วม) (หน้าที่ถูกสร้างด้วย ': หน้านี้เป็นส่วนหนึ่งของ oop lab == สร้างคลาสใหม่ == == ...') |
Jittat (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 1 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 1: | แถว 1: | ||
− | : หน้านี้เป็นส่วนหนึ่งของ [[oop lab]] | + | : ''หน้านี้เป็นส่วนหนึ่งของ [[oop lab]]'' |
+ | |||
+ | เราจะแสดงตัวอย่างรูปแบบหนึ่งของการสร้าง subclass เราจะสร้าง subclass ของ Pacman ชื่อคลาส ReversePacman ที่เป็น Pacman ตระกูลหนึ่ง ซึ่งเวลาเดินจะเดินกลับทิศกับ Pacman อื่น ๆ | ||
+ | |||
+ | '''คำศัพท์ที่เกี่ยวข้อง''' | ||
+ | |||
+ | * subclass / superclass | ||
+ | * inheritance | ||
== สร้างคลาสใหม่ == | == สร้างคลาสใหม่ == | ||
+ | เราสามารถสร้างคลาสใหม่โดยกด New จากนั้นค่อยมาป้อนว่าคลาส inherit จากคลาสใด ด้วยคีย์เวิร็ด extends ก็ได้ หรือจะเลือกจากเมนูเลยก็ได้ (ดูรูปด้านล่าง) | ||
+ | |||
+ | [[Image:Ooplab-inheritance-create-class.png]] | ||
+ | |||
+ | เราจะเลือกคลาสที่จะ inherit มาโดยกำหนดที่ superclass เราสามารถพิมพ์บางส่วนของชื่อ เช่น Pacman แล้วกด Browse ได้ | ||
+ | |||
+ | เมื่อสร้างเสร็จจะได้คลาสเปล่า ๆ มา | ||
+ | |||
+ | อย่างไรก็ตาม คลาสนั้นยังใช้งานไม่ได้เพราะว่ายังไม่ได้เขียน Constructor (ถ้าคลาสแม่มี constructor ที่ไม่รับพารามิเตอร์ Java จะอนุโลมให้ไปใช้ constructor นั้นได้ แต่กรณีของ Pacman นั้นไม่มี เราจึงต้องเขียนเอง) อย่างไรก็ตาม Eclipse สามารถสร้างโค้ด constructor ที่ไปเรียก constructor ของคลาสแม่ให้ได้ด้วย จะได้โค้ดดังด้านล่าง | ||
+ | |||
+ | <syntaxhighlight lang="java"> | ||
+ | public class ReversePacman extends Pacman { | ||
+ | public ReversePacman(int x, int y, World world) { | ||
+ | super(x, y, world); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
== Override method == | == Override method == | ||
+ | เราจะปรับ ReversePacman ให้รับ nextDirection กลับทิศกลับทางแทน โดยเราจะไปแก้เมท็อด setNextDirection เราเขียนเมท็อดใหม่โดยใส่ annotation @Override ไว้ด้วย (ใส่ทำไม? [http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why อ่านสาเหตุที่นี่]) | ||
+ | |||
+ | <syntaxhighlight lang="java"> | ||
+ | @Override | ||
+ | public void setNextDirection(int dir) { | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | จากนั้นแก้ให้กำหนดค่าเป็นทิศสลับกัน ในการคำนวณทิศที่สลับด้านดังกล่าว เราจะสร้างตัวแปร reverseDirMap เพื่อเก็บค่าเอาไว้ก่อน | ||
+ | |||
+ | <syntaxhighlight lang="java"> | ||
+ | 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); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
== สร้างใน World == | == สร้างใน World == | ||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> |
รุ่นแก้ไขปัจจุบันเมื่อ 22:43, 17 พฤศจิกายน 2559
- หน้านี้เป็นส่วนหนึ่งของ 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);
// ...
}
}