119 lines
3.1 KiB
Java
119 lines
3.1 KiB
Java
package ei.game.scene.weapons;
|
|
|
|
import ei.engine.effects.Particles;
|
|
import ei.engine.math.Vector2f;
|
|
import ei.engine.math.Vector2i;
|
|
import ei.engine.scene.Entity;
|
|
import ei.engine.scene.Node;
|
|
import ei.game.gamestate.InGameState;
|
|
import ei.game.scene.Map;
|
|
/**
|
|
* The weapon class.
|
|
* @author Jesper Lundin
|
|
*
|
|
*/
|
|
|
|
public abstract class Weapon {
|
|
private int range;
|
|
private int damage;
|
|
private Vector2i target;
|
|
private float velocity;
|
|
private float minVelocity;
|
|
private boolean hit;
|
|
private Particles part;
|
|
private Vector2f startPos;
|
|
|
|
|
|
/**
|
|
* Constructor for the class Weapon. Initializes the weapon.
|
|
* @param range
|
|
* @param startPos
|
|
* @param velocity
|
|
*/
|
|
public Weapon(Vector2f startPos) {
|
|
this.startPos = startPos;
|
|
this.minVelocity = 5;
|
|
this.hit = false;
|
|
part = getWeapon();
|
|
part.setLocation(startPos);
|
|
part.reset();
|
|
}
|
|
public void setRange(int range) {
|
|
this.range = range;
|
|
}
|
|
public void setVelocity(float velocity) {
|
|
this.velocity = velocity;
|
|
}
|
|
public void setDamage(int damage) {
|
|
this.damage = damage;
|
|
}
|
|
/**
|
|
* Launches the weapon type.
|
|
* @param target
|
|
*/
|
|
public void launch(Vector2i target) {
|
|
this.target = target;
|
|
|
|
|
|
}
|
|
|
|
/**
|
|
* updates the weapons movement and positions, also the behaviour of
|
|
* the weapon.
|
|
*
|
|
*/
|
|
public void update() {
|
|
Vector2f vect = Map.getPixelByPos(target.getX(), target.getY());
|
|
|
|
if(Math.sqrt(Math.pow((vect.getX()-startPos.getX()), 2) + Math.pow((vect.getY()-startPos.getY()), 2))<=range) {
|
|
float yVelocity = (Math.abs((vect.getY()-startPos.getY()) / velocity))/10;
|
|
float xVelocity = (Math.abs((vect.getX()-startPos.getX()) / velocity))/10;
|
|
System.out.println("xVel: "+xVelocity);
|
|
|
|
//System.out.println("xVel: "+Math.abs(part.getLocation().getX()-vect.getX()));
|
|
if(xVelocity < minVelocity && xVelocity < yVelocity) {
|
|
yVelocity = (yVelocity/xVelocity)*minVelocity;
|
|
xVelocity = minVelocity;
|
|
}
|
|
if(yVelocity < minVelocity && yVelocity < xVelocity) {
|
|
xVelocity = (xVelocity/yVelocity)*minVelocity;
|
|
yVelocity = minVelocity;
|
|
}
|
|
if(vect.getX() > part.getLocation().getX()) {
|
|
part.getLocation().add(xVelocity, 0f, 0f);
|
|
}
|
|
if(vect.getX() < part.getLocation().getX()) {
|
|
part.getLocation().add(-xVelocity, 0f, 0f);
|
|
}
|
|
if(vect.getY() > part.getLocation().getY()) {
|
|
part.getLocation().add(0f, yVelocity, 0f);
|
|
}
|
|
if(vect.getY() < part.getLocation().getY()) {
|
|
part.getLocation().add(0f, -yVelocity, 0f);
|
|
}
|
|
if(Math.abs(part.getLocation().getX()-vect.getX()) < 10 && Math.abs(part.getLocation().getY()-vect.getY()) < 10) {
|
|
part.regenerate = false;
|
|
if(!hit) {
|
|
InGameState.getMap().getPos(target.getX(), target.getY()).damaged(damage);
|
|
hit = true;
|
|
}
|
|
if(part.isDead()) {
|
|
WeaponHandler.getInstance().removeWeapon(this);
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
WeaponHandler.getInstance().removeWeapon(this);
|
|
}
|
|
}
|
|
/**
|
|
* Returns the node with the weapon.
|
|
* @return
|
|
*/
|
|
public Entity getNode() {
|
|
return part;
|
|
}
|
|
|
|
protected abstract Particles getWeapon();
|
|
|
|
}
|