Subversion Repositories AndroidProjects

Rev

Rev 968 | Rev 971 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.burutaru.game.entities;

import com.gebauz.bauzoid.graphics.sprite.AtlasSprite;
import com.gebauz.bauzoid.graphics.sprite.AtlasSpriteFrame;
import com.gebauz.bauzoid.graphics.sprite.AtlasSpriteInstance;
import com.gebauz.bauzoid.math.MathUtil;
import com.gebauz.bauzoid.math.Matrix4;
import com.gebauz.bauzoid.math.collision.AABoundingBox;
import com.gebauz.bauzoid.math.collision.Shape;
import com.gebauz.bauzoid.math.collision.ShapeUtil;
import com.gebauz.burutaru.game.GameLogic;

public class BeamShots extends Entity
{

        // Constants========================================================================================
       
        public static final int MAX_BEAMSHOTS = 4;
        public static final int BEAMSHOT_DAMAGE = 10;
       
        public static final float BEAMSHOT_WIDTH = 180;
        public static final float BEAMSHOT_HEIGHT = 60;
        public static final float BEAMSHOT_WIDTH_MIN = 30;
        public static final float BEAMSHOT_HEIGHT_MIN = 10;
       
        public static final float BEAMSHOT_SPEED = 1000;
       
        public static final float BEAMSHOT_GROWTH_PERIOD = 0.15f;

        // Embedded Types===================================================================================
       
        public class BeamShotInstance extends Projectile
        {
                public AtlasSpriteInstance spriteInstance = null;
               
                public float lifeTime = 0.0f;

                public BeamShotInstance()
                {
                        super(BEAMSHOT_DAMAGE);
                       
                        spriteInstance = new AtlasSpriteInstance(getGraphics(), mBeamShotSprite, mBeamShotFrames, mBeamShotShape);
                       
                        spriteInstance.param.w = BEAMSHOT_WIDTH;
                        spriteInstance.param.h = BEAMSHOT_HEIGHT;
                        spriteInstance.param.pivotX = BEAMSHOT_WIDTH;
                        spriteInstance.param.pivotY = BEAMSHOT_HEIGHT/2;
                       
                        setAlive(false);
                }
               
                public void spawn(float x, float y)
                {
                        spriteInstance.param.x = x;
                        spriteInstance.param.y = y;
                       
                        lifeTime = 0.0f;
                       
                        setAlive(true);
                }
               
                public void update(float deltaTime)
                {
                        spriteInstance.param.x += deltaTime * BEAMSHOT_SPEED;

                        float w = MathUtil.clamp((lifeTime/BEAMSHOT_GROWTH_PERIOD) * BEAMSHOT_WIDTH, BEAMSHOT_WIDTH_MIN, BEAMSHOT_WIDTH);
                        float h = MathUtil.clamp((lifeTime/BEAMSHOT_GROWTH_PERIOD) * BEAMSHOT_HEIGHT, BEAMSHOT_HEIGHT_MIN, BEAMSHOT_HEIGHT);
                        spriteInstance.param.w = w;
                        spriteInstance.param.h = h;
                        spriteInstance.param.pivotX = w;
                        spriteInstance.param.pivotY = h/2;
                       
                        lifeTime += deltaTime;
                       
                        getGameLogic().checkProjectileHit(this);
                       
                        if (getGameLogic().isOutOfScreen(spriteInstance.param))
                                setAlive(false);
                }
               
                public void render()
                {
                        spriteInstance.renderFrame(0);
                }

                @Override
                public void processHit(Enemy enemy)
                {
                        // beam shots dont get destroyed on impact
                        enemy.hit(getDamage());                
                }

                @Override
                public AABoundingBox getBounds()
                {
                        return spriteInstance.param.getBoundingBox();
                }

                @Override
                public Shape getShape()
                {
                        return spriteInstance.getShape();
                }

                @Override
                public Matrix4 getShapeTransform()
                {
                        return spriteInstance.param.getTransform();
                }
               
        }

        // Fields===========================================================================================
       
        private AtlasSprite mBeamShotSprite = null;
        private AtlasSpriteFrame mBeamShotFrames[] = null;
        private Shape mBeamShotShape = null;
       
        private BeamShotInstance mBeamShots[] = new BeamShotInstance[MAX_BEAMSHOTS];

        // Methods==========================================================================================
       
        public BeamShots(GameLogic gameLogic)
        {
                super(gameLogic);
                mBeamShotSprite = new AtlasSprite(getGraphics(), "data/textures/beamshot.png", "data/textures/beamshot.txt");
        }
       
        @Override
        public void initAsync()
        {
                mBeamShotSprite.initAsync();
        }

        @Override
        public void init()
        {
                mBeamShotSprite.init();
                mBeamShotFrames = mBeamShotSprite.createSpriteInstances();
                mBeamShotShape = ShapeUtil.createShapeFromFile("data/textures/beamshot.shape");
               
                for (int i = 0; i < mBeamShots.length; i++)
                        mBeamShots[i] = new BeamShotInstance();
        }

        @Override
        public void exit()
        {
                mBeamShotShape = null;
                mBeamShotFrames = null;
               
                if (mBeamShotSprite != null)
                {
                        mBeamShotSprite.dispose();
                        mBeamShotSprite = null;
                }
        }

        @Override
        public void update(float deltaTime)
        {
                for (int i = 0; i < mBeamShots.length; i++)
                {
                        if (mBeamShots[i].isAlive())
                                mBeamShots[i].update(deltaTime);
                }
        }

        @Override
        public void render()
        {
                for (int i = 0; i < mBeamShots.length; i++)
                {
                        if (mBeamShots[i].isAlive())
                                mBeamShots[i].render();
                }
        }
       
        public void spawnShot(float x, float y)
        {
                for (int i = 0; i < MAX_BEAMSHOTS; i++)
                {
                        if (!mBeamShots[i].isAlive())
                        {
                                mBeamShots[i].spawn(x, y);
                                //mShotSound.play();
                                break;
                        }
                }
        }
       
        // Getters/Setters==================================================================================

}