package jpotter;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import jpotter.spells.Spell;
import org.jdesktop.animation.timing.Animator;
import org.jdesktop.animation.timing.TimingTarget;
import org.jdesktop.animation.timing.interpolation.PropertySetter;
/**
* Date: 24 Mar 2011 Time: 15:28:47
*
* @author Christophe Dorthe
*/
public class IHM extends JFrame {
// display constants
private static final int FIRST_COL_POS_X = 10;
private static final int SECOND_COL_POS_X = 600;
private static final int ENEMY_IMG_SIZE = 130;
private static final int PROGRESS_BAR_THICKNESS = 20;
private static final int MARGIN = 10;
private static final int WINDOW_HEIGHT = 600;
private static final int WINDOW_WIDTH = 800;
private JProgressBar jpbHarry;
private JProgressBar[] jpbEnemy = new JProgressBar[Game.NB_ENEMIES];
private String effectHarry;
private String[] effectEnemy = new String[Game.NB_ENEMIES];
private JPanel jPanel;
private Point curs;
private BufferedImage background = null;
public Harry harry = null;
private static final IHM instance = new IHM();
private int enemyTarget = 0;
public void setEnemyTarget(int et) {
this.enemyTarget = et;
}
public static IHM getInstance() {
return instance;
}
private IHM() {
if (instance != null)
throw new AssertionError();
setTitle("JPotter");
setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
setLocationRelativeTo(null);
this.curs = new Point(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2);
try {
background = ImageIO.read(new File("img/background1.jpg"));
} catch (IOException e1) {
e1.printStackTrace();
}
Arrays.fill(effectEnemy, "");
jPanel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(background, 0, 0, null);
g.drawImage(harry.getImage(), FIRST_COL_POS_X, MARGIN, null);
// g.drawString(effectHarry + "", harry.getWidth() + 20, harry
// .getHeight() + 15);
for (int i = 0; i < Game.NB_ENEMIES; i++) {
g.drawImage(Game.getInstance().enemies[i].getBi(),
SECOND_COL_POS_X, i * ENEMY_IMG_SIZE + MARGIN,
ENEMY_IMG_SIZE, ENEMY_IMG_SIZE, null);
// g.drawString(effectEnemy[i] + "", SECOND_COL_POS_X
// + ENEMY_IMG_SIZE + MARGIN, i * ENEMY_IMG_SIZE
// + ENEMY_IMG_SIZE + 5);
}
g.setColor(Color.RED);
Point[] p = getEnemyPos(enemyTarget);
g.fillRect((p[0].x), (p[0].y), 5, 5);
g.fillRect((p[1].x), (p[1].y), 5, 5);
g.setColor(Color.GREEN);
g.fillOval((int) IHM.this.getCurs().getX(), (int) IHM.this
.getCurs().getY(), 10, 10);
}
};
createHarry(5000, "OK");
jPanel.setLayout(null);
add(jPanel);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public boolean setTarget() {
for (int i = 0; i < Game.NB_ENEMIES; i++) {
Point[] en = getEnemyPos(i);
Rectangle r = new Rectangle(en[0].x, en[0].y, en[1].x - en[0].x,
en[1].y - en[0].y);
if (r.contains(IHM.getInstance().getCurs())
&& !Game.getInstance().enemies[i].isKo()) {
enemyTarget = i;
jPanel.repaint();
return true;
}
}
return false;
}
/**
*
* @param pvHarry
* max pv
* @param effect
*/
private void createHarry(int pvHarry, String effect) {
try {
harry = new Harry(pvHarry);
} catch (IOException e) {
e.printStackTrace();
}
jpbHarry = new JProgressBar(0, pvHarry);
jPanel.add(jpbHarry);
jpbHarry.setBounds(FIRST_COL_POS_X, harry.getHeight() - 10, harry
.getWidth(), PROGRESS_BAR_THICKNESS);
jpbHarry.setValue(pvHarry);
jpbHarry.setStringPainted(true);
jpbHarry.setString(jpbHarry.getValue() + "");
effectHarry = effect;
// repaint();
}
/**
*
* @param n
* enemy number
* @param pvEnemy
* max pv
* @param effect
* @param img
* enemy's image file
*/
public void createEnemy(Enemy enemy) {
int n = enemy.getId();
jpbEnemy[n] = new JProgressBar(0, enemy.getPv());
jPanel.add(jpbEnemy[n]);
jpbEnemy[n].setBounds(SECOND_COL_POS_X, n * ENEMY_IMG_SIZE + 120,
ENEMY_IMG_SIZE, PROGRESS_BAR_THICKNESS);
jpbEnemy[n].setValue(enemy.getPv());
jpbEnemy[n].setStringPainted(true);
jpbEnemy[n].setString(jpbEnemy[n].getValue() + "");
repaint();
}
public Point[] getHarryPos() {
return new Point[] {
new Point(MARGIN, MARGIN),
new Point(MARGIN + harry.getWidth(), MARGIN + harry.getHeight()) };
}
public Point[] getEnemyPos(int n) {
return new Point[] {
new Point(SECOND_COL_POS_X, MARGIN + n * ENEMY_IMG_SIZE),
new Point(SECOND_COL_POS_X + ENEMY_IMG_SIZE, MARGIN + n
* ENEMY_IMG_SIZE + ENEMY_IMG_SIZE) };
}
public void updateHarryPV(int damage) {
boolean ko;
try {
ko = harry.updatePv(damage);
if (ko) {
jpbHarry.setValue(0);
jpbHarry.setString("KO");
} else {
jpbHarry.setValue(harry.getPv());
jpbHarry.setString(harry.getPv() + "");
}
} catch (IOException e) {
e.printStackTrace();
}
repaint();
}
public void updateEnemyPV(int damage) {
try {
boolean ko = Game.getInstance().enemies[enemyTarget]
.updateEnemyPV(damage);
if (ko) {
jpbEnemy[enemyTarget].setValue(0);
jpbEnemy[enemyTarget].setString("KO");
} else {
jpbEnemy[enemyTarget]
.setValue(Game.getInstance().enemies[enemyTarget]
.getPv());
jpbEnemy[enemyTarget]
.setString(Game.getInstance().enemies[enemyTarget]
.getPv()
+ "");
}
} catch (IOException e) {
e.printStackTrace();
}
repaint();
}
public void updateHarryEffect(String effect) {
effectHarry = effect;
repaint();
}
public void updateEnemyEffect(int n, String effect) {
effectEnemy[n] = effect;
repaint();
}
public Point getCurs() {
return curs;
}
public void setCurs(Point curs) {
this.curs = curs;
}
public Point getDefaultStartPos(Spell sp) {
Point p = IHM.getInstance().getHarryPos()[1];
Point pMiddle = new Point(p.x,
p.y
- (IHM.getInstance().harry.getHeight() + sp
.getDimension().height) / 2);
return pMiddle;
}
public Point getTargetPos(int target, Spell sp) {
Point[] en = getEnemyPos(target);
// Rectangle r = new Rectangle(en[0].x, en[0].y, en[1].x - en[0].x,
// en[1].y - en[0].y);
Point p2 = en[0];
Point p2Middle = new Point(p2.x, p2.y
+ (IHM.ENEMY_IMG_SIZE - sp.getDimension().height) / 2);
return p2Middle;
}
public boolean cast(Spell s) {
Point target = getTargetPos(enemyTarget, s);
jPanel.add(s.getComponent());
jPanel.setComponentZOrder(s.getComponent(), 0);
jPanel.validate();
if (target != null) {
s.cast(getDefaultStartPos(s), target, jPanel, true);
return true;
}
return false;
}
public boolean enemyCast(int from) {
Random rand = new Random();
Spell s = Enemy.knownSpells.get(rand.nextInt(Enemy.knownSpells.size()));
Point target = getTargetPos(from, s);
jPanel.add(s.getComponent());
jPanel.setComponentZOrder(s.getComponent(), 0);
jPanel.validate();
if (target != null) {
s.cast(target, getDefaultStartPos(s), jPanel, false);
return true;
}
return false;
}
public void displayText(String string) {
System.out.println("TEXT!!!!");
final JLabel label = new JLabel(string);
label.setForeground(Color.RED);
Font font = label.getFont();
Font f = font.deriveFont(30f);
label.setFont(f);
Point from = new Point(getWidth()/2, getHeight());
Point to = new Point(getWidth()/2, getHeight()/2);
jPanel.add(label);
jPanel.validate();
Dimension dim = new Dimension(400, 50);
System.out.println("DIM:"+dim);
label.setSize(dim);
label.setPreferredSize(dim);
label.setMinimumSize(dim);
label.setMaximumSize(dim);
label.setVisible(false);
Animator anim = PropertySetter.createAnimator(2500, label, "location",
from, to);
anim.addTarget(new TimingTarget(){
@Override
public void begin() {
label.setVisible(true);
}
@Override
public void end() {
jPanel.remove(label);
label.setVisible(false);
jPanel.validate();
jPanel.repaint();
}
@Override
public void repeat() {
}
@Override
public void timingEvent(float fraction) {
}
});
anim.start();
}
}