package com.gebauz.burutaru.game.entities.enemies;
import java.util.Vector;
import com.gebauz.burutaru.game.GameLogic;
import com.gebauz.burutaru.game.entities.Entity;
/** Implementation of an enemy type. */
public abstract class Enemy
extends Entity
{
// Constants========================================================================================
// Embedded Types===================================================================================
public static class SearchResult
{
public EnemyInstance enemyInstance =
null;
public float distanceSqr =
Float.
MAX_VALUE;
void reset
()
{
enemyInstance =
null;
distanceSqr =
Float.
MAX_VALUE;
}
}
// Fields===========================================================================================
protected Vector<EnemyInstance
> mEnemies =
new Vector<EnemyInstance
>();
protected SearchResult mSearchResult =
new SearchResult();
// Methods==========================================================================================
public Enemy
(GameLogic gameLogic
)
{
super(gameLogic
);
}
@
Override
public void initAsync
()
{
}
@
Override
/** Call this after the derived class has set up everything (sprites, shapes, etc.)!. */
public void init
()
{
for (int i =
0; i
< mEnemies.
size(); i++
)
{
mEnemies.
get(i
).
init();
}
}
@
Override
public void exit
()
{
for (int i =
0; i
< mEnemies.
size(); i++
)
{
mEnemies.
get(i
).
exit();
}
}
@
Override
public void update
(float deltaTime
)
{
for (int i =
0; i
< mEnemies.
size(); i++
)
{
EnemyInstance e = mEnemies.
get(i
);
// check for spawn event
//float lt = getLevelTimer();
/*if ((lt <= e.spawnAt) && ((lt + deltaTime) > e.spawnAt))
e.spawn();*/
boolean hasSpawned = e.
hasSpawned;
if (!hasSpawned
&& !getGameLogic
().
isOutOfScreen(e.
getShape().
transform) && !e.
hasAlreadySpawned)
e.
spawn();
if (e.
hasSpawned)
e.
update(deltaTime
);
else
e.
updateScroll(deltaTime
);
if (hasSpawned
&& !e.
hasSpawned)
{
getGame
().
log("Enemy unspawned: " + e.
name);
}
}
}
@
Override
public void render
()
{
for (int i =
0; i
< mEnemies.
size(); i++
)
{
EnemyInstance e = mEnemies.
get(i
);
if (e.
hasSpawned)
e.
render();
}
}
public abstract EnemyInstance newInstance
(String name
);
public SearchResult getNearestEnemy
(float x,
float y,
float closestDistanceSqr
)
{
mSearchResult.
reset();
for (int i =
0; i
< mEnemies.
size(); i++
)
{
EnemyInstance e = mEnemies.
get(i
);
if (e.
isAlive())
{
float dx = e.
getShape().
transform.
x - x
;
float dy = e.
getShape().
transform.
y - y
;
float distanceSqr = dx
*dx + dy
*dy
;
if (distanceSqr
< mSearchResult.
distanceSqr)
{
mSearchResult.
enemyInstance = e
;
mSearchResult.
distanceSqr = distanceSqr
;
}
}
}
return mSearchResult
;
}
public void getEnemiesInRange
(Vector<EnemyInstance
> enemyList,
float x,
float y,
float radiusSqr
)
{
for (int i =
0; i
< mEnemies.
size(); i++
)
{
EnemyInstance e = mEnemies.
get(i
);
if (e.
isAlive())
{
if (e.
getShape().
intersectsCircleSqr(x, y, radiusSqr
))
enemyList.
add(e
);
}
}
}
// Getters/Setters==================================================================================
public final void addInstance
(EnemyInstance instance
)
{
mEnemies.
add(instance
);
}
public final EnemyInstance getInstance
(int i
)
{
return mEnemies.
get(i
);
}
public final int getNumInstances
()
{
return mEnemies.
size();
}
}