package ast.level;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.lwjgl.input.Keyboard;
import org.lwjgl.util.vector.Vector3f;
import static org.lwjgl.opengl.GL11.*;
import ast.AssetStore;
import ast.Game;
import ast.StateManager;
import ast.StateManager.State;
import ast.effect.Light;
import ast.entity.*;
import ast.ui.ActionBar;
import ast.ui.UI;
public class Level {
Player player;
public List<Entity> asteroids;
public List<Bullet> bullets;
private List<Entity> removeList = new ArrayList<Entity>();
private List<Entity> addList = new ArrayList<Entity>();
private ActionBar actionBar = new ActionBar();
private Light light;
private Game game;
public float xMin = -6, xMax = 6;
public float yMin= -4.5f, yMax = 4.5f;
private Vector3f playerSpawn;
/**
* Initialize level
* @param game
*/
public void init(Game game){
playerSpawn = new Vector3f(0,0,-10);
asteroids = new ArrayList<Entity>();
bullets = new ArrayList<Bullet>();
player = new Player(this, AssetStore.getModel("Player"));
player.setPos(playerSpawn);
light = new Light();
light.init(new Vector3f(5,5,0));
addRandomAsteroids(8);
addAddList();
actionBar.init(player);
this.game = game;
}
/**
* Update level
* @param delta time since last update(ms)
*/
public void update(int delta){
deleteRemoveList();
addAddList();
//light.update();
for (Entity entity: asteroids){
entity.update(delta);
}
for (Bullet bullet: bullets){
bullet.update(delta);
}
player.update(delta);
actionBar.update(delta);
if(asteroids.size() <= 0){
game.reset();
}
if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
StateManager.setState(State.MainMenu);
}
}
/**
* Render level
*/
public void render(){
drawBackground();
for (Entity entity: asteroids){
entity.render();
}
for (Bullet bullet: bullets){
bullet.render();
}
player.render();
UI.enable2D();
actionBar.render();
UI.disable2D();
}
/**
* Add bullet to level
* @param b bullet
*/
public void addBullet(Bullet b){
bullets.add(b);
}
/**
* Add asteroids with random pos/speed/rotation
* @param num int number of asteroids
*/
public void addRandomAsteroids(int num){
for(int i = 0; i<= num-1; i++){
Asteroid ast = new Asteroid(this, AssetStore.getModel("Asteroid"), 2);
ast.randomSpeed();
ast.setPos(randomSpawn());
while(ast.collidesWith(player)){
ast.setPos(randomSpawn());
}
addEntity(ast);
}
}
/**
* Add new asteroid
* @param pos Vector3f position on screen
* @param size float
*/
public void addAsteroid(Vector3f pos,float size){
Asteroid ast;
ast = new Asteroid(this, AssetStore.getModel("Asteroid"), size);
ast.setPos(pos);
ast.randomSpeed();
addEntity(ast);
}
/**
* Remove Entity from level
* @param e Entity
*/
public void removeEntity(Entity e){
removeList.add(e);
}
/**
* Add entity to level
* @param e Entity
*/
private void addEntity(Entity e){
addList.add(e);
}
/**
* Add entities in list
*/
private void addAddList(){
for(Entity e: addList){
if(e instanceof Asteroid){
asteroids.add(e);
}else{
}
}
addList.clear();
}
/**
* Remove entities in list
*/
private void deleteRemoveList(){
for(Entity e: removeList){
if(e instanceof Bullet){
bullets.remove(e);
}else{
asteroids.remove(e);
}
}
removeList.clear();
}
/**
* Render background image
*/
private void drawBackground(){
UI.enable2D();
float xMax = 1.6f;
//glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, AssetStore.getTexture("Background").getTextureID());
glBegin( GL_QUADS );
//bottom left
glTexCoord2f(0,0);
glVertex2f(0, 0);
//bottom right
glTexCoord2f(1,0);
glVertex2f(1*xMax, 0);
//top right
glTexCoord2f(1,1);
glVertex2f(1*xMax, 1);
//top left
glTexCoord2f(0,1);
glVertex2f(0, 1);
glEnd();
UI.disable2D();
}
/**
*
* @return Random Vector3f on screen
*/
private Vector3f randomSpawn(){
float xLimit = 4, yLimit = 4;
Random rand = new Random();
float xPos = (rand.nextFloat()-0.5f)*2*xLimit;
float yPos = (rand.nextFloat()-0.5f)*2*yLimit;
return new Vector3f(xPos, yPos,-10);
}
}