Subversion Repositories AndroidProjects

Rev

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

package com.gebauz.burutaru.game.level;

import com.gebauz.bauzoid.graphics.sprite.Sprite;
import com.gebauz.bauzoid.graphics.sprite.SpriteInstance;
import com.gebauz.bauzoid.math.Matrix4;
import com.gebauz.bauzoid.math.Vector2;
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.entities.ICollidable;
import com.gebauz.burutaru.game.entities.Ship;


/** Static Level element with collision. */
public class StaticElement extends LevelObject implements ICollidable
{
        // Constants========================================================================================

        // Embedded Types===================================================================================

        // Fields===========================================================================================
       
        private String mTextureFile = null;
        private String mShapeFile = null;      
        private Vector2 mPosition = new Vector2(0, 0);
        private Vector2 mSize = new Vector2(0, 0);
       
        // TODO: maybe AtlasSprite?
        private Sprite mSprite = null;
        private Shape mShape = null;
        private SpriteInstance mSpriteInstance = null;

        // Methods==========================================================================================

        public StaticElement(Level parent, String textureFile, String shapeFile, Vector2 pos, Vector2 size)
        {
                super(parent);
               
                mTextureFile = textureFile;
                mShapeFile = shapeFile;
                mPosition = pos;
                mSize = size;
        }
       
        @Override
        public void initAsync()
        {
                if (mTextureFile != null)
                {
                        mSprite = new Sprite(getLevel().getGraphics(), mTextureFile);
                        mSprite.initAsync();
                }
        }
       
        @Override
        public void init()
        {
                if (mShapeFile != null)
                {
                        mShape = ShapeUtil.createShapeFromFile("data/textures/testL.shape");                   
                }
               
                if (mSprite != null)
                {
                        mSprite.init(mPosition.x, mPosition.y, mSize.x, mSize.y, 0, 0);
                        mSpriteInstance = new SpriteInstance(getLevel().getGraphics(), mSprite, mShape);
                        mSpriteInstance.param.x = mPosition.x;
                        mSpriteInstance.param.y = mPosition.y;
                        mSpriteInstance.param.w = mSize.x;
                        mSpriteInstance.param.h = mSize.y;
                        mSpriteInstance.param.pivotX = 0;
                        mSpriteInstance.param.pivotY = 0;
                }

        }
       
        @Override
        public void exit()
        {
                mSpriteInstance = null;
                mShape = null;
               
                if (mSprite != null)
                {
                        mSprite.dispose();
                        mSprite = null;
                }
        }

        @Override
        public void update(float deltaTime)
        {
                mSpriteInstance.param.x = mPosition.x;
                mSpriteInstance.param.y = mPosition.y;
                mSpriteInstance.param.w = mSize.x;
                mSpriteInstance.param.h = mSize.y;
                mSpriteInstance.param.pivotX = 0;
                mSpriteInstance.param.pivotY = 0;
        }
       
        @Override
        public void renderBackground()
        {
                if (mSpriteInstance != null)
                {
                        mSpriteInstance.render();
                }
        }
       
        @Override
        public void renderForeground()
        {

        }
       
        @Override
        public boolean checkHit(Shape shape, Matrix4 shapeTransform)
        {
                // shape is from bullet
                Matrix4 myTransform = mSpriteInstance.param.getTransform();
                Matrix4.multiply(myTransform, shapeTransform, myTransform.getInverse());

                return shape.intersects(mSpriteInstance.getShape(), myTransform);
        }
       
        @Override
        public boolean checkShipHit(Ship ship)
        {
                Matrix4 myTransform = mSpriteInstance.param.getTransform();
                Matrix4.multiply(myTransform, ship.getShapeTransform(), myTransform.getInverse());

                Vector2 displace = new Vector2(0, 0);
               
                if (ship.getShape().intersects(mSpriteInstance.getShape(), myTransform, displace))
                {
                        // ship intersects with shape, so find a displacement vector that moves the ship out
                       
                        // get the AABox of the ship shape
                        // move the AABox out of any potential collisions              
                       
                        return true;
                }              
               
                return false;
        }
       
        @Override
        public void hit(int damage)
        {
               
        }
       
        // Getters/Setters==================================================================================

        /** Get an axis-aligned bounding box for broad-phase collision detection. */
        @Override
        public AABoundingBox getBounds()
        {
                return mSpriteInstance.param.getBoundingBox();
        }
       
        @Override
        public float getX() { return mSpriteInstance.param.x; }
       
        @Override
        public float getY() { return mSpriteInstance.param.y; }

}