public class Zielen
{
// Variablen
double x_float = 400; // Startposition
double y_float = 400; // Startposition
double vx; // x - Geschwindigkeit
double vy; // y - Geschwindigkeit
double angle = 80; // Schusswinkel
double power = 120; // Geschwindigkeit , power
final double gravity = 0.3; // Schwerkraftskoeffizient
double pi = 2 * Math.PI; // 2 * pi konstante
int radius = 3; // Radius des Balles
//Variablen
private lmage dblmage;
private Graphics g;
// Werte für die Kannone
int i = 400 + (int)(20.0 * Math.cos(((double)angle * pi) / 360.0));
int j = 400 - (int)(20.0 * Math.sin(((double)angle * pi) / 360.0));
boolean addjusting = false; // Wichtig für Doppelpufferung oder nicht
// Neue Windgeschwindigkeit (random)
double wind = rnd.nextFloat() * 4.0 - 2.0;
public void init()
{
setBackground (Color.blue);
}
public void start ()
{
// Schaffen eines neuen Threads, in dem das Spiel läuft
Thread th = new Thread (this);
// Starten des Threads
th.start ();
}
public void stop()
{
}
public void destroy()
{
}
/** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
public void update (Graphics g)
{
if (addjusting)
{
// Initialisierung des DoubleBuffers
if (dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
}
// Bildschirm im Hintergrund löschen
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// 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);
}
else
{
paint(g);
}
}
public boolean keyDown (Event e, int key)
{
// linke Cursortaste
if (key == Event.LEFT)
{
angle++;
i = 400 + (int)(20.0 * Math.cos(((double)angle * pi) / 360.0));
j = 400 - (int)(20.0 * Math.sin(((double)angle * pi) / 360.0));
addjusting = true;
}
else if (key == Event.DOWN)
{
power--;
addjusting = true;
}
else if (key == Event.UP)
{
power++;
addjusting = true;
}
// rechte Cursortaste
else if (key == Event.RIGHT)
{
angle--;
i = 400 + (int)(20.0 * Math.cos(((double)angle * pi) / 360.0));
j = 400 - (int)(20.0 * Math.sin(((double)angle * pi) / 360.0));
addjusting = true;
}
// SpaceBar hat Wert 32
else if (key == 32)
{
// Zurücksetzen der Startposition
x_float = i;
y_float = j;
// Berechnen der Startgeschwindigkeiten
vx = (power / 10.0) * (float)Math.cos((pi * (double)angle) / 360.0);
vy = -((power / 10.0) * (float)Math.sin((pi * (double)angle) / 360.0));
addjusting = false;
}
return true;
}
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)
{
// Ändern der x und y Position der Kugel
x_float += vx;
y_float += vy;
// Ändern der vy (Schwerkraft wirkt auf die Kugel)
vy += 0.3;
// Berechnen des Windeinflusses
double w = 1.9 * wind - vx;
if (wind >=0)
{
vx+= (w * w) / 512.0;
}
else
{
vx -= (w * w) / 512.0;
}
// Neuzeichnen des Applets
repaint();
try
{
// Stoppen des Threads für in Klammern angegebene Millisekunden
Thread.sleep (20);
}
catch (InterruptedException ex)
{
// do nothing
}
// Zurücksetzen der ThreadPriority auf Maximalwert
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
public void Angriff ()
{
while (x_float =vx)
{
if (x_float =y_float )
{
power =power+10;
}
else
{
power = power;
}
}
}
public void paint (Graphics g)
{
g.setColor (Color.white);
g.drawString ("power " + power, 100, 20);
g.drawString ("angle " + angle, 100, 40);
g.drawString ("wind " + wind, 100, 60);
g.fillOval ((int)x_float - radius, (int)y_float - radius, 2 * radius, 2 * radius);
g.drawLine(399, 400, i - 1, j);
g.drawLine(401, 400, i + 1, j);
g.drawLine(400, 399, i, j - 1);
g.drawLine(400, 401, i, j + 1);
g.fillOval (390, 390, 20, 20);
}
}