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