Subversion Repositories AndroidProjects

Rev

Rev 757 | Rev 770 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.PonPonChun.gamestates;

import com.badlogic.gdx.Gdx;
import com.gebauz.Bauzoid.game.Game;
import com.gebauz.Bauzoid.game.StateMachine;
import com.gebauz.Bauzoid.game.StateMachine.EventListener;
import com.gebauz.Bauzoid.gamestates.BaseGameState;
import com.gebauz.Bauzoid.graphics.Font;
import com.gebauz.Bauzoid.graphics.sprite.Sprite;
import com.gebauz.Bauzoid.math.MathUtil;
import com.gebauz.Bauzoid.math.Vector4;
import com.gebauz.PonPonChun.game.GameConsts;

public class IntroState extends BaseGameState implements EventListener<IntroState.Phase>
{

        // Constants========================================================================================
       
        public static final float HAT_MOVE_SPEED = 60.0f;
        public static final float HAT_SCROLL_SPEED = 3000.0f;
        public static final float CAT_SCROLL_SPEED = 3000.0f;

        public static final int NUM_SCROLLERS = 3;
       
        public static final float SCROLLER2_WIDTH = GameConsts.VIRTUAL_SCREEN_WIDTH/2;
        public static final float SCROLLER2_HEIGHT = GameConsts.VIRTUAL_SCREEN_HEIGHT/2;

        public static final float SCROLLER3_WIDTH = GameConsts.VIRTUAL_SCREEN_WIDTH/3;
        public static final float SCROLLER3_HEIGHT = GameConsts.VIRTUAL_SCREEN_HEIGHT/3;
       
        public static final float HAT_TARGET_Y = 350;
        public static final float TEXT_Y = 550;
       
        public static final float CAT_START_POS_X = 800;
        public static final float CAT_TARGET_POS_X = GameConsts.VIRTUAL_SCREEN_WIDTH/2;
       
        public static final float MANE_HAT_SHOW_TIME = 4.0f;
        public static final float MANE_HAT_SCROLL_TIME = 0.2f;
        public static final float SCROLLER_SHOW_TIME = 1.5f;
        public static final float CAT_SCROLL_TIME = 0.5f;
        public static final float CAT_WAIT_TIME = 0.5f;
        public static final float CAT_IDEA_TIME = 1.5f;
       
        // Embedded Types===================================================================================
       
        public enum Phase
        {
                MANE_HAT_APPEAR,
                MANE_HAT,
                MANE_HAT_SCROLL,
                SCROLL,
                CAT_SCROLL,
                CAT_WAIT,
                CAT_IDEA,
        }

        // Fields===========================================================================================
       
        private StateMachine<Phase> mStates = null;
       
        private Sprite mHat = null;
        private float mHatX = GameConsts.VIRTUAL_SCREEN_WIDTH/2;
        private float mHatY = GameConsts.VIRTUAL_SCREEN_HEIGHT/2;
       
        private Sprite mScroller[] = new Sprite[NUM_SCROLLERS];
        private float mScrollerX[] = new float[NUM_SCROLLERS];
        private float mScrollerAlpha = 0.0f;
       
        private Sprite mCat = null;
        private Sprite mBulb = null;
       
        private Vector4 mTextColor = new Vector4(1, 1, 1, 0);

        // Methods==========================================================================================

        public IntroState(Game game)
        {
                super(game);
                setFading(true, true);
               
                mStates = new StateMachine<Phase>(Phase.MANE_HAT_APPEAR, this);
               
                mHat = new Sprite(getGraphics(), "data/textures/manehat.png");
                mScroller[0] = new Sprite(getGraphics(), "data/textures/scroller1.png");
                mScroller[1] = new Sprite(getGraphics(), "data/textures/scroller2.png");
                mScroller[2] = new Sprite(getGraphics(), "data/textures/scroller3.png");
                mCat = new Sprite(getGraphics(), "data/textures/cat_intro.png");
                mBulb = new Sprite(getGraphics(), "data/textures/bulb.png");
        }

        @Override
        public void init(String param)
        {
                mHat.init(GameConsts.VIRTUAL_SCREEN_WIDTH/2, GameConsts.VIRTUAL_SCREEN_HEIGHT/2, 300, 300);
                for (int i = 0; i < NUM_SCROLLERS; i++)
                {
                        mScroller[i].init(0, 0, GameConsts.VIRTUAL_SCREEN_WIDTH, GameConsts.VIRTUAL_SCREEN_HEIGHT, 0, 0);
                        mScrollerX[i] = 0.0f;
                }
                mCat.init(CAT_START_POS_X, GameConsts.VIRTUAL_SCREEN_HEIGHT/2, 300, 300);
                mBulb.init(160, 250, 64, 64);
        }

        @Override
        public void exit()
        {
                if (mHat != null)
                {
                        mHat.dispose();
                        mHat = null;
                }
               
                if (mCat != null)
                {
                        mCat.dispose();
                        mCat = null;
                }
               
                if (mBulb != null)
                {
                        mBulb.dispose();
                        mBulb = null;
                }
               
                for (int i = 0; i < NUM_SCROLLERS; i++)
                {
                        if (mScroller[i] != null)
                        {
                                mScroller[i].dispose();
                                mScroller[i] = null;
                        }
                }
        }

        @Override
        public void update(float deltaTime)
        {
                if (Gdx.input.justTouched())
                {
                        getGameStateManager().switchTo(com.gebauz.PonPonChun.gamestates.TitleState.class, "");                 
                }
               
                mStates.update(deltaTime);
        }
       

        @Override
        public void onUpdate(float deltaTime, Phase currentState, float stateTime)
        {
                switch(currentState)
                {
                case MANE_HAT_APPEAR:
                        mHatY -= deltaTime * HAT_MOVE_SPEED;
                        mHat.x = mHatX;
                        mHat.y = mHatY;
                       
                        if (mHatY < HAT_TARGET_Y)
                        {
                                mHatY = HAT_TARGET_Y;
                                mStates.switchState(Phase.MANE_HAT, MANE_HAT_SHOW_TIME);
                        }                      
                        break;
                case MANE_HAT:
                        {
                                float t = mStates.getStateTime();
                                mHat.y = HAT_TARGET_Y + MathUtil.sin(180 + t * 90.0f) * 20.0f;
       
                                final float fadeTime = 0.5f;
                                if (t < fadeTime)
                                        mTextColor.w = MathUtil.clamp(t / fadeTime, 0, 1);
                                else if (t > (MANE_HAT_SHOW_TIME-fadeTime))
                                        mTextColor.w = MathUtil.clamp((MANE_HAT_SHOW_TIME - t) / fadeTime, 0, 1);
                                else
                                        mTextColor.w = 1.0f;
                        }
                        break;
                case MANE_HAT_SCROLL:
                        mHat.x -= deltaTime * HAT_SCROLL_SPEED;

                        break;
                case SCROLL:
                        {
                                final float interval[] = {0.2f, 0.45f, 0.8f};
                                float t = mStates.getStateTime();
                                               
                                for (int i = 0; i < NUM_SCROLLERS; i++)
                                {
                                        float s = t % interval[i];
                                        mScrollerX[i] = -(s/interval[i]) * GameConsts.VIRTUAL_SCREEN_WIDTH;
                                }
                               
                                final float fadeTime = 0.2f;                           
                                if (t < fadeTime)
                                        mScrollerAlpha = MathUtil.clamp(t / fadeTime, 0, 1);
                                else if (t > (SCROLLER_SHOW_TIME-fadeTime))
                                        mScrollerAlpha = MathUtil.clamp((SCROLLER_SHOW_TIME - t) / fadeTime, 0, 1);
                                else
                                        mScrollerAlpha = 1.0f;
                        }
                        break;
                case CAT_SCROLL:
                        mCat.x -= deltaTime * CAT_SCROLL_SPEED;
                        if (mCat.x < CAT_TARGET_POS_X)
                        {
                                mCat.x = CAT_TARGET_POS_X;
                                mStates.switchState(Phase.CAT_WAIT, CAT_WAIT_TIME);
                        }
                        break;
                case CAT_WAIT:
                        break;
                case CAT_IDEA:
                        break;

                }
        }

        @Override
        public void render()
        {
                getGraphics().clear(0.0f, 0.0f, 0.0f, 0.0f);
               
                getRenderStates().projection.setOrtho(
                                0.0f,
                                GameConsts.VIRTUAL_SCREEN_WIDTH-1,
                                GameConsts.VIRTUAL_SCREEN_HEIGHT-1,
                                0.0f,
                                0.0f,
                                1.0f
                        );
               
                switch(mStates.getState())
                {
                case MANE_HAT_APPEAR:
                        mHat.render();
                        break;
                case MANE_HAT:
                        mHat.render();
                        String txt = "MANE HAT";
                        Font f = getFonts().getFont("scoring");
                        float w = f.getTextWidth(txt, 3.0f);
                        f.drawText(txt, GameConsts.VIRTUAL_SCREEN_WIDTH/2 - w/2, TEXT_Y, mTextColor, 3.0f);
                        break;
                case MANE_HAT_SCROLL:
                        mHat.render();
                        break;
                case SCROLL:
                        for (int i = NUM_SCROLLERS-1; i >= 0; i--)
                        {
                                mScroller[i].alpha = mScrollerAlpha;
                                mScroller[i].x = mScrollerX[i];
                                mScroller[i].render();
                                mScroller[i].x = mScrollerX[i] + GameConsts.VIRTUAL_SCREEN_WIDTH;
                                mScroller[i].render();
                        }
                        break;
                case CAT_SCROLL:
                        mCat.render();
                        break;
                case CAT_WAIT:
                        mCat.render();
                        break;
                case CAT_IDEA:
                        mCat.render();
                        mBulb.render();
                        break;
                }
        }

        @Override
        public boolean onSwitchState(Phase newState)
        {
                switch(newState)
                {
                case MANE_HAT_APPEAR:
                        break;
                case MANE_HAT:
                        break;
                case MANE_HAT_SCROLL:
                        break;
                case SCROLL:
                        break;
                case CAT_SCROLL:
                        break;

                case CAT_WAIT:
                        break;
                case CAT_IDEA:
                        break;
                }
               
                return true;
        }


        @Override
        public void onEndState(Phase currentState)
        {
                switch(currentState)
                {
                case MANE_HAT_APPEAR:
                        break;
                case MANE_HAT:
                        mStates.switchState(Phase.MANE_HAT_SCROLL, MANE_HAT_SCROLL_TIME);
                        break;
                case MANE_HAT_SCROLL:
                        mStates.switchState(Phase.SCROLL, SCROLLER_SHOW_TIME);
                        break;
                case SCROLL:
                        mStates.switchState(Phase.CAT_SCROLL, CAT_SCROLL_TIME);
                        break;
                case CAT_SCROLL:
                        break;
                case CAT_WAIT:
                        mStates.switchState(Phase.CAT_IDEA, CAT_IDEA_TIME);
                        break;
                case CAT_IDEA:
                        this.switchTo(com.gebauz.PonPonChun.gamestates.TitleState.class, "");
                        break;
                }
        }
       
        // Getters/Setters==================================================================================

}