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