Overview
I have a scene manager in my game and in each 'Scene' I have a render() and a update() method for drawing and updating my game's logic.
Basically, when I want to switch to another scene, let's say, when the player progresses to the next level or going from game-over back to the main menu, I just do something like this:
SceneManager.getInstance().setCurrentScene(level2); //Where level 2 is a 'Scene' class.
I have a 'MainGame' scene who's sole purpose is to house all the methods I call from my individual levels. So I might then do something like this:
Current method
public class Level1 extends MainGame implements Scene {
private Resources res;
private MyGLRenderer r;
Level1(MyGLRenderer r, Resources res){
super(r, res);
this.res = res;
this.r = r;
}
@Override
public void render() {
draw(background);
draw(playerSprite);
draw(blue-enemies);
}
@Override
public void update(){
super.movePlayer();
super.moveEnemies();
super.checkCollision();
}
}
However, in my game, when the player survives for a certain amount of time, I want to introduce more elements into the game, so I might then have a 'level2' Scene (although strictly, from the player's perspective, the game is perceived to be one big rolling level).....
public class Level2 extends MainGame implements Scene {
private Resources res;
private MyGLRenderer r;
Level2(MyGLRenderer r, Resources res){
super(r, res);
this.res = res;
this.r = r;
}
@Override
public void render() {
draw(background);
draw(playerSprite);
draw(blue-enemies);
draw(pink-enemies); //New!!!! *********************************
}
@Override
public void update(){
super.movePlayer();
super.moveEnemies();
super.checkCollision();
}
}
So, as you can see, Level2 is exactly the same as Leve1 but now I'm also drawing my 'pink-enemies', I can keep doing this for 'levels' 3 through 10 but I'll end up duplicating and simply adding to each level each time. Seems like a lot of effort just to introduce 1 or 2 new things every 'level'.
Using conditions within my render / logic?
Is there a cleaner / tidier way of achieving that which I'm trying to achieve? I could do away with all my individual 'Level' classes altogether and just work straight out my MainGame class's Render() and Update() methods, but then I would have to have something like:
Render(){
//Render elements common to all levels
draw(background);
draw(playerSprite);
draw(blue-enemies);
//Render specific level objects
Switch (Level){
case 4:{draw(giantAlienSpaceship);}
case 3:{draw(orange-enemies);}
case 2:{draw(pinkEnemies);break;}
}
}
And then a similar switch in my logic. I'm not sure about this however, as it adds additional switch/conditional statements in my rendering and seems somewhat 'amateur' however, I could be completely wrong and this may be an acceptable method that people do use.
Am I missing any other obvious cleaner / cleverer way to do this (similar to my first method but without the duplicated super method calls)