Oop lab/gdx/pacman rev

จาก Theory Wiki
รุ่นแก้ไขเมื่อ 22:43, 17 พฤศจิกายน 2559 โดย Jittat (คุย | มีส่วนร่วม)
(ต่าง) ←รุ่นแก้ไขก่อนหน้า | รุ่นแก้ไขล่าสุด (ต่าง) | รุ่นแก้ไขถัดไป→ (ต่าง)
ไปยังการนำทาง ไปยังการค้นหา
หน้านี้เป็นส่วนหนึ่งของ 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);

        // ...
    }
}