オブジェクトの管理
自機を作成しましたが、このままだとオブジェクトが増えるたびにGameSceneのクラスに記述することになり、非常に複雑な処理になってしまいます。そこでオブジェクトをまとめて管理するクラスを作ります。以下にそのクラスのコードを示します。
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を次のように変更してください
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.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メソッドが実行されるといった仕組みがこれで出来ています。
最終更新:2017年10月10日 02:56