package com.gebauz.burutaru.game.entities;
import java.util.Vector;
import com.badlogic.gdx.audio.Sound;
import com.gebauz.bauzoid.graphics.sprite.Sprite;
import com.gebauz.bauzoid.graphics.sprite.SpriteInstance;
import com.gebauz.bauzoid.math.MathUtil;
import com.gebauz.bauzoid.math.RandomChooser;
import com.gebauz.burutaru.game.GameLogic;
public class PowerUps
extends Entity
{
// Constants========================================================================================
public static final int POWERUP_SIZE =
40;
public static final int POWERUP_ICON_SIZE = POWERUP_SIZE/
2;
public static final float ANIM_FRAME_DURATION = 0.15f
;
public static final int ICON_FRAME_START =
4;
public static final float POWERUP_RADIUS_SQR =
(POWERUP_SIZE
*POWERUP_SIZE
);
// Embedded Types===================================================================================
public enum Type
{
SPEED_UP,
MISSILE,
BOMB,
BEAM_SHOT,
SPREAD_SHOT,
NAPALM_SHOT,
FORCE_FIELD
}
public class Instance
{
private Type mType
;
public boolean isAlive =
false;
private SpriteInstance mSpriteInstance =
null;
private SpriteInstance mIconSpriteInstance =
null;
public Instance
(float x,
float y,
Type type
)
{
isAlive =
true;
mType = type
;
// TODO: maybe it would be useful to be able to select a RANGE of regions for SpriteInstances
mSpriteInstance = mSprite.
createSpriteInstanceForRange(0, ICON_FRAME_START
);
mSpriteInstance.
transform.
x = x
;
mSpriteInstance.
transform.
y = y
;
mSpriteInstance.
transform.
w = POWERUP_SIZE
;
mSpriteInstance.
transform.
h = POWERUP_SIZE
;
mSpriteInstance.
transform.
centerPivot();
mIconSpriteInstance = mSprite.
createSpriteInstance(ICON_FRAME_START + mType.
ordinal());
mIconSpriteInstance.
transform.
x = x
;
mIconSpriteInstance.
transform.
y = y
;
mIconSpriteInstance.
transform.
w = POWERUP_ICON_SIZE
;
mIconSpriteInstance.
transform.
h = POWERUP_ICON_SIZE
;
mIconSpriteInstance.
transform.
centerPivot();
}
public void update
(float deltaTime
)
{
mSpriteInstance.
transform.
x -= getGameLogic
().
getLevel().
getCurrentScrollVelocity().
x;
mSpriteInstance.
transform.
y -= getGameLogic
().
getLevel().
getCurrentScrollVelocity().
y;
mIconSpriteInstance.
transform.
x = mSpriteInstance.
transform.
x;
mIconSpriteInstance.
transform.
y = mSpriteInstance.
transform.
y;
// check if ship picked up
float shipX = getGameLogic
().
getShip().
getPositionX();
float shipY = getGameLogic
().
getShip().
getPositionY();
//x += getGameLogic().getGlobalScrollX() * deltaTime;
//y += getGameLogic().getGlobalScrollY() * deltaTime;
float diffX = mSpriteInstance.
transform.
x - shipX
;
float diffY = mSpriteInstance.
transform.
y - shipY
;
float distanceSqr = diffX
*diffX + diffY
*diffY
;
if (distanceSqr
< (Ship.
SHIP_RADIUS_SQR + POWERUP_ICON_SIZE
))
{
// picked up
pickPowerUp
(mType
);
isAlive =
false;
}
}
public void render
()
{
final float totalDuration = ANIM_FRAME_DURATION
* mSpriteInstance.
getNumFrames();
final float t = MathUtil.
clamp((getGame
().
getTime() % totalDuration
) / totalDuration,
0,
1);
final int frame =
(int)(t
* mSpriteInstance.
getNumFrames());
mSpriteInstance.
setCurrentFrame(frame
);
mSpriteInstance.
render();
mIconSpriteInstance.
render();
}
public Type getType
()
{
return mType
;
}
}
// Fields===========================================================================================
private Sprite mSprite =
null;
private Vector<Instance
> mPowerUps =
new Vector<Instance
>();
private Sound mPickUpSfx =
null;
// Methods==========================================================================================
public PowerUps
(GameLogic gameLogic
)
{
super(gameLogic
);
mSprite =
new Sprite
(getGraphics
(),
"data/textures/powerup.png",
"data/textures/powerup.txt");
}
@
Override
public void initAsync
()
{
mSprite.
initAsync();
}
@
Override
public void init
()
{
mSprite.
init();
}
@
Override
public void exit
()
{
mSprite.
dispose();
}
@
Override
public void update
(float deltaTime
)
{
int i =
0;
while (i
< mPowerUps.
size())
{
Instance powerup = mPowerUps.
get(i
);
powerup.
update(deltaTime
);
if (!powerup.
isAlive)
{
mPowerUps.
remove(i
);
continue;
}
++i
;
}
}
@
Override
public void render
()
{
for (int i =
0; i
< mPowerUps.
size(); i++
)
{
mPowerUps.
get(i
).
render();
}
}
public void randomSpawn
(float x,
float y
)
{
RandomChooser r =
new RandomChooser
();
r.
addEntry(Type.
SPEED_UP.
ordinal(),
5);
r.
addEntry(Type.
MISSILE.
ordinal(),
5);
r.
addEntry(Type.
BOMB.
ordinal(),
5);
r.
addEntry(Type.
BEAM_SHOT.
ordinal(),
5);
/*
r.addEntry(Type.FORCE_FIELD.ordinal(), 5);
r.addEntry(Type.THREE_WAY_SHOT.ordinal(), 5);
r.addEntry(Type.NAPALM_SHOT.ordinal(), 5);
*/
spawn
(x, y,
Type.
values()[r.
chooseEntry()]);
}
public void spawn
(float x,
float y,
Type type
)
{
mPowerUps.
add(new Instance
(x, y, type
));
}
public void pickPowerUp
(Type type
)
{
switch (type
)
{
case SPEED_UP:
getGameLogic
().
getShip().
boostEngine();
getGameLogic
().
getShipParameters().
upgradeSpeed();
break;
case MISSILE:
//mPickUpSfx.play(0.5f);
getGameLogic
().
getShipParameters().
upgradeMissile();
break;
case BOMB:
//mPickUpSfx.play(0.5f);
getGameLogic
().
getShipParameters().
upgradeBomb();
break;
case BEAM_SHOT:
//mPickUpSfx.play(0.5f);
getGameLogic
().
getShipParameters().
activateBeamShot();
break;
case SPREAD_SHOT:
//mPickUpSfx.play(0.5f);
break;
case NAPALM_SHOT:
//mPickUpSfx.play(0.5f);
break;
case FORCE_FIELD:
//mPickUpSfx.play(0.5f);
break;
}
}
// Getters/Setters==================================================================================
}