Subversion Repositories AndroidProjects

Rev

Rev 101 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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