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