package com.gebauz.pingK.game;
import java.util.Random;
import java.util.Vector;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import com.gebauz.framework.util.GLUtil;
import com.gebauz.framework.util.RenderTexture;
import com.gebauz.pingK.R;
import com.gebauz.pingK.Sounds;
import com.gebauz.pingK.game.PowerUp.Type;
import com.gebauz.pingK.gamestates.GameStateManager;
public class GameLogic
{
public static final int PHASE_GAMEPLAY =
0;
public static final int PHASE_SCORE =
1;
private int mPlayPhase = PHASE_GAMEPLAY
;
private Background mBackground
;
private PlayField mPlayField
;
private MenuBar mMenuBar
;
private PauseScreen mPauseScreen
;
private Paddle mPaddles
[] =
new Paddle
[2];
private PaddleImpact mPaddleImpact
;
private Ball mBall
;
private BallWarp mBallWarp
;
private BallTrail mBallTrail
;
private ScreenFlash mScreenFlash
;
private PowerUpLogic mPowerUps
;
private ScoreDisplay mScoreDisplay
;
private Font mFont
;
private Random mRandomizer =
new Random();
private int mScores
[] =
new int[2];
private float mVirtualScoreBarHeight =
0;
private float mDipToPixelScale = 1.0f
;
private boolean mPaused =
false;
private boolean mSoundEnabled =
true;
private Vector<IReflectable
> mReflectables =
new Vector<IReflectable
>();
private MosaicEffect mMosaicEffect
;
private WaveEffect mWaveEffect
;
private FlowerEffect mFlowerEffect
;
private Crystals mCrystals
;
private CrystalHitCounter mCrystalHitCounter
;
private Sounds mSounds =
null;
int mSoundIds
[] =
{
R.
raw.
paddleimpact,
R.
raw.
wallimpact,
R.
raw.
score,
R.
raw.
newball,
R.
raw.
pickup,
R.
raw.
powerup_appears,
R.
raw.
crystal1,
R.
raw.
crystal2,
};
public GameLogic
()
{
mScores
[0] =
0;
mScores
[1] =
0;
}
public void playerGainsScore
(int playerIndex,
int lastPaddleTouched
)
{
mScores
[playerIndex
]++
;
mPlayPhase = PHASE_SCORE
;
if ((lastPaddleTouched == -
1) ||
(lastPaddleTouched == playerIndex
))
{
// score normal
mScoreDisplay.
startDisplay(playerIndex, ScoreDisplay.
MODE_SCORE);
}
else
{
// own goal
mScoreDisplay.
startDisplay(playerIndex, ScoreDisplay.
MODE_OWNGOAL);
}
mScreenFlash.
startFlash(GameConsts.
SCREENFLASH_SCORE_TIME);
}
public void init
()
{
mDipToPixelScale = GameStateManager.
getInstance().
getContext().
getResources().
getDisplayMetrics().
density;
//pixels = (Constants.GRID_BUTTON_SIZE_DIP * scale + 0.5f);
mVirtualScoreBarHeight =
(GameConsts.
SCORE_BAR_HEIGHT * mDipToPixelScale + 0.5f
) * (GameConsts.
VIRTUAL_SCREEN_HEIGHT /
(float)GLUtil.
getInstance().
getHeight());
Log.
v(GameConsts.
LOG_TAG,
"VirtualScoreBarHeight=" + mVirtualScoreBarHeight +
" H=" + GLUtil.
getInstance().
getHeight());
mSounds =
new Sounds
(mSoundIds
);
mSounds.
init(GameStateManager.
getInstance().
getContext());
mFont =
new Font();
mScoreDisplay =
new ScoreDisplay
(this);
mBackground =
new Background
(this);
mPlayField =
new PlayField
(this);
mMenuBar =
new MenuBar(this);
mPauseScreen =
new PauseScreen
(this);
mPaddles
[Paddle.
PLAYER_1] =
new Paddle
(this, Paddle.
PLAYER_1);
mPaddles
[Paddle.
PLAYER_2]=
new Paddle
(this, Paddle.
PLAYER_2);
mPaddleImpact =
new PaddleImpact
(this);
mBall =
new Ball
(this);
mBallTrail =
new BallTrail
(mBall
);
mBallWarp =
new BallWarp
(this);
mScreenFlash =
new ScreenFlash
(this);
mPowerUps =
new PowerUpLogic
(this);
mMosaicEffect =
new MosaicEffect
(this);
mWaveEffect =
new WaveEffect
(this);
mFlowerEffect =
new FlowerEffect
(this);
mCrystals =
new Crystals
(this);
mCrystalHitCounter =
new CrystalHitCounter
(this);
mPlayField.
init();
mPaddles
[Paddle.
PLAYER_1].
init();
mPaddles
[Paddle.
PLAYER_2].
init();
mBall.
init();
mPlayPhase = PHASE_GAMEPLAY
;
mScores
[0] =
0;
mScores
[1] =
0;
SharedPreferences myPrefs = GameStateManager.
getInstance().
getContext().
getSharedPreferences(GameConsts.
PREF_NAME,
Context.
MODE_PRIVATE);
boolean soundsEnabled = myPrefs.
getBoolean(GameConsts.
PREF_AUDIO_ENABLED,
true);
enableSound
(soundsEnabled
);
}
public void exit
()
{
mBall.
exit();
mPaddles
[Paddle.
PLAYER_1].
exit();
mPaddles
[Paddle.
PLAYER_2].
exit();
mPlayField.
exit();
mSounds.
exit();
mCrystalHitCounter =
null;
mCrystals =
null;
mWaveEffect =
null;
mMosaicEffect =
null;
mFlowerEffect =
null;
mSounds =
null;
mPauseScreen =
null;
mMenuBar =
null;
mBackground =
null;
mScreenFlash =
null;
mPlayField =
null;
mPaddles
[Paddle.
PLAYER_1] =
null;
mPaddles
[Paddle.
PLAYER_2] =
null;
mPaddleImpact =
null;
mBall =
null;
mBallTrail =
null;
mBallWarp =
null;
mPowerUps =
null;
mFont =
null;
}
public void update
(float deltaTime
)
{
mMenuBar.
update(deltaTime
);
mPauseScreen.
update(deltaTime
);
if (isPaused
())
return;
float factor = 1.0f
;
if (getPowerUpEffect
().
isSlowMoActive())
factor = GameConsts.
POWERUP_SLOWMO_FACTOR;
mBackground.
update(deltaTime
* factor
);
mPlayField.
update(deltaTime
* factor
);
mPaddles
[Paddle.
PLAYER_1].
update(deltaTime
* factor
);
mPaddles
[Paddle.
PLAYER_2].
update(deltaTime
* factor
);
mPaddleImpact.
update(deltaTime
* factor
);
mBallWarp.
update(deltaTime
* factor
);
mPowerUps.
update(deltaTime
* factor
);
mMosaicEffect.
update(deltaTime
* factor
);
mWaveEffect.
update(deltaTime
* factor
);
mFlowerEffect.
update(deltaTime
* factor
);
mCrystals.
update(deltaTime
* factor
);
mCrystalHitCounter.
update(deltaTime
* factor
);
if (mPlayPhase == PHASE_GAMEPLAY
)
{
mBall.
update(deltaTime
* factor
);
mBallTrail.
update(deltaTime
);
}
else
{
mBallTrail.
updateFade(deltaTime
);
}
mScoreDisplay.
update(deltaTime
);
if ((mPlayPhase == PHASE_SCORE
) && (mScoreDisplay.
isDone()))
{
// reset for next round
mPlayPhase = PHASE_GAMEPLAY
;
mBall.
reset((mScoreDisplay.
getLastPlayerScored() ==
0) ? 1 :
0);
mBallWarp.
reset();
playSound
(R.
raw.
newball);
mScreenFlash.
startFlash(GameConsts.
SCREENFLASH_BALLSPAWN_TIME);
}
mScreenFlash.
update(deltaTime
);
mFont.
update(deltaTime
);
}
public void render
()
{
mWaveEffect.
beginRenderToTexture();
renderGame
();
mWaveEffect.
endRenderToTexture();
mWaveEffect.
render();
//mWaveEffect.render();
if (getPowerUpEffect
().
isMosaicActive())
{
mMosaicEffect.
beginRenderToTexture();
//renderGame();
mWaveEffect.
render();
mMosaicEffect.
endRenderToTexture();
mMosaicEffect.
render();
}
mMenuBar.
render();
mFont.
render();
// render scores
renderScores
();
mScreenFlash.
render();
mPauseScreen.
render();
}
public void renderGame
()
{
// render in game objects
mBackground.
render();
mPowerUps.
render();
mPaddles
[Paddle.
PLAYER_1].
render();
mPaddles
[Paddle.
PLAYER_2].
render();
mPaddleImpact.
render();
mBallTrail.
render();
mBallWarp.
render();
if (mPlayPhase == PHASE_GAMEPLAY
)
{
mBall.
render();
}
mCrystals.
render();
mFlowerEffect.
render();
mCrystalHitCounter.
render();
mPlayField.
render();
mScoreDisplay.
render();
}
public void renderScores
()
{
float scale = 2.0f
* getDipToPixelScale
();
String score1 =
String.
format("%02d", mScores
[0]);
mFont.
drawText(score1, GameConsts.
SCOREBAR_MARGIN_X, getVirtualPlayFieldHeight
() + GameConsts.
SCOREBAR_MARGIN_Y, scale
);
String score2 =
String.
format("%02d", mScores
[1]);
mFont.
drawText(score2, GameConsts.
VIRTUAL_SCREEN_WIDTH - GameConsts.
SCOREBAR_MARGIN_X -
(score2.
length() * Font.
CHARACTER_SIZE * scale
), getVirtualPlayFieldHeight
() + GameConsts.
SCOREBAR_MARGIN_Y, scale
);
}
public void addReflectable
(IReflectable reflectable
)
{
mReflectables.
add(reflectable
);
}
public void reflect
(Ball ball,
float deltaTime
)
{
for (int i =
0; i
< mReflectables.
size(); i++
)
{
IReflectable item = mReflectables.
get(i
);
item.
reflect(ball, deltaTime
);
}
}
public void pause
(boolean doPause
)
{
mPauseScreen.
startShowing();
mPaused = doPause
;
}
public void enableSound
(boolean enable
)
{
mSoundEnabled = enable
;
mSounds.
setSoundsOn(mSoundEnabled
);
// store in prefs
SharedPreferences myPrefs = GameStateManager.
getInstance().
getContext().
getSharedPreferences(GameConsts.
PREF_NAME,
Context.
MODE_PRIVATE);
SharedPreferences.
Editor prefsEditor = myPrefs.
edit();
prefsEditor.
putBoolean(GameConsts.
PREF_AUDIO_ENABLED, enable
);
//prefsEditor.putBoolean(GameConsts.PREF_MUSIC_ENABLED), enable);
prefsEditor.
commit();
}
public void playSound
(int id
)
{
mSounds.
playSound(id
);
}
public boolean isPaused
() { return mPaused
; }
public boolean isSoundEnabled
() { return mSoundEnabled
; }
public Background getBackground
() { return mBackground
; }
public PlayField getPlayField
() { return mPlayField
; }
public Paddle getPaddle
(int index
) { return mPaddles
[index
]; }
public PaddleImpact getPaddleImpact
() { return mPaddleImpact
; }
public Ball getBall
() { return mBall
; }
public BallTrail getBallTrail
() { return mBallTrail
; }
public PowerUpLogic getPowerUpLogic
() { return mPowerUps
; }
public PowerUpEffect getPowerUpEffect
() { return mPowerUps.
getPowerUpEffect(); }
public Crystals getCrystals
() { return mCrystals
; }
public CrystalHitCounter getCrystalHitCounter
() { return mCrystalHitCounter
; }
public Font getFont
() { return mFont
; }
public Random getRandomizer
() { return mRandomizer
; }
public float getVirtualScoreBarHeight
() { return mVirtualScoreBarHeight
; }
public float getVirtualPlayFieldHeight
() { return (GameConsts.
VIRTUAL_SCREEN_HEIGHT - mVirtualScoreBarHeight
); }
public float getDipToPixelScale
() { return mDipToPixelScale
; }
public int getPlayPhase
() { return mPlayPhase
; }
public float dipToVirtual
(float dip
)
{
return (dip
* mDipToPixelScale + 0.5f
) * (GameConsts.
VIRTUAL_SCREEN_HEIGHT /
(float)GLUtil.
getInstance().
getHeight());
}
public float getRandomFloat
(float min,
float max
)
{
return min + mRandomizer.
nextFloat() * (max-min
);
}
public boolean isOutOfBoard
(float posX,
float posY
)
{
if ((posY
< GameConsts.
PLAYFIELD_BORDER_Y) ||
(posY
> getVirtualPlayFieldHeight
() - GameConsts.
PLAYFIELD_BORDER_Y))
return true;
if ((posX
< GameConsts.
PLAYFIELD_BORDER_X) ||
(posX
> GameConsts.
VIRTUAL_SCREEN_WIDTH - GameConsts.
PLAYFIELD_BORDER_X))
return true;
return false;
}
public boolean isOutOfBoardInner
(float posX,
float posY
)
{
if ((posY
< GameConsts.
PLAYFIELD_BORDER_Y) ||
(posY
> getVirtualPlayFieldHeight
() - GameConsts.
PLAYFIELD_BORDER_Y))
return true;
if ((posX
< GameConsts.
PADDLE_DISTANCE_FROM_EDGE_X + GameConsts.
PADDLE_WIDTH) ||
(posX
> GameConsts.
VIRTUAL_SCREEN_WIDTH - GameConsts.
PADDLE_DISTANCE_FROM_EDGE_X - GameConsts.
PADDLE_WIDTH))
return true;
return false;
}
}