package dwarf.engine.core;
import java.util.Objects;
import dwarf.GameObject;
import dwarf.util.Point2D;
import dwarf.util.Vector2;
import static dwarf.util.Point2D.ZERO;
/**
* @author Matthew 'siD' Van der Bijl
*
* @see dwarf.GameObject
* @see java.lang.Object
* @see java.lang.Cloneable
*/
public class Camera extends java.lang.Object implements Cloneable, GameObject {
/**
* the default view port.
*/
public static Camera mainCamera = new Camera();
public static void setMainCamera(Camera mainCamera) {
Camera.mainCamera = mainCamera;
}
public static Camera getMainCamera() {
return Camera.mainCamera;
}
/**
* the location of the camera.
*/
private Point2D position;
/**
* Default constructor.
*/
public Camera() {
super();
this.position = ZERO;
}
public Camera(Point2D position) {
super();
this.position = position;
}
public Camera(Camera camera) {
super();
this.position = camera.getPosition();
}
/**
* Callback function used to update the state of the game every frame.
*/
@Override
public void update() {
}
/**
* Callback function used to update the state of the game every frame.
*/
@Override
public void render() {
}
public Point2D getPosition() {
return this.position;
}
public void setPosition(Point2D position) {
this.position = position;
}
public void translate(float deltaX, float deltaY) {
this.position.translateX(deltaX);
this.position.translateY(deltaY);
}
public void translateX(float deltaX) {
this.position.translateX(deltaX);
}
public void translateY(float deltaY) {
this.position.translateY(deltaY);
}
@Override
public String toString() {
return "Camera = {"
+ "position: " + getPosition() + ", "
+ "super: " + super.toString()
+ "}";
}
@Override
public int hashCode() {
int hash = 3;
hash = 47 * hash + Objects.hashCode(getPosition());
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
} else if (getClass() != obj.getClass()) {
return false;
}
final Camera other = (Camera) obj;
if (!Objects.equals(this.getPosition(), other.getPosition())) {
return false;
}
return true;
}
public void gotoPos(Vector2 destination, float speed) {
if (this.getPosition().getX() > destination.getX()) {
this.getPosition().translateX(-speed);
}
if (this.getPosition().getX() < destination.getX()) {
this.getPosition().translateX(speed);
}
if (this.getPosition().getY() < destination.getY()) {
this.getPosition().translateY(speed);
}
if (this.getPosition().getY() > destination.getY()) {
this.getPosition().translateY(-speed);
}
}
public void gotoPos(Vector2 destination) {
this.gotoPos(destination, 1);
}
public void gotoPos(double xPos, double yPos) {
this.gotoPos(new Vector2(xPos, yPos), 1);
}
public void gotoPos(double xPos, double yPos, float speed) {
this.gotoPos(new Vector2(xPos, yPos), speed);
}
public Vector2 getCenterPosition() {
return new Vector2(
this.getPosition().getX() + Window.getWidth() / 2,
this.getPosition().getY() + Window.getHeight() / 2
);
}
@Override
public Camera clone() throws CloneNotSupportedException {
return new Camera(this);
}
}