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

「オブジェクトをまとめて管理する」の編集履歴(バックアップ)一覧はこちら

オブジェクトをまとめて管理する」(2017/10/10 (火) 02:56:46) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*オブジェクトの管理 ---- 自機を作成しましたが、このままだとオブジェクトが増えるたびにGameSceneのクラスに記述することになり、非常に複雑な処理になってしまいます。そこでオブジェクトをまとめて管理するクラスを作ります。以下にそのクラスのコードを示します。 #highlight(linenumber,java){{ package obj; import java.util.ArrayList; import java.util.Iterator; import densan.s.game.calc.Calc; import densan.s.game.drawing.Drawer; import densan.s.game.manager.GameManager; import densan.s.game.object.GameObjectBase; /** * ゲームのオブジェクトを管理するクラス * @author isato * * @param <T> */ public class ObjectManager<T extends GameObjectBase> { /** * */ private ArrayList<T> objects = new ArrayList<T>(); private ArrayList<T> additionalObjects = new ArrayList<T>(); private static ObjectManager instance = new ObjectManager<>(); private ObjectManager(){ } public static ObjectManager getInstace(){ return instance; } /** * オブジェクトのすべてにアップデート */ public void update() { Iterator<T> itr = objects.iterator(); T o; while(itr.hasNext()) { o = itr.next(); o.update(); } collisionPlayer(); removeProccess(); joinList(); } /** * オブジェクトにremoveフラグが立っている場合消去 */ private void removeProccess() { Iterator<T> itr = objects.iterator(); T o; while(itr.hasNext()) { o = itr.next(); if(o.isRemove()) itr.remove(); } } /** * リストにゲームオブジェクトを登録する待機状態にする * その語updateメソッドのjoinlistでobjectsに追加される * @param object */ public void registerObject(T object) { additionalObjects.add(object); } /** * インスタンスの参照 */ public ObjectManager getInstance() { return instance; } /** * 追加されるのを待機しているオブジェクトをobjectsに追加しaddtionalObjectsリストを空にする */ private void joinList() { objects.addAll(additionalObjects); additionalObjects.clear(); } /** * * @param d */ public void draw(Drawer d) { Iterator<T> itr = objects.iterator(); T o; while(itr.hasNext()) { o = itr.next(); o.draw(d); } } public ArrayList<T> getlist(){ return objects; } } }} その後GameSceneを次のように変更してください #highlight(linenumber,java){{ import java.awt.Color; import densan.s.game.drawing.Drawer; import densan.s.game.manager.Updatable; public class GameScene implements Updatable{ private ObjectManager om = ObjectManager.getInstance(); public GameScene() { om.registerObject(new Player); } @Override public void update() { om.update; } @Override public void draw(Drawer d) { //ちゃんとクラスを使えてるか確認するための文字描画 d.setColor(Color.BLUE); d.setFontSize(40); d.drawString("TEST", 100, 100); om.draw(d) } } }} これでGameSceneのコンストラクタ11行目でObjectManagerにGameObjectBaseを継承しているPlayerオブジェクトを渡し、updateとdrawメソッドではObjectManagerのupdateとdrawメソッドを呼び出しており、この部分ですべてのObjectManagerが持つGameObjectBaseを継承したオブジェクトにupdateあるいはdrawを実行するという処理になっています。なので、registerObjectメソッドの引数にGameObjectBaseを与えればそれだけで後はそのクラスが持つupdateメソッドとdrawメソッドが実行されるといった仕組みがこれで出来ています。

表示オプション

横に並べて表示:
変化行の前後のみ表示: