package bolanimatie;
/**
*
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
class BolAnimatie extends JPanel
{ // Constants
public static final int SIZE = 350; // omvang Canvas: 350x350
public static final int BOLSIZE = 20; // omvang vierkant: 20x20
public static final int COLORSTEP = 255/(BOLSIZE/2);
public static final int STARTSNELHEID = 10; // sleeptime is 1000/snelheid
public static final int STARTRICHTING = 45; // schuin
private double xpos = (SIZE-BOLSIZE)/2; // zet balletje in het midden
private double ypos = (SIZE-BOLSIZE)/2; // linksbovenhoek van bounding vierkant!
private double xspeed = 7;
private double yspeed = 7;
private int xdir = 1; // -1 of +1
private int ydir = 1;
private int sleeptime = 1000/STARTSNELHEID; // sleeptime van de thread
/**
* constructor
*/
public BolAnimatie()
{ // ----- uiterlijk
setBackground(Color.white);
setSize(SIZE, SIZE);
}
/**
* Balletje verplaatsen.
* NB: de x- en y-component in de stap zijn altijd positief. De variabelen xdir en
* ydir zijn -1 of 1 en bepalen de richting door vermenigvuldiging
* (bijvoorbeeld xdir*xspeed)
* Wanneer het balletje de rand van het speelveld dreigt te passeren, wordt de
* betreffende dir-variable omgeklapt, waardoor de richting van de bal omdraait.
*/
private void moveBol()
{ xpos = xpos + xdir*xspeed;
if ( xpos <= 0 ) // kan als xdir = -1, bal loopt links weg
{ xpos = 0;
xdir = 1; // change dir
}
if ( xpos >= SIZE-BOLSIZE ) // kan als xdir = 1, bal loopt rechts weg
{ xpos = SIZE-BOLSIZE;
xdir = -1; // change dir
}
ypos = ypos + ydir*yspeed;
if ( ypos <= 0 ) // kan als ydir = -1, bal loopt boven weg
{ ypos = 0;
ydir = 1; // change dir
}
if ( ypos >= SIZE-BOLSIZE ) // kan als xdir = 1, bal loopt onder weg
{ ypos = SIZE-BOLSIZE;
ydir = -1; // change dir
}
}
// ------- Gebruikersacties --------------------
/**
* Richting instellen: De hoek van de richting (in graden) wordt omgerekend
* in radialen. Daarna sin en cos gebruiken om de y- en x-component van een
* stap uit te rekenen
*
* @param ri De gekozen hoek uit de regelaar
*/
public void setRichting(int ri)
{ if ( ri >= 0 && ri <= 90 )
{ double rad = (Math.PI/2)*( ((double)ri)/90);
xspeed = Math.cos(rad)*10;
yspeed = Math.sin(rad)*10;
} // else do nothing
}
/**
* Snelheid instellen: hogere snelheid realiseren door de tijd bij sleep(int t)
* te verlagen. Dit wordt bereikt door 1000/snelheid als slaaptijd te nemen.
*
* @param s De gekozen snelheid uit de regelaar
*/
public void setSnelheid(int s)
{ if ( s>=1 && s<=50 )
{ sleeptime = 1000/s; // hogere snelheid: kortere slaaptijd!
} // else do nothing
}
/**
* Teken een stap: verplaats het balletje en teken opnieuw
*/
public void paintStep() // Regelpaneel: knop 'Stap'
{ moveBol();
repaint();
}
// ------- Painting and buffering --------------------
/**
* Teken het speelveld (wit vlak!) en het balletje
*/
public void paintComponent(Graphics g)
{ // verplicht, zorgt voor witte achtergrond
super.paintComponent(g);
// Bol bestaat uit in kleur verlopende concentrische cirkels (blauw -> rood)
int ixpos = (int)Math.round(xpos);
int iypos = (int)Math.round(ypos);
for ( int k=0; k<=BOLSIZE/2; k++ )
{ g.setColor(new Color(COLORSTEP*k, 0, 255-COLORSTEP*k));
g.fillOval(ixpos+k, iypos+k, BOLSIZE-2*k, BOLSIZE-2*k);
}
}
}