オブジェクトをまとめて管理する

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

オブジェクトの管理


自機を作成しましたが、このままだとオブジェクトが増えるたびにGameSceneのクラスに記述することになり、非常に複雑な処理になってしまいます。そこでオブジェクトをまとめて管理するクラスを作ります。以下にそのクラスのコードを示します。
  1. package obj;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5.  
  6. import densan.s.game.calc.Calc;
  7. import densan.s.game.drawing.Drawer;
  8. import densan.s.game.manager.GameManager;
  9. import densan.s.game.object.GameObjectBase;
  10. /**
  11.  * ゲームのオブジェクトを管理するクラス
  12.  * @author isato
  13.  *
  14.  * @param <T>
  15.  */
  16. public class ObjectManager<T extends GameObjectBase> {
  17. /**
  18.  *
  19.  */
  20. private ArrayList<T> objects = new ArrayList<T>();
  21.  
  22. private ArrayList<T> additionalObjects = new ArrayList<T>();
  23.  
  24. private static ObjectManager instance = new ObjectManager<>();
  25.  
  26. private ObjectManager(){
  27.  
  28. }
  29.  
  30. public static ObjectManager getInstace(){
  31. return instance;
  32. }
  33. /**
  34. * オブジェクトのすべてにアップデート
  35. */
  36. public void update() {
  37. Iterator<T> itr = objects.iterator();
  38. T o;
  39. while(itr.hasNext()) {
  40. o = itr.next();
  41. o.update();
  42. }
  43. collisionPlayer();
  44. removeProccess();
  45. joinList();
  46. }
  47. /**
  48. * オブジェクトにremoveフラグが立っている場合消去
  49. */
  50. private void removeProccess() {
  51. Iterator<T> itr = objects.iterator();
  52. T o;
  53. while(itr.hasNext()) {
  54. o = itr.next();
  55. if(o.isRemove())
  56. itr.remove();
  57. }
  58. }
  59.  
  60.  
  61. /**
  62.  * リストにゲームオブジェクトを登録する待機状態にする
  63.  * その語updateメソッドのjoinlistでobjectsに追加される
  64.  * @param object
  65.  */
  66. public void registerObject(T object) {
  67. additionalObjects.add(object);
  68. }
  69. /**
  70.  * インスタンスの参照
  71.  */
  72. public ObjectManager getInstance() {
  73. return instance;
  74. }
  75.  
  76. /**
  77. * 追加されるのを待機しているオブジェクトをobjectsに追加しaddtionalObjectsリストを空にする
  78. */
  79. private void joinList() {
  80. objects.addAll(additionalObjects);
  81. additionalObjects.clear();
  82. }
  83. /**
  84. *
  85. * @param d
  86. */
  87. public void draw(Drawer d) {
  88. Iterator<T> itr = objects.iterator();
  89. T o;
  90. while(itr.hasNext()) {
  91. o = itr.next();
  92. o.draw(d);
  93. }
  94. }
  95.  
  96. public ArrayList<T> getlist(){
  97. return objects;
  98. }
  99. }
  100.  

その後GameSceneを次のように変更してください
  1. import java.awt.Color;
  2.  
  3. import densan.s.game.drawing.Drawer;
  4. import densan.s.game.manager.Updatable;
  5.  
  6.  
  7. public class GameScene implements Updatable{
  8.  
  9. private ObjectManager om = ObjectManager.getInstance();
  10. public GameScene() {
  11. om.registerObject(new Player);
  12. }
  13.  
  14. @Override
  15. public void update() {
  16. om.update;
  17. }
  18.  
  19. @Override
  20. public void draw(Drawer d) {
  21.  
  22. //ちゃんとクラスを使えてるか確認するための文字描画
  23. d.setColor(Color.BLUE);
  24. d.setFontSize(40);
  25. d.drawString("TEST", 100, 100);
  26. om.draw(d)
  27.  
  28. }
  29.  
  30. }
  31.  

これでGameSceneのコンストラクタ11行目でObjectManagerにGameObjectBaseを継承しているPlayerオブジェクトを渡し、updateとdrawメソッドではObjectManagerのupdateとdrawメソッドを呼び出しており、この部分ですべてのObjectManagerが持つGameObjectBaseを継承したオブジェクトにupdateあるいはdrawを実行するという処理になっています。なので、registerObjectメソッドの引数にGameObjectBaseを与えればそれだけで後はそのクラスが持つupdateメソッドとdrawメソッドが実行されるといった仕組みがこれで出来ています。