import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.Timer;
class Funster extends JFrame {
BollPanel bollPanel;
public Funster(){
setTitle("Studdis");
bollPanel = new BollPanel();
bollPanel.setBackground(Color.white);n
bollPanel.setPreferredSize(new Dimension(350,250));
bollPanel.addBoll(new Boll(200, 10, Color.red));
bollPanel.addBoll(new Boll(100, 20, Color.blue));
add(bollPanel, BorderLayout.CENTER);
pack();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Funster();
}
}
class Boll {
private int xMax, yMax; //Storlek på boll (Ball size)
private int r, x0, y0; //Bollens radie, och mittpunkt
// (Ball radius and midpoint)
private int xSteg, ySteg; //Bollens steglängd (Ball step-length)
private int v, v0= 5; //Bollens hastighet (Ball velocity)
Color color;
public Boll(int storlek, int hastighet, Color color){
// (arg: size and velocity)
this.color = color;
r= storlek/10; //Bollens radie
xSteg= ySteg= v= v0= hastighet; //Utgångshastighet (Start velocity)
x0= r; //Placera bollen (Place the ball)
y0= yMax; // --||--
}
public void step(int width, int height) {
xMax= width-1; //bollstorlek x-led
yMax= height-1; //bollstorlek y-led
//Hit kommer man var 100:e millisekund, anropas av timern
if (x0-r <= 0){ //Är bollen i vänsterkanten? (Left border?)
v++; //Öka hastigheten
xSteg= v; //Flytta åt höger nästa gång (Move right next time)
}
else if (x0+r >= xMax){ //Är bollen i högerkant? (Right border?)
v++; //Öka hastigheten
xSteg= -v; //Flytta åt vänster nästa gång
}
if (y0-r <= 0 || y0+r >= yMax) //I över- eller underkant?
ySteg= -ySteg; //Byt vertikal riktning
x0+= xSteg; //Flyttar bollen horisontellt
y0+= ySteg; //Flyttar bollen vertikalt
if (x0 < r) //Om bollen hamna för långt å vänster
x0= r;
else if (x0 > xMax-r) //Hamnade bollen för långt åt höger?
x0= xMax-r+1;
if (y0 < r) //Hamnade bollen för långt upp?
y0= r;
else if (y0 > yMax-r) //Hamnade bollen för lånt ner?
y0= yMax-r+1;
}
public void draw(Graphics g) {
g.setColor(//Color.getHSBColor(60, 4, 100));
color);
g.fillOval(x0-r, y0-r, 2*r, 2*r); //Rita bollen
}
}
class BollPanel extends JPanel implements ActionListener{
List<Boll> bolls = new ArrayList<Boll>();
private Timer timer = new Timer(100, this);
public BollPanel() {
// addComponentListener(xyPlan);
// //Ändringar av spelplanens storlek (If changing the frame-size)
timer.start();
}
public void actionPerformed(ActionEvent e){
int w = getWidth();
int h = getHeight();
for(Boll boll : bolls) {
boll.step(w, h);
}
repaint();
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
for(Boll boll : bolls) {
boll.draw(g);
}
}
public void addBoll(Boll boll) {
bolls.add(boll);
}
/*
ComponentListener xyPlan= new ComponentAdapter() {
//Om spelplanens storlek ändras
@Override
public void componentResized(ComponentEvent e){ //In i metoden..
xMax= e.getComponent().getSize().width-1; //Ändra storleken
yMax= e.getComponent().getSize().height-1;
e.getComponent().requestFocus();
repaint(); //Måla upp det nya fönstret
}
};
*/
}