I think you are stuck on trying to implement utterly dissimilar powerups using a unified system. That seems like a mistake, and it might become obvious if you thought about the idea of multiple balls outside the context of a power-up: multiple balls are simply more instances of a Ball
object.
Handling multiple balls in code would not require a "gamestate", and it would not conflict with or complicate your existing "ballstate" logic. There are just more objects in play.
The only difficulty in this method is that you might need to change your update and draw logic slightly. If you have built your code around a single, global Ball
instance, a good first step would be refactoring to make that code operate on a method argument. For example:
/* the old
Ball globalBall;
void Update() {
globalBall.Move();
globalBall.Collide();
}
*/
// the new
List<Ball> allBalls;
// this old code is useful for a single ball; leave it mostly intact.
void UpdateBall(Ball ball) {
ball.Move();
ball.Collide();
}
// new code to deal with multiple Ball objects
void Update(){
foreach (ball in allBalls){
UpdateBall(ball);
}
}
The gist of it is, don't force your previous solution onto this new concept. Although sticky- and multi- might both be triggered by powerups, they are very different concepts. It's ok to create independent code paths to accomplish different game features.
If you have further difficulties, please edit your question to specify them. That will allow more helpful answers.