167 lines
3.8 KiB
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;
|
|
}
|
|
}
|