uebungen/sources/src/main/java/pr2/generics/verwenden/GameBoard.java

167 lines
3.8 KiB
Java

package pr2.generics.verwenden;
import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.SimpleImage;
import de.smits_net.games.framework.sprite.Sprite;
import de.smits_net.games.framework.sprite.Sprite.BoundaryPolicy;
import de.smits_net.games.framework.sprite.Velocity;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.Random;
import java.util.Stack;
/**
* Spielfeld.
*/
public class GameBoard extends Board {
/**
* Zufallszahlengenerator.
*/
private final Random rnd = new Random();
/**
* Münzstapel.
*/
// TODO: Münzen als Stack speichern
/**
* A moving coin.
*/
private Sprite moving;
/**
* Punkte.
*/
private int points = 0;
/**
* Zeitpunkt des ersten Klicks.
*/
private long startzeit;
/**
* Erzeugt ein neues Board.
*/
public GameBoard() {
// neues Spielfeld anlegen
super(10, new Dimension(400, 400), Color.BLACK);
// Münzen anlegen
for (int i = 0; i < 20; i++) {
// TODO: Neue Münzen auf den Stapel legen
}
}
/**
* Legt eine zufällige Münze an.
*
* @return die Münze als Sprite.
*/
private Sprite createCoin() {
final String prefix = "pr2/generics/verwendung";
String asset;
switch (rnd.nextInt(8)) {
case 0:
asset = prefix + "/1c.png";
break;
case 1:
asset = prefix + "/2c.png";
break;
case 3:
asset = prefix + "/5c.png";
break;
case 4:
asset = prefix + "/10c.png";
break;
case 5:
asset = prefix + "/20c.png";
break;
case 6:
asset = prefix + "/50c.png";
break;
case 7:
asset = prefix + "/1e.png";
break;
default:
asset = prefix + "/2e.png";
break;
}
int offset = rnd.nextInt(10);
return new Sprite(this, new Point(100 + offset, 100 + offset),
BoundaryPolicy.NONE, new SimpleImage(asset));
}
/**
* Spielfeld neu zeichnen. Wird vom Framework aufgerufen.
*/
@Override
public synchronized void drawGame(Graphics g) {
// TODO: Alle Münzen zeichnen
if (moving != null) {
moving.draw(g, this);
}
writeText(g, 0, 20, "Punkte: " + points);
}
/**
* Spielfeld zeichnen.
*
* @param g Grafik-Kontext.
*/
@Override
protected void drawGameOver(Graphics g) {
centerText(g, String.format("%d Punkte in %.2f Sekunden", points,
(System.currentTimeMillis() - startzeit) / 1000.0));
}
/**
* Mausklick abfangen.
*
* @param e Maus-Event.
*/
@Override
public synchronized void mouseClicked(MouseEvent e) {
if (startzeit == 0) {
startzeit = System.currentTimeMillis();
}
// TODO: Wenn Stapel leer ist, nichts tun
// Oberstes Sprite vom Stapel ansehen und s zuweisen
Sprite s = null;
if (s.intersects(new Point(e.getX(), e.getY()))) {
points++;
// TODO: Oberstes Sprite vom Stapel entfernen und s zuweisen
moving = s;
moving.setVelocity(new Velocity(0, 20));
}
}
/**
* Spielsituation updaten. Wird vom Framework aufgerufen.
*/
@Override
public boolean updateGame() {
if (moving != null) {
moving.move();
}
// TODO: Solange Stapel noch Elemente enthält, true zurückgeben.
return true;
}
}