package com.gebauz.pingK.common.game.gamestates;
import java.util.Vector;
import javax.microedition.khronos.opengles.GL10;
import com.gebauz.pingK.common.R;
import com.gebauz.pingK.common.framework.GLUtil;
import com.gebauz.pingK.common.framework.ResourceManager;
import com.gebauz.pingK.common.game.Font;
import com.gebauz.pingK.common.game.GameConsts;
import com.gebauz.pingK.common.game.GameServices;
import com.gebauz.pingK.common.game.MultitouchInput;
import com.gebauz.pingK.common.game.MultitouchInput.Finger;
public class CreditsState
extends BaseGameState
{
static public final float ITEM_FADE_TIME = 3.0f
;
static public final float ITEM_DISPLAY_TIME = 5.0f
;
public class CreditsItem
{
private String mText
;
private float mSize
;
private float mPosX
;
private final float mTargetX
;
private final float mEndTargetX
;
private final float mWidth
;
private float mPosY
;
private float mLifeTime = 0.0f
;
public CreditsItem
(String text,
float size,
float startPosX,
float positionY
)
{
mText = text
;
mSize = size
;
mPosY = positionY
;
mPosX = startPosX
;
mWidth =
(Font.
CHARACTER_SIZE * text.
length() * mSize
);
mTargetX =
(GameConsts.
VIRTUAL_SCREEN_WIDTH - mWidth
) / 2.0f
;
mEndTargetX =
(GameConsts.
VIRTUAL_SCREEN_WIDTH + mWidth
);
}
public void update
(float deltaTime
)
{
mLifeTime += deltaTime
;
if (mLifeTime
< ITEM_FADE_TIME
)
{
float diff = mTargetX - mPosX
;
mPosX += diff
* deltaTime
* 3.0f
;
}
else
{
if (mPosX
< mEndTargetX
)
mPosX += deltaTime
* mLifeTime
* GameConsts.
VIRTUAL_SCREEN_WIDTH;
else
mPosX = mEndTargetX
;
}
}
public void render
()
{
GameServices.
getFont().
drawText(mText, mPosX, mPosY, mSize
);
}
public boolean isDone
()
{
return (mLifeTime
> ITEM_DISPLAY_TIME
);
}
}
public class CreditsPage
{
private Vector<CreditsItem
> mItems =
new Vector<CreditsItem
>();
private boolean mIsDone =
false;
public CreditsPage
()
{
}
public void update
(float deltaTime
)
{
boolean isDone =
true;
for (int i =
0; i
< mItems.
size(); i++
)
{
CreditsItem item = mItems.
get(i
);
item.
update(deltaTime
);
isDone = isDone
&& item.
isDone();
}
if (isDone
)
mIsDone =
true;
}
public void render
()
{
for (int i =
0; i
< mItems.
size(); i++
)
{
mItems.
get(i
).
render();
}
}
public void addItem
(String text,
float size,
float initialX,
float posY
)
{
mItems.
add(new CreditsItem
(text, size, initialX, posY
));
}
public boolean isDone
()
{
return mIsDone
;
}
}
private Vector<CreditsPage
> mCredits =
new Vector<CreditsPage
>();
private int mCurrentPage =
0;
public CreditsState
()
{
}
@
Override
public void init
()
{
GameServices.
showAd(false);
startCreditsPage
();
addCreditsItem
(R.
string.
credits1_title, 2.0f, -200.0f, 200.0f
);
addCreditsItem
(R.
string.
credits1_name1, 3.0f, -300.0f, 250.0f
);
startCreditsPage
();
addCreditsItem
(R.
string.
credits2_title, 2.0f, -200.0f, 150.0f
);
addCreditsItem
(R.
string.
credits2_name1, 3.0f, -300.0f, 200.0f
);
addCreditsItem
(R.
string.
credits2_name2, 3.0f, -400.0f, 240.0f
);
addCreditsItem
(R.
string.
credits2_name3, 3.0f, -500.0f, 280.0f
);
startCreditsPage
();
addCreditsItem
(R.
string.
credits3_title, 2.0f, -200.0f, 200.0f
);
addCreditsItem
(R.
string.
credits3_name1, 3.0f, -300.0f, 250.0f
);
startCreditsPage
();
addCreditsItem
(R.
string.
credits4_title, 2.0f, -200.0f, 200.0f
);
addCreditsItem
(R.
string.
credits4_name1, 3.0f, -300.0f, 250.0f
);
startCreditsPage
();
addCreditsItem
(R.
string.
credits5_title, 2.0f, -200.0f, 150.0f
);
addCreditsItem
(R.
string.
credits5_name1, 3.0f, -300.0f, 200.0f
);
addCreditsItem
(R.
string.
credits5_name2, 3.0f, -400.0f, 240.0f
);
addCreditsItem
(R.
string.
credits5_name3, 3.0f, -500.0f, 280.0f
);
startCreditsPage
();
addCreditsItem
(R.
string.
credits6_title, 2.0f, -200.0f, 200.0f
);
addCreditsItem
(R.
string.
credits6_name1, 3.0f, -300.0f, 250.0f
);
startCreditsPage
();
addCreditsItem
(R.
string.
credits7_title, 2.0f, -200.0f, 180.0f
);
addCreditsItem
(R.
string.
credits7_name1, 3.0f, -300.0f, 230.0f
);
addCreditsItem
(R.
string.
credits7_name2, 3.0f, -400.0f, 270.0f
);
startCreditsPage
();
addCreditsItem
(R.
string.
credits8_title, 4.0f, -400.0f, 200.0f
);
}
@
Override
public void exit
()
{
mCredits.
clear();
}
@
Override
public void onSurfaceChanged
(int width,
int height
)
{
GLUtil.
getGL().
glViewport(0,
0, width, height
);
}
@
Override
public void update
(float deltaTime
)
{
//for (int i = 0; i < mCredits.size(); i++)
if (mCurrentPage
< mCredits.
size())
{
CreditsPage page = mCredits.
get(mCurrentPage
);
page.
update(deltaTime
);
if (page.
isDone())
mCurrentPage++
;
if (mCurrentPage
>= mCredits.
size())
{
GameStateManager.
getInstance().
switchState("TitleState");
}
}
Finger finger = MultitouchInput.
getInstance().
getTouchPointInside(0.0f, 0.0f, GameConsts.
VIRTUAL_SCREEN_WIDTH, GameConsts.
VIRTUAL_SCREEN_HEIGHT);
if (finger
!=
null)
{
// switch state
GameStateManager.
getInstance().
switchState("TitleState");
}
}
@
Override
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);
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);
if (mCurrentPage
< mCredits.
size())
{
mCredits.
get(mCurrentPage
).
render();
}
}
@
Override
public boolean doFadeIn
()
{
return true;
}
@
Override
public boolean doFadeOut
()
{
return true;
}
public void startCreditsPage
()
{
mCredits.
add(new CreditsPage
());
}
public void addCreditsItem
(int id,
float size,
float initialX,
float posY
)
{
if (mCredits.
size() ==
0)
return;
CreditsPage page = mCredits.
get(mCredits.
size()-
1);
page.
addItem(ResourceManager.
getResources().
getString(id
), size, initialX, posY
);
}
}