package jbrickbreaker.view;
import java.awt.*;
import java.awt.font.TextLayout;
import java.awt.geom.Rectangle2D;
import java.text.MessageFormat;
import java.util.Locale;
import javax.swing.JComponent;
import jbrickbreaker.JBrickBreaker;
import jbrickbreaker.model.Game;
/**
* This view displays some information such as the current player score and the
* number of lives he has left.
*
* Date: 12 Dec 2010
* Time: 15:58:55
* @author Thomas Michel
*/
public class InfoView extends JComponent implements IScore, ILives, ILanguage {
private Game game;
private String scoreStr, livesStr, playerStr;
private JBrickBreaker brickbreacker;
/**
*
* @author Thomas Michel
*/
public InfoView(Game g, JBrickBreaker brickbreacker) {
super();
this.brickbreacker = brickbreacker;
game = g;
setSize(500, 25);
setMinimumSize(new Dimension(JBrickBreaker.GAME_WIDTH, 25));
setPreferredSize(new Dimension(JBrickBreaker.GAME_WIDTH, 25));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
final int baseMargin = 5;
final int spaceMargin = 2;
final int yOffset = 20;
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
Font bigger = g2d.getFont().deriveFont(18f);
drawScore(g2d, bigger, yOffset, baseMargin, spaceMargin);
drawLives(g2d, bigger, yOffset);
drawPlayer(g2d, bigger, yOffset);
}
private void drawPlayer(Graphics2D g2d, Font bigger, int yOffset) {
g2d.setFont(bigger);
g2d.setColor(Color.BLACK);
TextLayout tl = new TextLayout(playerStr, g2d.getFont(),
g2d.getFontRenderContext());
Rectangle2D r = tl.getBounds();
tl.draw(g2d, (float) (getWidth() - r.getWidth()) / 2, yOffset);
}
private void drawLives(Graphics2D g2d, Font bigger, int yOffset) {
int lives = game.getLives();
g2d.setFont(bigger);
g2d.setColor(Color.BLACK);
TextLayout tl = new TextLayout(livesStr, g2d.getFont(),
g2d.getFontRenderContext());
Rectangle2D r = tl.getBounds();
Rectangle life = new Rectangle(20, 10);
int margin = 12;
if (lives > 3) {
String s = "x " + lives; //$NON-NLS-1$
TextLayout tl2 = new TextLayout(s, g2d.getFont(),
g2d.getFontRenderContext());
Rectangle2D r2 = tl2.getBounds();
tl.draw(g2d,
(float) (getWidth() - r.getWidth() - life.width
- r2.getWidth() - margin), yOffset);
g2d.setColor(Color.RED);
g2d.fillRect(getWidth() - (int) r2.getWidth() - life.width - margin
/ 2, yOffset - life.height, life.width, life.height);
g2d.setColor(Color.BLACK);
g2d.drawRect(getWidth() - (int) r2.getWidth() - life.width - margin
/ 2, yOffset - life.height, life.width, life.height);
tl2.draw(g2d, (float) (getWidth() - r2.getWidth()), yOffset);
} else {
int livesMargin = 5;
int maxMargin = 3 * (life.width + livesMargin);
tl.draw(g2d,
(float) (getWidth() - r.getWidth() - life.width - maxMargin),
yOffset);
for (int i = 1; i <= lives; i++) {
g2d.setColor(Color.RED);
g2d.fillRect(getWidth() - i * (life.width + livesMargin),
yOffset - life.height, life.width, life.height);
g2d.setColor(Color.BLACK);
g2d.drawRect(getWidth() - i * (life.width + livesMargin),
yOffset - life.height, life.width, life.height);
}
}
}
private void drawScore(Graphics2D g2d, Font bigger, float yOffset,
float baseMargin, float spaceMargin) {
String s = String.valueOf(game.getScore());
g2d.setFont(bigger);
TextLayout tl = new TextLayout(scoreStr, g2d.getFont(),
g2d.getFontRenderContext());
tl.draw(g2d, baseMargin, yOffset);
g2d.setColor(Color.LIGHT_GRAY.darker());
TextLayout tl2 = new TextLayout(s, g2d.getFont(),
g2d.getFontRenderContext());
Rectangle2D r = tl.getBounds();
tl2.draw(g2d, (float) (r.getWidth() + r.getX()) + baseMargin
+ spaceMargin, yOffset);
}
@Override
public void updateLives(int lives) {
repaint();
}
@Override
public void updateScore(int score) {
repaint();
}
@Override
public void updateLanguage(Locale lang) {
scoreStr = brickbreacker.getString("InfoView.0"); //$NON-NLS-1$
livesStr = brickbreacker.getString("InfoView.1"); //$NON-NLS-1$
playerStr = MessageFormat
.format(brickbreacker.getString("InfoView.2"), game.getPlayer().getName()); //$NON-NLS-1$
repaint();
}
}