Subversion Repositories AndroidProjects

Rev

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

package com.gebauz.pingk.gamestates;

import java.util.Vector;

import com.badlogic.gdx.Gdx;
import com.gebauz.Bauzoid.app.Game;
import com.gebauz.Bauzoid.gamestates.BaseGameState;
import com.gebauz.Bauzoid.graphics.Font;
import com.gebauz.Bauzoid.math.Matrix4;
import com.gebauz.pingk.PingkCustomServices;
import com.gebauz.pingk.game.GameConsts;

public class CreditsState extends BaseGameState
{
        static private final float TEXT_DISTANCE = 40.0f;
        static private final float SCROLL_IN_SPEED = 5.0f;
        static private final float SCROLL_OUT_SPEED = 1500.0f;
        static private final float ITEM_STAY_TIME = 2.5f;
       
        static private final int PHASE_SCROLL_IN = 0;
        static private final int PHASE_STAY = 1;
        static private final int PHASE_SCROLL_OUT = 2;
        static private final int PHASE_DONE = 3;
       
        private Font mFont = null;
       
        private class CreditsItem
        {
                private String mText;
                private float scale = 1.0f;
                private float x;
                private float y;
               
                private float targetX;
                private float targetX2;
               
                private float mCountdown = 0.0f;
                private int mState = PHASE_SCROLL_IN;
               
                public CreditsItem(String text, float _scale, float _x, float _y)
                {
                        mText = text;
                        scale = _scale;
                        x = _x;
                        y = _y;
                       
                        targetX = (GameConsts.VIRTUAL_SCREEN_WIDTH - mFont.getTextWidth(text, _scale)) / 2.0f;
                        targetX2 = (GameConsts.VIRTUAL_SCREEN_WIDTH + 1400.0f + x);
                }
               
                public void update(float deltaTime)
                {
                        if (isDone())
                                return;
                       
                        if (mState == PHASE_SCROLL_IN)
                        {
                                float diff = targetX - x;
                                if (diff >= 1.0f)
                                {
                                        x += diff * deltaTime * SCROLL_IN_SPEED;
                                }
                                else
                                {
                                        mState = PHASE_STAY;   
                                        mCountdown = ITEM_STAY_TIME;
                                }
                        }
                        else if (mState == PHASE_STAY)
                        {
                                mCountdown -= deltaTime;
                                if (mCountdown < 0.0f)
                                {
                                        mState = PHASE_SCROLL_OUT;
                                }
                        }
                        else if (mState == PHASE_SCROLL_OUT)
                        {
                                //float diff = targetX2 - x;
                                if (x < targetX2)
                                {
                                        x += deltaTime * SCROLL_OUT_SPEED;
                                }
                                else
                                {
                                        mState = PHASE_DONE;
                                }
                        }
                }
               
                public void render()
                {
                        if (isDone())
                                return;
                        mFont.drawText(mText, x, y, GameConsts.PINGK_COLOR, scale);
                }
               
                public final boolean isDone()
                {
                        return mState == PHASE_DONE;
                }
        }
       
        private class CreditsPage
        {
                private Vector<CreditsItem> mItems = new Vector<CreditsItem>();
               
                public CreditsPage()
                {                      
                }
               
                public void addItem(CreditsItem item)
                {
                        mItems.add(item);
                }
               
                public void update(float deltaTime)
                {
                        for (int i = 0; i < mItems.size(); i++)
                        {
                                mItems.get(i).update(deltaTime);
                        }      
                }
               
                public void render()
                {
                        for (int i = 0; i < mItems.size(); i++)
                        {
                                mItems.get(i).render();
                        }
                }
               
                public final boolean isDone()
                {
                        for (int i = 0; i < mItems.size(); i++)
                        {
                                if (!mItems.get(i).isDone())
                                        return false;
                        }
                       
                        return true;
                }
        }
       
        private Vector<CreditsPage> mPages = new Vector<CreditsPage>();
       
        private int mCurrentPage = 0;

        public CreditsState(Game game)
        {
                super(game);
        }

        @Override
        public void init()
        {
                mFont = PingkCustomServices.getInstance().getFont();
               
                newPage();
                newItem("Presented by", 1.0f, -100.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - TEXT_DISTANCE);
                newItem("Gebauz", 1.5f, -500.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f);
               
                newPage();
                newItem("Concept and Game Design", 1.0f, -100.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - 2*TEXT_DISTANCE);
                newItem("Georg Semanek", 1.5f, -500.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - TEXT_DISTANCE);
                newItem("Alexander Kusternig", 1.5f, -900.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f);
                newItem("Chris Chiu", 1.5f, -1300.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f + TEXT_DISTANCE);

                newPage();
                newItem("Programming", 1.0f, -100.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - TEXT_DISTANCE);
                newItem("Chris Chiu", 1.5f, -500.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f);
               
                newPage();
                newItem("Original Programming", 1.0f, -100.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - TEXT_DISTANCE);
                newItem("Alexander Kusternig", 1.5f, -500.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f);
               
                newPage();
                newItem("Graphics", 1.0f, -100.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - 2*TEXT_DISTANCE);
                newItem("Chris Chiu", 1.5f, -500.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - TEXT_DISTANCE);
                newItem("Georg Semanek", 1.5f, -900.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f);
                newItem("Alexander Kusternig", 1.5f, -1300.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f + TEXT_DISTANCE);

                newPage();
                newItem("Music and Sounds", 1.0f, -100.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - TEXT_DISTANCE);
                newItem("Chris CHiu", 1.5f, -500.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f);
               
                newPage();
                newItem("Testing", 1.0f, -100.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - 1.5f*TEXT_DISTANCE);
                newItem("Chris Chiu", 1.5f, -500.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - 0.5f*TEXT_DISTANCE);
                newItem("Chun-Chun Huang", 1.5f, -900.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f + 0.5f*TEXT_DISTANCE);
               
                newPage();
                newItem("Uses", 1.0f, -100.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - TEXT_DISTANCE);
                newItem("libGDX framework", 1.5f, -500.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f);

                newPage();
                newItem("Thank you", 2.0f, -100.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f - TEXT_DISTANCE);
                newItem("for playing!", 2.0f, -500.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT/2.0f);
               
                mCurrentPage = 0;
        }

        @Override
        public void exit()
        {
                mFont = null;
        }

        @Override
        public void update(float deltaTime)
        {
                if (Gdx.input.justTouched())
                {
                        switchTo(com.gebauz.pingk.gamestates.TitleState.class);
                }
               
                CreditsPage page = mPages.get(mCurrentPage);
               
                page.update(deltaTime);
               
                if (page.isDone())
                {
                        mCurrentPage++;
                        if (mCurrentPage >= mPages.size())
                        {
                                switchTo(com.gebauz.pingk.gamestates.TitleState.class);
                        }
                }
        }

        @Override
        public void render()
        {
                getGraphics().clear(0.05f, 0.05f, 0.05f, 0.0f);
               
                getRenderStates().projection = Matrix4.createOrtho(
                                0.0f,
                                GameConsts.VIRTUAL_SCREEN_WIDTH-1,
                                GameConsts.VIRTUAL_SCREEN_HEIGHT-1,
                                0.0f,
                                0.0f,
                                1.0f
                        );
               
                if (mCurrentPage < mPages.size())
                        mPages.get(mCurrentPage).render();
        }
       
        private final void newPage()
        {
                mPages.add(new CreditsPage());
        }
       
        private final void newItem(String text, float _scale, float _x, float _y)
        {
                mPages.lastElement().addItem(new CreditsItem(text, _scale, _x, _y));
        }

}