Subversion Repositories AndroidProjects

Rev

Rev 84 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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;
        }
}