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