I am trying to figure out the best/correct way of Giving my control access to AssetManager and RootNode.
I have a spawner.j3o object which is a imported blender cube.
I have a platform.j3o object which is a imported blender rectangle.
I have a spawner control which extends Abstract Class. Its job is to wait for 2 sec and then spawn the platform.
It also moves the spawner as the camera moves.
public class SpawnerControl extends AbstractControl {
private float speedOfSpawn = 2f;
private float lastSpawn = 0f;
private boolean spawn = false;
private Vector3f offset = new Vector3f();
@Override
protected void controlUpdate(float tpf) {
if (lastSpawn > speedOfSpawn){
spawnPlatform();
lastSpawn = 0f;
}else {
lastSpawn+= tpf;
}
spatial.setLocalTranslation(App.getInstance().getCamera().getLocation().add(offset));
}
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
}
private void spawnPlatform(){
System.out.println("spawnPlatform " + System.currentTimeMillis());
AssetManager assetManager = App.getInstance().getAssetManager();
Spatial teapot = assetManager.loadModel("Models/platform.j3o");
App.getInstance().getRootNode().attachChild(teapot);
}
public float getSpeedOfSpawn() {
return speedOfSpawn;
}
public void setSpeedOfSpawn(float speedOfSpawn) {
this.speedOfSpawn = speedOfSpawn;
}
@Override
public Control cloneForSpatial(Spatial spatial) {
System.out.println("cloneForSpatial");
SpawnerControl control = new SpawnerControl();
control.setSpatial(spatial);
offset = App.getInstance().getCamera().getLocation().subtract(spatial.getWorldTranslation());
System.out.println("offset " + offset);
return control;
}
I have a App class that extends SimpleApplication and has a Singleton getInstance() static Method.
It also moves the camera
private static App instance = null;
public static App getInstance(){
if(instance == null){
instance = new App();
}
return instance;
}
@Override
public void simpleUpdate(float tpf) {
cam.setLocation(cam.getLocation().add(new Vector3f(camSpeed,0,0)));
}
I have a Main class that creates a instance of App by
App app = App.getInstance();
app.start();
The issue is I am using App.getInstance() in the control if I add the SpawnerControl to the Spatial on the SDK Scene Composer and save it will no longer be able to open in the Scene composer. I am assuming because the Scene Composer has no reference to App.getInstance()…
Can anyone tell me how to work around this or is using a Singleton a bad Idea if using Scene Composer? What is the best way to get to the AssetManager and RootNode inside a Control if I am going to use the Scene Composer.
Thanks,
Greg