📄 main.java
字号:
import java.awt.*;
import java.util.*;
import java.applet.*;
import java.net.*;
/** Diese Klasse enth鋖t alle f黵 die Implementierung eines Applets wichtigen Methoden
(init, start, stop), desweiteren die Methoden run (zur Implementierung des Interfaces Run-
abble), sowie die Graphikmethoden paint und update. Die Klasse realisiert die Dopppel-
pufferung in der Methode update, sie h鰎t auf Mausereignisse (mouseDown) und enth鋖t
alle f黵 den Ablauf des Spiels wichtigen Anweisungen */
public class Main extends Applet implements Runnable
{
// Deklarationen der Variablen
private int speed; // Threadgeschwindigkeit
boolean isStoped = true; // Zeigt an, ob das Spiel gestopt ist (true) oder l鋟ft (false)
// Deklaration der Objektreferenzen
private Player player; // Refferenz auf das Spielerobjekt
private Ball redball; // Refferenz auf den roten Ball
private Ball blueball; // Refferenz auf den blauen Ball
// Thread
Thread th; // Thread in dem das Spiel l鋟ft
// Audiodateien
AudioClip shotnoise; // Speichert die Wav - Datei Gun, die nach Schuss abgespielt wird
AudioClip hitnoise; // Speichert die Wav - Datei hit, die nach einem Treffer abgespielt wird
AudioClip outnoise; // Speichert die Wav - Datei error, die nach einem Treffer abgespielt wird
// Neue Schrift
Font f = new Font ("Serif", Font.BOLD, 20);
// Fadenkreuzmauszeiger
Cursor c; // Variable f黵 Cursor
// Variablen f黵 die Doppelpufferung
private Image dbImage;
private Graphics dbg;
// Init - Methode
public void init ()
{
// Mauszeiger wird zu Fadenkreuz
c = new Cursor (Cursor.CROSSHAIR_CURSOR);
this.setCursor (c);
// Neue Hintergrundfarbe
Color superblue = new Color (0, 0, 255);
// Setzen der Hintergrundfarbe
setBackground (Color.black);
// Setzten der Schrift
setFont (f);
// Speed wird von Parameter speed des Applets bestimmt
if (getParameter ("speed") != null)
{
speed = Integer.parseInt(getParameter("speed"));
}
else speed = 15;
// Laden der Bilder und Audiodateien und einmaliges Abspielen, um l鋘gere Ladezeiten w鋒rend des Spiels zu vermeiden
hitnoise = getAudioClip (getCodeBase() , "gun.au");
hitnoise.play();
hitnoise.stop();
shotnoise = getAudioClip (getCodeBase() , "miss.au");
shotnoise.play();
shotnoise.stop();
outnoise = getAudioClip (getCodeBase() , "error.au");
outnoise.play();
outnoise.stop();
// Initialisierung der Spielobjekte
player = new Player ();
redball = new Ball (10, 190, 250, 1, -1, 4, Color.red, outnoise, player);
blueball = new Ball (10, 190, 150, 1, 1, 3, Color.blue, outnoise, player);
}
// Start - Methode, hier beginnt das Applet zu laufen
public void start ()
{
// Schaffen eines neuen Threads, in dem das Spiel l鋟ft
th = new Thread (this);
th.start ();
}
// Stop - Methode, hier wird das Applet gestopt
public void stop ()
{
th.stop();
}
// Auffangen des Mausereignisses mouseDown
public boolean mouseDown (Event e, int x, int y)
{
// Spiel l鋟ft
if (!isStoped)
{
// Test ob roter Ball getroffen wurde
if (redball.userHit (x, y))
{
// Abspielen der Audiodatei
hitnoise.play();
// Ball zu Startwert zur點ksetzten
redball.ballWasHit ();
}
// Test ob blauer Ball getroffen wurde
if (blueball.userHit (x, y))
{
// Abspielen der Audiodatei
hitnoise.play();
// Ball zu Startwert zur點ksetzten
blueball.ballWasHit ();
}
else
{
// Abspielen des normalen Schussger鋟sches
shotnoise.play();
}
}
// Wenn Spiel noch nicht gestartet ist, oder wieder gestartet wird
else if (isStoped && e.clickCount == 2)
{
// Alle wichtigen Werte zur點ksetzen
isStoped = false;
init ();
}
return true;
}
// Implementierung der Runmethode
public void run ()
{
// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while (true)
{
if (player.getLives() >= 0 && !isStoped)
{
redball.move();
blueball.move();
}
repaint();
try
{
// Stoppen des Threads f黵 10 Millisekunden
Thread.sleep (speed);
}
catch (InterruptedException ex)
{
// do nothing
}
// Zur點ksetzen der ThreadPriority auf Maximalwert
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
// Paint - Methode
public void paint (Graphics g)
{
// Wenn noch Leben 黚rig sind
if (player.getLives() >= 0)
{
// Setzen der Farbe
g.setColor (Color.yellow);
// Punktestand und 黚rige Leben
g.drawString ("Score: " + player.getScore(), 10, 40);
g.drawString ("Lives: " + player.getLives(), 300, 40);
// Zeichnen der B鋖le
redball.DrawBall(g);
blueball.DrawBall(g);
// Startbildschirm
if (isStoped)
{
g.setColor (Color.yellow);
g.drawString ("Doubleclick on Applet to start Game!", 40, 200);
}
}
// Wenn alle Leben verbraucht sind
else if (player.getLives() < 0)
{
g.setColor (Color.yellow);
// Erreichte Punkte und game over
g.drawString ("Game over!", 130, 100);
g.drawString ("You scored " + player.getScore() + " Points!", 90, 140);
// Bewertung der Punkte
if (player.getScore() < 300) g.drawString ("Well, it could be better!", 100, 190);
else if (player.getScore() < 600 && player.getScore() >= 300) g.drawString ("That was not so bad", 100, 190);
else if (player.getScore() < 900 && player.getScore() >= 600) g.drawString ("That was really good", 100, 190);
else if (player.getScore() < 1200 && player.getScore() >= 900) g.drawString ("You seem to be very good!", 90, 190);
else if (player.getScore() < 1500 && player.getScore() >= 1200) g.drawString ("That was nearly perfect!", 90, 190);
else if (player.getScore() >= 1500) g.drawString ("You are the Champingon!",100, 190);
g.drawString ("Doubleclick on the Applet, to play again!", 20, 220);
isStoped = true; // Zur點ksetzen der isStoped Variablen, um wieder neu beginnen zu k鰊nen
}
}
// Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns
public void update (Graphics g)
{
// Initialisierung des DoubleBuffers
if (dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
}
// Bildschirm im Hintergrund l鰏chen
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// Auf gel鰏chten Hintergrund Vordergrund zeichnen
dbg.setColor (getForeground());
paint (dbg);
// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
g.drawImage (dbImage, 0, 0, this);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -