
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.io.IOException;

import javax.imageio.ImageIO;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

class SpriteSheetManager {

	private BufferedImage spriteSheet;
	private Image sprite;
	private int sprite_width;
	private int sprite_height;
	private int spritesheet_width;
	private int spritesheet_height;
        private int x = 0;
        private int y = 0;
        private int maxNum = 0;
        private long runningTime = 0; 
	
	public SpriteSheetManager() {
		spriteSheet = null;
	}
	
	public SpriteSheetManager(String file) {
		setSpriteSheet(file);
	}
	
	public void setSpriteSheet(String file){
		try {
			spriteSheet = ImageIO.read(new File("images/"+file)); //ImageIO.read(new URL("http://s...content-available-to-author-only...g.org/vso6oed91/spritesheet.png"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void setSpriteSheetDimensions(int w, int h){
		spritesheet_width = w;
		spritesheet_height = h;
	}
	
	public void setSpriteDimensions(int w, int h){
		sprite_width = w;
		sprite_height = h;
	}
	
        public void setNumberOfSprites(){
            maxNum+= (spritesheet_height/sprite_height) * (spritesheet_width/sprite_width);
            System.out.println(maxNum);
        }
        
	public BufferedImage getSpriteSheet(){
		return spriteSheet;
	}
        
	public Image getSprite(int num){
            System.out.println(num);
            if( (x*sprite_width) > (spritesheet_width - sprite_width) ){
                x = 0; y++;
                System.out.println("x = "+x+" y = "+y);
            }
            if(num%maxNum == 0 && num != 0){x=0; y=0;}
            sprite = spriteSheet.getSubimage(x*sprite_width, y*sprite_height, sprite_width, sprite_height);
            x++;
            return sprite;
	}
}

class Ideone {

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable(){
			public void run() {
				new TestSpriteSheet();				
			}			
		});			
	}

}

class TestSpriteSheet extends JFrame{

    private static final long serialVersionUID = 1L;
    private SpriteSheetManager ss;
    private ImageIcon img;
    private JLabel lbl;
    private Graphics g = getGraphics();
    private Timer t;
    private long runningTime = 0;
        
    public TestSpriteSheet(){
	super("Testing SpriteSheets");
	setSize(200,200);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setResizable(false);
	setLayout(new BorderLayout());
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent){
                System.exit(0);
            }
        });    
        
	ss = new SpriteSheetManager("spritesheet.png");
	ss.setSpriteSheetDimensions(321,381);
	ss.setSpriteDimensions(107,127);
	
        add(new PanelSprite(this, ss));
	this.setVisible(true);
    }
}

class PanelSprite extends JPanel{
    
    private long runningTime = 0;
    private int fps = 24;
    private boolean stop = false;
    private SpriteSheetManager ss;
    private TestSpriteSheet temp;
    private int num = 0;
    
    public PanelSprite(TestSpriteSheet test, SpriteSheetManager sm){
        ss = sm;
        temp = test;
        setSize(180,180);
        setLayout(new BorderLayout());
        init();
    }
    
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        long time = 50000; 
        animate_with_gfx(g, time);
        if(runningTime <= time){
            num++;
        }
    }
    
    public void init(){
        Timer t = new Timer((int)(1000/fps), new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(!stop) {
                    repaint();
                } else {
                    ((Timer)e.getSource()).stop();
                }
            }
        });
        t.setRepeats(true);
        t.setDelay((int)(1000/fps));
        t.start();
    }

    public void animate_with_gfx(Graphics g, long time){
        if(runningTime <= time){
            try {
                //System.out.println(runningTime); //Checking if this part works
                g.drawImage(ss.getSprite(num), 40, 40, null);
                runningTime+=(1000/fps);
            }catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        else{
            stop = true;
        }
    }
}
