import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;

public class Panel9 extends JPanel implements ActionListener, ChangeListener {
    
    protected static final int DEFAULT_FPS = 30;
    BufferedImage background, foreground;
    int backwidth, backheight;
    int rocketwidth, rocketheight, rocketx, rockety;
    javax.swing.Timer ticker;
    long time, ticks, refreshes;
    
    public Panel9(int rate) {
	int delay = 1000/rate;
	String fs = File.separator;
	Image backImage = new ImageIcon("images"+fs+"starfield.gif").getImage();
	backwidth = backImage.getWidth(this);
	backheight = backImage.getHeight(this);
	background = new BufferedImage(backwidth, backheight,BufferedImage.TYPE_4BYTE_ABGR);
	background.getGraphics().drawImage(backImage,0,0,this);
	Image foreImage = new ImageIcon("images"+fs+"rocketship.gif").getImage();
	rocketwidth = foreImage.getWidth(this);
	rocketheight = foreImage.getHeight(this);
	foreground = new BufferedImage(rocketwidth,rocketheight,BufferedImage.TYPE_4BYTE_ABGR);
	foreground.getGraphics().drawImage(foreImage,0,0,this);
	ticker = new javax.swing.Timer(delay, this);
	ticker.start();
	setPreferredSize(new Dimension(backwidth,backheight));
	rockety = (backheight - rocketheight)/2;
	rocketx = -rocketwidth;
	System.out.println(backwidth);
	time = System.currentTimeMillis();
	refreshes = 0;
	ticks = 0;
    }
    
    public void paintComponent(Graphics g) {
	refreshes++;
	if (refreshes == 100*(refreshes/100)) {
	    long newtime = System.currentTimeMillis();
	    System.out.println("Time elapsed:" + (newtime-time) + "  Ticks: " + ticks + "  Refreshes: " + refreshes + "  FPS: " + ((double)refreshes*1000/(newtime-time)));
	    ticks = 0;
	    refreshes = 0;
	    time = System.currentTimeMillis();
	}
	((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.05f));
	g.drawImage(background,0,0,this);
		((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,1.0f));
	g.drawImage(foreground,rocketx,rockety,this);
    }
    
    public void actionPerformed(ActionEvent e) {
	rocketx+=1;
	ticks++;
	if (rocketx > backwidth)
	    rocketx = -rocketwidth;
	repaint();
	// System.out.println("Tick");
    }
        
    public void stateChanged(ChangeEvent e) {
	JSlider source = (JSlider)e.getSource();
	if (!source.getValueIsAdjusting()) {
	    int fps = (int)source.getValue();
	    System.out.println("New rate: " + fps + " frames/second");
	    int delay = 1000 / fps;
	    System.out.println("New delay: " + delay + " milliseconds");
	    ticker.setDelay(delay);
	}
    }

    public static void main(String[] args) {
	JFrame f = new JFrame("Panel9 animation demo");
	f.getContentPane().setLayout(new BorderLayout());
	Panel9 p = new Panel9(DEFAULT_FPS);
	f.getContentPane().add(p,BorderLayout.CENTER);
	JPanel p2 = new JPanel();
	f.getContentPane().add(p2,BorderLayout.SOUTH);
	JSlider fpsSlider = new JSlider(JSlider.HORIZONTAL,0,100,DEFAULT_FPS);
	fpsSlider.setMajorTickSpacing(10);
	fpsSlider.setPaintTicks(true);
	fpsSlider.setPaintLabels(true);
	fpsSlider.addChangeListener(p);
	p2.add(fpsSlider);
	f.pack();
	f.setVisible(true);
	f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
