ผลต่างระหว่างรุ่นของ "Oop lab/การลบ entity"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 20: แถว 20:
 
     for(Entity entity : entities) {
 
     for(Entity entity : entities) {
 
       entity.update(delta);
 
       entity.update(delta);
 +
    }
 +
  }
 +
</syntaxhighlight>
 +
 +
เมท็อดนี้จะต้องมีวิธีการที่จะทราบได้ว่า entity ใด ควรจะถูกลบ เพื่อการแจ้งข้อมูลดังกล่าว เราจะเพิ่ม interface Entity ให้มีเมท็อด <tt>isDeleted</tt> ด้วย ดังนี้
 +
 +
<syntaxhighlight lang="java">
 +
public interface Entity {
 +
  void render(Graphics g);
 +
  void update(int delta);
 +
  boolean isDeleted();
 +
}
 +
</syntaxhighlight>
 +
 +
จากนั้นเราจะแก้เมท็อด update ให้เรียกเมท็อด isDeleted ดังกล่าว และลบข้อมูลจากลิงก์ลิสต์  การลบข้อมูลในลิงก์ลิสต์ให้รวดเร็ว เราจะต้องใช้ iterator ในการวิ่งไปในลิสต์และลบผ่านทาง iterator (อ่าน [[oop lab/java collections|Java Collections]]) โดยโค้ดของเมท็อด update เป็นดังนี้
 +
 +
<syntaxhighlight lang="java">
 +
  @Override
 +
  public void update(GameContainer container, int delta) throws SlickException {
 +
    Iterator<Entity> iterator = entities.iterator();
 +
    while(iterator.hasNext()) {
 +
      Entity entity = iterator.next();
 +
      entity.update(delta);
 +
      if(entity.isDeleted()) {
 +
        iterator.remove();
 +
      }
 
     }
 
     }
 
   }
 
   }
 
</syntaxhighlight>
 
</syntaxhighlight>

รุ่นแก้ไขเมื่อ 13:05, 20 กันยายน 2557

หน้านี้เป็นส่วนหนึ่งของ oop lab.

จากแลบ oop lab/bullets เราได้เว้นส่วนที่ลบ bullet ที่ออกนอกหน้าจอไป ในส่วนนี้เราจะพัฒนาส่วนดังกล่าว

Entities

เราเก็บ entities ใน LinkedList เพื่อที่จะได้ลบ entity ที่ไม่ต้องการออกจากโครงสร้างได้รวดเร็ว (สำหรับส่วนนี้อ่านเพิ่มเติมที่ Java collections)

ในการเขียนโปรแกรมแบบ oop งานหลักของนักพัฒนาคือการเลือกว่ากิจกรรมใดจะดำเนินการที่ใด และ object ต่าง ๆ จะร่วมมือกันดำเนินการกิจกรรมที่ต้องการได้อย่างไร สำหรับการลบ entity ออกจาก linked list entities นี้ เรามีทางเลือกในการดำเนินการหลายแบบ

ลองพิจารณาเมท็อดที่เกี่ยวข้องกับ entities ในคลาส BulletGame ก่อน

  • public void render(GameContainer container, Graphics g)
  • public void update(GameContainer container, int delta)

ในที่นี้ งานของเราน่าจะเกี่ยวกับการปรับตำแหน่งของ entity (ส่วน update) ดังนั้นเราจะจัดการเกี่ยวกับการลบ entity ในเมท็อด update ซึ่งเมท็อดเดิมเป็นดังนี้:

  @Override
  public void update(GameContainer container, int delta) throws SlickException {
    for(Entity entity : entities) {
      entity.update(delta);
    }
  }

เมท็อดนี้จะต้องมีวิธีการที่จะทราบได้ว่า entity ใด ควรจะถูกลบ เพื่อการแจ้งข้อมูลดังกล่าว เราจะเพิ่ม interface Entity ให้มีเมท็อด isDeleted ด้วย ดังนี้

public interface Entity {
  void render(Graphics g);
  void update(int delta);
  boolean isDeleted();
}

จากนั้นเราจะแก้เมท็อด update ให้เรียกเมท็อด isDeleted ดังกล่าว และลบข้อมูลจากลิงก์ลิสต์ การลบข้อมูลในลิงก์ลิสต์ให้รวดเร็ว เราจะต้องใช้ iterator ในการวิ่งไปในลิสต์และลบผ่านทาง iterator (อ่าน Java Collections) โดยโค้ดของเมท็อด update เป็นดังนี้

  @Override
  public void update(GameContainer container, int delta) throws SlickException {
    Iterator<Entity> iterator = entities.iterator();
    while(iterator.hasNext()) {
      Entity entity = iterator.next();
      entity.update(delta);
      if(entity.isDeleted()) {
        iterator.remove();
      }
    }
  }