import java.applet.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class BallApplet extends Applet implements Runnable,KeyListener
{
private static final long serialVersionUID = 1L;
// Initialisierung der Variablen
boolean activierungHoch1;
boolean activierungHoch2;
boolean activierungRunter1;
boolean activierungRunter2;
int x_pos = 10; // x - Position des Balles
int y_pos = 100; // y - Position des Balles
int radius = 20; // Radius des Balles
int richtungx=1; // x Richtung des Balles
int richtungy=1; // y Richtung des Balles
int grundspeedx=2; // x Beschleunigung des Balles
int grundspeedy=0; // y grundspeed des Balles
int threadlaenge=1000;
int threadhoehe=600;
int geschwindigkeit=8;
int playerspeed=10;
int ballcheckNNX;
int ballcheckNOX;
int ballcheckOOX;
int ballcheckSOX;
int ballcheckSSX;
int ballcheckSWX;
int ballcheckWWX;
int ballcheckNWX;
int ballcheckNNY;
int ballcheckNOY;
int ballcheckOOY;
int ballcheckSOY;
int ballcheckSSY;
int ballcheckSWY;
int ballcheckWWY;
int ballcheckNWY;
int ballcheckAdvNNWX;
int ballcheckAdvNWWX;
int ballcheckAdvSWWX;
int ballcheckAdvSSWX;
int ballcheckAdvNNOX;
int ballcheckAdvNOOX;
int ballcheckAdvSOOX;
int ballcheckAdvSSOX;
int ballcheckAdvNNWY;
int ballcheckAdvNWWY;
int ballcheckAdvSWWY;
int ballcheckAdvSSWY;
int ballcheckAdvNNOY;
int ballcheckAdvNOOY;
int ballcheckAdvSOOY;
int ballcheckAdvSSOY;
// Variablen für die Doppelpufferung
private Image dbImage;
private Graphics dbg;
Polygon p1=new Polygon();
Polygon p2=new Polygon();
Polygon stripe1=new Polygon();
Polygon stripe2=new Polygon();
Thread th = new Thread (this);
// Instanzvariable für den AudioClip
AudioClip bounce;
public void init()
{
// Laden des Audioclips
bounce = getAudioClip (getCodeBase(), "dong.au");
p1.addPoint( 1, threadhoehe/2-40);
p1.addPoint( 1, threadhoehe/2+40);
p1.addPoint(30, threadhoehe/2+40);
p1.addPoint(70, threadhoehe/2);
p1.addPoint(30, threadhoehe/2-40);
p2.addPoint( threadlaenge , threadhoehe/2-40);
p2.addPoint( threadlaenge , threadhoehe/2+40);
p2.addPoint( threadlaenge-30, threadhoehe/2+40);
p2.addPoint( threadlaenge-70, threadhoehe/2);
p2.addPoint( threadlaenge-30, threadhoehe/2-40);
y_pos=threadhoehe/2;
stripe1.addPoint( 5, 5);
stripe1.addPoint(threadlaenge-5, 5);
stripe1.addPoint(threadlaenge-5, 15);
stripe1.addPoint( 5, 15);
stripe2.addPoint( 5,threadhoehe-20);
stripe2.addPoint(threadlaenge-5,threadhoehe-20);
stripe2.addPoint(threadlaenge-5,threadhoehe-10);
stripe2.addPoint( 5,threadhoehe-10);
}
public void start ()
{
// Schaffen eines neuen Threads, in dem das Spiel läuft
// Starten des Threads
th.start ();
resize(threadlaenge, threadhoehe);
this.addKeyListener(this);
}
public void stop()
{
}
public void destroy()
{
}
public void run ()
{
// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// Solange true ist läuft der Thread weiter
while (true)
{
// Verändern der x- Koordinate
for (int i=0;i<geschwindigkeit;i++)
{
ballcheckNNX=x_pos;
ballcheckNOX=(int)(x_pos+.7*radius)+2;
ballcheckOOX=x_pos+radius;
ballcheckSOX=(int)(x_pos+.7*radius)+3;
ballcheckSSX=x_pos;
ballcheckSWX=(int)(x_pos-.7*radius)-2;
ballcheckWWX=x_pos-radius;
ballcheckNWX=(int)(x_pos-.7*radius)-5;
ballcheckNNY=y_pos-radius;
ballcheckNOY=(int)(y_pos-.7*radius);
ballcheckOOY=y_pos;
ballcheckSOY=(int)(y_pos+.7*radius);
ballcheckSSY=y_pos+radius;
ballcheckSWY=(int)(y_pos+.7*radius);
ballcheckWWY=y_pos;
ballcheckNWY=(int)(y_pos-.7*radius);
ballcheckAdvNNWX=(int)(x_pos-.39*radius);
ballcheckAdvNWWX=(int)(x_pos-.92*radius);
ballcheckAdvSWWX=(int)(x_pos-.92*radius);
ballcheckAdvSSWX=(int)(x_pos-.39*radius);
ballcheckAdvNNOX=(int)(x_pos+.39*radius);
ballcheckAdvNOOX=(int)(x_pos+.92*radius);
ballcheckAdvSOOX=(int)(x_pos+.92*radius);
ballcheckAdvSSOX=(int)(x_pos+.39*radius);
ballcheckAdvNNWY=(int)(y_pos+.92*radius);
ballcheckAdvNWWY=(int)(y_pos+.39*radius);
ballcheckAdvSWWY=(int)(y_pos-.39*radius);
ballcheckAdvSSWY=(int)(y_pos-.92*radius);
ballcheckAdvNNOY=(int)(y_pos+.92*radius);
ballcheckAdvNOOY=(int)(y_pos+.39*radius);
ballcheckAdvSOOY=(int)(y_pos-.39*radius);
ballcheckAdvSSOY=(int)(y_pos-.92*radius);
x_pos =x_pos+(grundspeedx*richtungx);
y_pos =y_pos+(grundspeedy*richtungy);
if ((p1.contains(ballcheckNNX, ballcheckNNY)==true)&&richtungx==-1)
{grundspeedx=1;grundspeedy=2;richtungy=-1;}
if ((p1.contains(ballcheckSWX, ballcheckSWY)==true)&&richtungx==-1)
{grundspeedx=1;grundspeedy=1;richtungx=+1;richtungy=-1;}
if ((p1.contains(ballcheckWWX, ballcheckWWY)==true)&&richtungx==-1)
{grundspeedx=2;richtungx=+1;}
if ((p1.contains(ballcheckNWX, ballcheckNWY)==true)&&richtungx==-1)
{grundspeedx=1;grundspeedy=1;richtungx=+1;richtungy=1;}
if ((p1.contains(ballcheckSSX, ballcheckSSY)==true)&&richtungx==-1)
{grundspeedx=1;grundspeedy=2;richtungy=1;}
if ((p2.contains(ballcheckNNX, ballcheckNNY)==true)&&richtungx==1)
{grundspeedx=1;grundspeedy=2;richtungy=-1;}
if ((p2.contains(ballcheckNOX, ballcheckNOY)==true)&&richtungx==1)
{grundspeedx=1;grundspeedy=1;richtungx=-1;richtungy=1;}
if ((p2.contains(ballcheckOOX, ballcheckOOY)==true)&&richtungx==1)
{grundspeedx=2;richtungx=-1;}
if ((p2.contains(ballcheckSOX, ballcheckSOY)==true)&&richtungx==1)
{grundspeedx=1;grundspeedy=1;richtungx=-1;richtungy=-1;}
if ((p2.contains(ballcheckSSX, ballcheckSSY)==true)&&richtungx==1)
{grundspeedx=1;grundspeedy=2;richtungy=1;}
/* if ((p1.contains(ballcheckAdvNNWX, ballcheckAdvNNWX)==true)&&richtungx==-1)
{grundspeedx=1;grundspeedy=2;richtungx=1;richtungy=1;}
if ((p1.contains(ballcheckAdvNWWX, ballcheckAdvNWWX)==true)&&richtungx==-1)
{grundspeedx=2;grundspeedy=1;richtungx=1;richtungy=1;}
if ((p1.contains(ballcheckAdvSWWX, ballcheckAdvSWWX)==true)&&richtungx==-1)
{grundspeedx=2;grundspeedy=1;richtungx=1;richtungy=-1;}
if ((p1.contains(ballcheckAdvSSWX, ballcheckAdvSSWX)==true)&&richtungx==-1)
{grundspeedx=1;grundspeedy=2;richtungx=1;richtungy=-1;}
if ((p2.contains(ballcheckAdvNNOX, ballcheckAdvNNOX)==true)&&richtungx==1)
{grundspeedx=1;grundspeedy=2;richtungx=-1;richtungy=1;}
if ((p2.contains(ballcheckAdvNOOX, ballcheckAdvNOOX)==true)&&richtungx==1)
{grundspeedx=2;grundspeedy=2;richtungx=-1;richtungy=1;}
if ((p2.contains(ballcheckAdvSOOX, ballcheckAdvSOOX)==true)&&richtungx==1)
{grundspeedx=2;grundspeedy=2;richtungx=-1;richtungy=-1;}
if ((p2.contains(ballcheckAdvSSOX, ballcheckAdvSSOX)==true)&&richtungx==1)
{grundspeedx=1;grundspeedy=2;richtungx=-1;richtungy=-1;}*/
if (stripe1.contains(ballcheckNNX, ballcheckNNY)==true){richtungy=1;}
if (stripe2.contains(ballcheckSSX, ballcheckSSY)==true){richtungy=-1;}
}
// Neuzeichnen des Applets
repaint();
try
{
// Stoppen des Threads für in Klammern angegebene Millisekunden
Thread.sleep (200);
}
catch (InterruptedException ex)
{
// do nothing
}
// Zurücksetzen der ThreadPriority auf Maximalwert
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
/** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
public void update (Graphics g)
{
// Initialisierung des DoubleBuffers
if (dbImage == null)
{
dbImage = createImage (threadlaenge, threadhoehe);
dbg = dbImage.getGraphics ();
}
// Bildschirm im Hintergrund löschen
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, threadlaenge, threadhoehe);
// Auf gelöschten Hintergrund Vordergrund zeichnen
dbg.setColor (getForeground());
paint (dbg);
// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
g.drawImage (dbImage, 0, 0, this);
}
public void paint (Graphics g)
{
g.setColor (Color.red);
g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
g.setColor(Color.green);
g.drawPolygon(p1);
g.fillPolygon(p1);
g.setColor(Color.blue);
g.drawPolygon(p2);
g.fillPolygon(p2);
g.setColor(Color.black);
g.drawPolygon(stripe1);
g.fillPolygon(stripe1);
g.setColor(Color.black);
g.drawPolygon(stripe2);
g.fillPolygon(stripe2);
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==87)
{
activierungHoch1=false;
if (activierungHoch1==false){
p1.ypoints[0]=p1.ypoints[0]-playerspeed;
p1.ypoints[1]=p1.ypoints[1]-playerspeed;
p1.ypoints[2]=p1.ypoints[2]-playerspeed;
p1.ypoints[3]=p1.ypoints[3]-playerspeed;
p1.ypoints[4]=p1.ypoints[4]-playerspeed;
}
}
if(e.getKeyCode()==83)
{
activierungRunter1=false;
if (activierungRunter1==false){
p1.ypoints[0]=p1.ypoints[0]+playerspeed;
p1.ypoints[1]=p1.ypoints[1]+playerspeed;
p1.ypoints[2]=p1.ypoints[2]+playerspeed;
p1.ypoints[3]=p1.ypoints[3]+playerspeed;
p1.ypoints[4]=p1.ypoints[4]+playerspeed;
}
}
if(e.getKeyCode()==38)
{
activierungHoch2=false;
if (activierungHoch2==false){
p2.ypoints[0]=p2.ypoints[0]-playerspeed;
p2.ypoints[1]=p2.ypoints[1]-playerspeed;
p2.ypoints[2]=p2.ypoints[2]-playerspeed;
p2.ypoints[3]=p2.ypoints[3]-playerspeed;
p2.ypoints[4]=p2.ypoints[4]-playerspeed;
}
}
if(e.getKeyCode()==40)
{
activierungRunter2=false;
if (activierungRunter2==false){
p2.ypoints[0]=p2.ypoints[0]+playerspeed;
p2.ypoints[1]=p2.ypoints[1]+playerspeed;
p2.ypoints[2]=p2.ypoints[2]+playerspeed;
p2.ypoints[3]=p2.ypoints[3]+playerspeed;
p2.ypoints[4]=p2.ypoints[4]+playerspeed;
}
}
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==38){activierungHoch1=true;}
if(e.getKeyCode()==40){activierungHoch2=true;}
if(e.getKeyCode()==87){activierungRunter1=true;}
if(e.getKeyCode()==83){activierungRunter2=true;}
}
public void keyTyped(KeyEvent e) {
if(e.getKeyChar()=='a')
{
System.out.println("Punkt1: "+p1.xpoints[0]+"#"+p1.ypoints[0]);
System.out.println("Punkt2: "+p1.xpoints[1]+"#"+p1.ypoints[1]);
System.out.println("Punkt3: "+p1.xpoints[2]+"#"+p1.ypoints[2]);
System.out.println("Punkt4: "+p1.xpoints[3]+"#"+p1.ypoints[3]);
System.out.println("Punkt5: "+p1.xpoints[4]+"#"+p1.ypoints[4]);
}
else
{
}
}
}