package com.gebauz.pingK.gamestates;
import javax.microedition.khronos.opengles.GL10;
import com.gebauz.framework.util.GLUtil;
import com.gebauz.framework.util.MathUtil;
import com.gebauz.framework.util.Mesh;
import com.gebauz.framework.util.RenderUtil;
import com.gebauz.framework.util.Vector4;
import com.gebauz.framework.util.renderstates.RenderStates;
import com.gebauz.framework.util.renderstates.BlendingStates.BlendingMode;
import com.gebauz.pingK.game.GameConsts;
import android.content.Context;
import android.util.Log;
public class GameStateManager
{
private static GameStateManager mInstance =
new GameStateManager
();
private Context mContext =
null;
private BaseGameState mCurrentState =
null;
private String mNextState =
"";
private Mesh mFadeOverlay =
null;
private enum StateMode
{
MODE_NORMAL,
// everything normal
MODE_FADEIN,
// fade in
MODE_FADEOUT
// fade out
};
private StateMode mStateMode = StateMode.
MODE_NORMAL;
private float mFadeTimer = 0.0f
;
private GameStateManager
()
{
mFadeOverlay = RenderUtil.
createQuad(0.0f, 0.0f, GameConsts.
VIRTUAL_SCREEN_WIDTH, GameConsts.
VIRTUAL_SCREEN_HEIGHT,
new Vector4
(0.0f, 0.0f, 0.0f, 0.0f
));
/* mFadeOverlay.setPrimitiveType(GL10.GL_TRIANGLE_STRIP);
Mesh.AttributeArray vertices = new Mesh.AttributeArray(Mesh.COLOR_ELEMENTS_COUNT * 4);
Mesh.AttributeArray colors = new Mesh.AttributeArray(Mesh.COLOR_ELEMENTS_COUNT * 4);
vertices.fill(0.0f, 0.0f, 0.0f);
vertices.fill(GameConsts.VIRTUAL_SCREEN_WIDTH, 0.0f, 0.0f);
vertices.fill(0.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT, 0.0f);
vertices.fill(GameConsts.VIRTUAL_SCREEN_WIDTH, GameConsts.VIRTUAL_SCREEN_HEIGHT, 0.0f);
colors.fill(0.0f, 0.0f, 0.0f, 0.5f);
colors.fill(0.0f, 0.0f, 0.0f, 0.5f);
colors.fill(0.0f, 0.0f, 0.0f, 0.5f);
colors.fill(0.0f, 0.0f, 0.0f, 0.5f);
mFadeOverlay.setVertices(vertices.getAttributeArray());
mFadeOverlay.setColors(colors.getAttributeArray());*/
}
public static GameStateManager getInstance
()
{
return mInstance
;
}
public void switchState
(String newState
)
{
if ((mCurrentState
!=
null) && (mCurrentState.
doFadeOut()))
{
mStateMode = StateMode.
MODE_FADEOUT;
mFadeTimer = 0.0f
;
}
mNextState = newState
;
}
private void doSwitch
(String newState
)
{
if (mCurrentState
!=
null)
{
mCurrentState.
exit();
mCurrentState =
null;
}
try
{
String packageName = getClass
().
getPackage().
getName();
Class<?> theClass =
Class.
forName(packageName +
"." + newState
);
mCurrentState =
(BaseGameState
)theClass.
newInstance();
}
catch (ClassNotFoundException ex
)
{
Log.
v("GEBZ",
"ClassNotFoundException when switching to " + newState
);
return;
}
catch (InstantiationException ex
)
{
Log.
v("GEBZ",
"InstantiationException when switching to " + newState
);
return;
}
catch (IllegalAccessException ex
)
{
Log.
v("GEBZ",
"IllegalAccessException when switching to " + newState
);
return;
}
if (mCurrentState
!=
null)
{
mCurrentState.
init();
mCurrentState.
onSurfaceChanged(GLUtil.
getInstance().
getWidth(), GLUtil.
getInstance().
getHeight());
if (mCurrentState.
doFadeIn())
{
mStateMode = StateMode.
MODE_FADEIN;
mFadeTimer = 0.0f
;
}
}
}
public void onSurfaceChanged
(int width,
int height
)
{
if (mCurrentState
!=
null)
{
mCurrentState.
onSurfaceChanged(width, height
);
}
}
public void update
(float deltaTime
)
{
if (mStateMode
!= StateMode.
MODE_NORMAL)
{
mFadeTimer += deltaTime
;
if (mFadeTimer
> GameConsts.
FADE_TIME)
{
mStateMode = StateMode.
MODE_NORMAL;
}
}
if ((mStateMode == StateMode.
MODE_NORMAL) && (mNextState
!=
""))
{
// perform the actual switch
doSwitch
(mNextState
);
mNextState =
"";
}
if ((mCurrentState
!=
null) && (mStateMode == StateMode.
MODE_NORMAL))
{
mCurrentState.
update(deltaTime
);
}
float alpha = MathUtil.
clamp(mFadeTimer / GameConsts.
FADE_TIME, 0.0f, 1.0f
);
if (mStateMode == StateMode.
MODE_FADEOUT)
alpha = 1.0f - alpha
;
/*Mesh.AttributeArray vertices = new Mesh.AttributeArray(Mesh.COLOR_ELEMENTS_COUNT * 4);
vertices.fill(0.0f, 0.0f, 0.0f);
vertices.fill(GameConsts.VIRTUAL_SCREEN_WIDTH, 0.0f, 0.0f);
vertices.fill(0.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT, 0.0f);
vertices.fill(GameConsts.VIRTUAL_SCREEN_WIDTH, GameConsts.VIRTUAL_SCREEN_HEIGHT, 0.0f);
*/
Mesh.
AttributeArray colors =
new Mesh.
AttributeArray(Mesh.
COLOR_ELEMENTS_COUNT * mFadeOverlay.
getColorCount());
for (int i =
0; i
< mFadeOverlay.
getColorCount(); i++
)
{
colors.
fill(alpha, alpha, alpha, 1.0f
);
}
mFadeOverlay.
setColors(colors.
getAttributeArray());
//mFadeOverlay.setVertices(vertices.getAttributeArray());
}
public void render
()
{
GL10 gl = GLUtil.
getGL();
/*gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);*/
if (mCurrentState
!=
null)
{
mCurrentState.
render();
}
if (mStateMode
!= StateMode.
MODE_NORMAL)
{
gl.
glMatrixMode(GL10.
GL_PROJECTION);
gl.
glLoadIdentity();
gl.
glOrthof(0, GameConsts.
VIRTUAL_SCREEN_WIDTH-1.0f, GameConsts.
VIRTUAL_SCREEN_HEIGHT-1.0f,
0,
0,
1);
gl.
glMatrixMode(GL10.
GL_MODELVIEW);
gl.
glLoadIdentity();
RenderStates rs = GLUtil.
getRenderStates();
rs.
blending.
setEnabled(true);
rs.
blending.
setBlendingMode(BlendingMode.
MULTIPLY);
rs.
depthTest.
setEnabled(false);
rs.
culling.
setEnabled(false);
rs.
activate();
mFadeOverlay.
render();
rs.
deactivate();
}
}
public void setContext
(Context context
)
{
mContext = context
;
}
public Context getContext
()
{
return mContext
;
}
}