package com.brackeen.javagamebook.graphics;

import java.awt.Image;

public class Sprite {

    protected Animation anim;
    // pozycja (piksele)
    private float x;
    private float y;
    // prędkość (piksele na milisekundę)
    private float dx;
    private float dy;

    /**
        Tworzy nowy obiekt Sprite z właściwym obiektem Animation.
    */
    public Sprite(Animation anim) {
        this.anim = anim;
    }

    /**
        Aktualizuje obiekt Animation dla bieżącego Sprite oraz swoja pozycję
        na podstawie prędkości.
    */
    public void update(long elapsedTime) {
        x += dx * elapsedTime;
        y += dy * elapsedTime;
        if (anim != null) {
            anim.update(elapsedTime);
        }
    }

    /**
        Zwraca współrzędną x bieżącego obiektu Sprite
    */
    public float getX() {
        return x;
    }

    /**
        Zwraca współrzędną x bieżącego obiektu Sprite
    */
    public float getY() {
        return y;
    }

    /**
        Ustawia współrzędną x bieżącego obiektu Sprite.
    */
    public void setX(float x) {
        this.x = x;
    }

    /**
        Ustawia współrzędną y bieżącego obiektu Sprite.
    */
    public void setY(float y) {
        this.y = y;
    }

    /**
        Zwraca szerokość bieżącego obiektu Sprite, korzystając z rozmiaru
        bieżącego rysunku.
    */
    public int getWidth() {
        return anim.getImage().getWidth(null);
    }

    /**
        Zwraca wysokość bieżącego obiektu Sprite, korzystając z rozmiaru
        bieżącego rysunku.
    */
    public int getHeight() {
        return anim.getImage().getHeight(null);
    }

    /**
        Zwraca prędkość w poziomie bieżącego obiektu Sprite w pikselach
        na milisekundę.
    */
    public float getVelocityX() {
        return dx;
    }

    /**
        Zwraca prędkość w pionie bieżącego obiektu Sprite w pikselach
        na milisekundę.
    */
    public float getVelocityY() {
        return dy;
    }

    /**
        Ustawia prędkość w poziomie bieżącego obiektu Sprite w pikselach
        na milisekundę.
    */
    public void setVelocityX(float dx) {
        this.dx = dx;
    }

    /**
        Ustawia prędkość w pionie bieżącego obiektu Sprite w pikselach
        na milisekundę.
    */
    public void setVelocityY(float dy) {
        this.dy = dy;
    }

    /**
        Zwraca bieżący rysunek dla tego obiektu Sprite.
    */
    public Image getImage() {
        return anim.getImage();
    }

    /**
        Powiela bieżący obiekt Sprite. Nie powiela położenia i prędkości.
    */
    public Object clone() {
        return new Sprite(anim);
    }
}
