Subversion Repositories AndroidProjects

Rev

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

package com.gebauz.burutaru.game.entities;

import java.util.Vector;

import com.badlogic.gdx.audio.Sound;
import com.gebauz.bauzoid.graphics.sprite.Sprite;
import com.gebauz.bauzoid.graphics.sprite.SpriteInstance;
import com.gebauz.bauzoid.math.MathUtil;
import com.gebauz.bauzoid.math.RandomChooser;
import com.gebauz.burutaru.game.GameLogic;

public class PowerUps extends Entity
{

        // Constants========================================================================================
       
        public static final int POWERUP_SIZE = 40;
        public static final int POWERUP_ICON_SIZE = POWERUP_SIZE/2;
       
        public static final float ANIM_FRAME_DURATION = 0.15f;

        public static final int ICON_FRAME_START = 4;
       
        public static final float POWERUP_RADIUS_SQR = (POWERUP_SIZE*POWERUP_SIZE);
       
        // Embedded Types===================================================================================
       
        public enum Type
        {
                SPEED_UP,
                MISSILE,
                BOMB,
                BEAM_SHOT,
                SPREAD_SHOT,
                NAPALM_SHOT,           
                FORCE_FIELD                            
        }
       
        public class Instance
        {
                private Type mType;
               
                public boolean isAlive = false;
               
                private SpriteInstance mSpriteInstance = null;
                private SpriteInstance mIconSpriteInstance = null;
               
                public Instance(float x, float y, Type type)
                {
                        isAlive = true;
                        mType = type;
                       
                        // TODO: maybe it would be useful to be able to select a RANGE of regions for SpriteInstances
                        mSpriteInstance = mSprite.createSpriteInstanceForRange(0, ICON_FRAME_START);
                        mSpriteInstance.transform.x = x;
                        mSpriteInstance.transform.y = y;
                        mSpriteInstance.transform.w = POWERUP_SIZE;
                        mSpriteInstance.transform.h = POWERUP_SIZE;
                        mSpriteInstance.transform.centerPivot();
                       
                        mIconSpriteInstance = mSprite.createSpriteInstance(ICON_FRAME_START + mType.ordinal());
                        mIconSpriteInstance.transform.x = x;
                        mIconSpriteInstance.transform.y = y;
                        mIconSpriteInstance.transform.w = POWERUP_ICON_SIZE;
                        mIconSpriteInstance.transform.h = POWERUP_ICON_SIZE;
                        mIconSpriteInstance.transform.centerPivot();
                }
               
                public void update(float deltaTime)
                {
                        mSpriteInstance.transform.x -= getGameLogic().getLevel().getCurrentScrollVelocity().x;
                        mSpriteInstance.transform.y -= getGameLogic().getLevel().getCurrentScrollVelocity().y;
                        mIconSpriteInstance.transform.x = mSpriteInstance.transform.x;
                        mIconSpriteInstance.transform.y = mSpriteInstance.transform.y;
                       
                        // check if ship picked up
                        float shipX = getGameLogic().getShip().getPositionX();
                        float shipY = getGameLogic().getShip().getPositionY();
                       
                        //x += getGameLogic().getGlobalScrollX() * deltaTime;
                        //y += getGameLogic().getGlobalScrollY() * deltaTime;
                       
                        float diffX = mSpriteInstance.transform.x - shipX;
                        float diffY = mSpriteInstance.transform.y - shipY;
                       
                        float distanceSqr = diffX*diffX + diffY*diffY;
                       
                        if (distanceSqr < (Ship.SHIP_RADIUS_SQR + POWERUP_ICON_SIZE))
                        {
                                // picked up
                                pickPowerUp(mType);
                                isAlive = false;
                        }
                }
               
                public void render()
                {
                        final float totalDuration = ANIM_FRAME_DURATION * mSpriteInstance.getNumFrames();
                        final float t = MathUtil.clamp((getGame().getTime() % totalDuration) / totalDuration, 0, 1);
                        final int frame = (int)(t * mSpriteInstance.getNumFrames());
                       
                        mSpriteInstance.setCurrentFrame(frame);
                        mSpriteInstance.render();
                                               
                        mIconSpriteInstance.render();
                }
               
                public Type getType()
                {
                        return mType;
                }
        }

       
        // Fields===========================================================================================
       
        private Sprite mSprite = null;
       
        private Vector<Instance> mPowerUps = new Vector<Instance>();
       
        private Sound mPickUpSfx = null;

        // Methods==========================================================================================
       
        public PowerUps(GameLogic gameLogic)
        {
                super(gameLogic);
                mSprite = new Sprite(getGraphics(), "data/textures/powerup.png", "data/textures/powerup.txt");
        }

        @Override
        public void initAsync()
        {
                mSprite.initAsync();
        }

        @Override
        public void init()
        {
                mSprite.init();
               
                mPickUpSfx = getAudio().newManagedSound("data/sounds/pickup.wav");
        }

        @Override
        public void exit()
        {
                mSprite.dispose();
               
                if (mPickUpSfx != null)
                {
                        getAudio().removeManagedSound(mPickUpSfx);
                        mPickUpSfx = null;
                }
        }

        @Override
        public void update(float deltaTime)
        {
                int i = 0;
                while (i < mPowerUps.size())
                {
                        Instance powerup = mPowerUps.get(i);
                        powerup.update(deltaTime);
                        if (!powerup.isAlive)
                        {
                                mPowerUps.remove(i);
                                continue;
                        }
                        ++i;
                }
        }

        @Override
        public void render()
        {
                for (int i = 0; i < mPowerUps.size(); i++)
                {
                        mPowerUps.get(i).render();
                }
        }
       
        public void randomSpawn(float x, float y)
        {
                RandomChooser r = new RandomChooser();
                r.addEntry(Type.SPEED_UP.ordinal(), 5);
                r.addEntry(Type.MISSILE.ordinal(), 5);
                r.addEntry(Type.BOMB.ordinal(), 5);
                r.addEntry(Type.BEAM_SHOT.ordinal(), 5);
                /*
                r.addEntry(Type.FORCE_FIELD.ordinal(), 5);
                r.addEntry(Type.THREE_WAY_SHOT.ordinal(), 5);
                r.addEntry(Type.NAPALM_SHOT.ordinal(), 5);
                */

               
                spawn(x, y, Type.values()[r.chooseEntry()]);
        }
       
        public void spawn(float x, float y, Type type)
        {
                mPowerUps.add(new Instance(x, y, type));
        }
       
        public void pickPowerUp(Type type)
        {
                switch (type)
                {
                case SPEED_UP:
                        getGameLogic().getShip().boostEngine();
                        getGameLogic().getShipParameters().upgradeSpeed();
                        break;
                case MISSILE:
                        mPickUpSfx.play(0.5f);
                        getGameLogic().getShipParameters().upgradeMissile();
                        break;
                case BOMB:
                        mPickUpSfx.play(0.5f);
                        getGameLogic().getShipParameters().upgradeBomb();
                        break;
                case BEAM_SHOT:
                        mPickUpSfx.play(0.5f);
                        getGameLogic().getShipParameters().activateBeamShot();
                        break;
                case SPREAD_SHOT:
                        mPickUpSfx.play(0.5f);
                        break;
                case NAPALM_SHOT:
                        mPickUpSfx.play(0.5f);
                        break;
                case FORCE_FIELD:
                        mPickUpSfx.play(0.5f);
                        break;
                }
        }
       
       
        // Getters/Setters==================================================================================

}