Subversion Repositories AndroidProjects

Rev

Rev 976 | 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.AtlasSprite;
import com.gebauz.bauzoid.graphics.sprite.AtlasSpriteFrame;
import com.gebauz.bauzoid.graphics.sprite.AtlasSpriteInstance;
import com.gebauz.bauzoid.graphics.sprite.SpriteInstance;
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 ImpactExplosions extends Entity
{

        // Constants========================================================================================
       
        public static final int EXPLO_DAMAGE = 5;
        public static final float EXPLO_SIZE = 40;
       
        public static final float EXPLO_ANIM_DURATION = 0.5f;

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

                public Instance(float x, float y, float size)
                {
                        super(EXPLO_DAMAGE);
                       
                        spriteInstance = new AtlasSpriteInstance(getGraphics(), mExploSprite, mExploFrames, mExploShape);
                       
                        spriteInstance.param.x = x;
                        spriteInstance.param.y = y;
                        spriteInstance.param.w = size;
                        spriteInstance.param.h = size;
                        spriteInstance.param.centerPivot();                    
                       
                        lifeTime = 0.0f;
                }
               
                public void update(float deltaTime)
                {
                        spriteInstance.param.x += getGameLogic().getGlobalScrollX() * deltaTime;
                        spriteInstance.param.y += getGameLogic().getGlobalScrollY() * deltaTime;
                       
                        lifeTime += deltaTime;
                       
                        getGameLogic().checkProjectileHit(this);
                       
                        if (lifeTime > EXPLO_ANIM_DURATION)
                        {
                                setAlive(false);                               
                        }
                }
               
                public void render()
                {
                        float t = (lifeTime % EXPLO_ANIM_DURATION) / EXPLO_ANIM_DURATION;
                        int frame = MathUtil.clamp((int)(t * (float)mExploFrames.length), 0, mExploFrames.length-1);
                       
                        spriteInstance.renderFrame(frame);
                }

                @Override
                public void processHit(ICollidable hitObject)
                {
                        // spawn impact effect
                        hitObject.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 mExploSprite = null;
        private AtlasSpriteFrame mExploFrames[] = null;
        private Shape mExploShape = null;
       
        private Vector<Instance> mExplosions = new Vector<Instance>();
       
        private Sound mImpactSound = null;

        // Methods==========================================================================================
       
        public ImpactExplosions(GameLogic gameLogic)
        {
                super(gameLogic);
                mExploSprite = new AtlasSprite(getGraphics(), "data/textures/explosion.png", "data/textures/explosion.txt");
        }
       
        @Override
        public void initAsync()
        {
                mExploSprite.initAsync();
        }
       
        @Override
        public void init()
        {
                mExploSprite.init();
                mExploFrames = mExploSprite.createSpriteInstances();
                mExploShape = ShapeUtil.createShapeFromFile("data/textures/explosion.shape");
               
                mImpactSound = getAudio().newManagedSound("data/sounds/impact_explo.wav");
        }

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

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

        @Override
        public void render()
        {
                for (int i = 0; i < mExplosions.size(); i++)
                {
                        mExplosions.get(i).render();
                }
        }
       
        public void spawn(float x, float y, float size)
        {
                mExplosions.add(new Instance(x, y, size));
                mImpactSound.play();
        }

        // Getters/Setters==================================================================================

}