import java.applet.*; import java.awt.*; import java.util.*; public class Shoot extends Applet implements Runnable { // 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 = 100; // Geschwindigkeit , power final double gravity = 0.3; // Schwerkraftskoeffizient double pi = 2 * Math.PI; // 2 * pi konstante int radius = 3; // Radius des Balles // 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 Random rnd = new Random(); // Neue Windgeschwindigkeit (random) double wind = rnd.nextFloat() * 4.0 - 2.0; public void init() { setBackground (Color.black); } 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() { } // Variablen für die Doppelpufferung private Image dbImage; private Graphics dbg; /** 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 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); } }