ผลต่างระหว่างรุ่นของ "Oop lab/gdx/pacman rev"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
(หน้าที่ถูกสร้างด้วย ': หน้านี้เป็นส่วนหนึ่งของ oop lab == สร้างคลาสใหม่ == == ...')
 
 
(ไม่แสดง 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 ก็ได้ หรือจะเลือกจากเมนูเลยก็ได้ (ดูรูปด้านล่าง)

Ooplab-inheritance-create-class.png

เราจะเลือกคลาสที่จะ 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);

        // ...
    }
}