/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.fourthfloorproductions.TowerDefense.Entity;
import com.fourthfloorproductions.TowerDefense.Engine.Frame;
import com.fourthfloorproductions.TowerDefense.Engine.FrameImage;
import com.fourthfloorproductions.TowerDefense.Engine.Laufllienien;
import com.fourthfloorproductions.TowerDefense.Engine.Weglinie;
import com.fourthfloorproductions.TowerDefense.Game;
import java.util.ArrayList;
import org.newdawn.slick.geom.Point;
import org.newdawn.slick.geom.Vector2f;
/**
*
* @author Christoph
*/
public abstract class Entity {
private int live;
private int damage;
private Vector2f pos;
private Vector2f speed;
private int x,y;
private FrameImage image;
private Laufllienien lauflienien;
private int aktWeg;
private boolean Living = true;
float lastX, lastY;
float rx, ry;
public Entity(ArrayList<Weglinie> weglinie)
{
this.image = new FrameImage("src/res/Downloads.png", 60,60);
this.aktWeg = 0;
this.lauflienien = new Laufllienien(weglinie);
this.x = lauflienien.getWege().get(0).fromX;
this.y = lauflienien.getWege().get(0).fromY;
this.pos = new Vector2f(x,y);
this.speed = new Vector2f(lauflienien.getWege().get(aktWeg).toX,lauflienien.getWege().get(aktWeg).toY);
this.speed.setTheta(getAngle(new Point(lauflienien.getWege().get(aktWeg).toX, lauflienien.getWege().get(aktWeg).toY)));
}
public void draw(Frame f)
{
if(Living)
{
f.drawImage(image,pos.getX()-30,pos.getY()-30);
rx=pos.copy().getX()-30;
ry=pos.copy().getY()-30;
f.drawLine(pos.getX(), pos.getY(), pos.getX()+30, pos.getY()+30);
}
}
public final float getAngle(Point target) {
float angle = (float) Math.toDegrees(Math.atan2(target.getY() - y, target.getX() - x));
if(angle < 0){
angle += 360;
}
return angle;
}
public boolean isFinal()
{
boolean f = false;
int finalPosX = lauflienien.getWege().get(aktWeg).toX;
int finalPosY = lauflienien.getWege().get(aktWeg).toY;
if((finalPosX < lastX && finalPosX > pos.getX()) || (finalPosX > lastX && finalPosX < pos.getX()))
{
if((finalPosY < lastY && finalPosY > pos.getY()) || (finalPosY > lastY && finalPosY < pos.getY()))
{
f = true;
}
}
return f;
}
public void update(int delta)
{
if(isFinal())
{
if(aktWeg == lauflienien.getWege().size()-1)
{
Game.live -= damage;
Living = false;
}else{
aktWeg += 1;
this.x = lauflienien.getWege().get(aktWeg).fromX;
this.y = lauflienien.getWege().get(aktWeg).fromY;
this.pos = new Vector2f(x,y);
this.speed = new Vector2f(lauflienien.getWege().get(aktWeg).toX,lauflienien.getWege().get(aktWeg).toY);
this.speed.setTheta(getAngle(new Point(lauflienien.getWege().get(aktWeg).toX, lauflienien.getWege().get(aktWeg).toY)));
}
}else{
lastX = pos.getX();
lastY = pos.getY();
Vector2f realSpeed = speed;
realSpeed.normalise();
realSpeed.scale(0.1f*delta);
pos.add(realSpeed);
}
}
public float getX()
{
return this.rx;
}
public float getY()
{
return this.ry;
}
public Vector2f getVector()
{
return this.pos;
}
}