New way for displaying combat

This commit is contained in:
magenoxx 2012-06-17 13:13:51 +04:00
parent 77ecea1253
commit 0c785abb46
7 changed files with 198 additions and 33 deletions

View file

@ -361,14 +361,14 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
if (p != null) {
Point target = p.getLocationOnScreen();
Point me = this.getLocationOnScreen();
ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() - 40, Color.red);
ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET);
} else {
for (PlayAreaPanel pa : MageFrame.getGame(gameId).getPlayers().values()) {
MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(uuid);
if (permanent != null) {
Point target = permanent.getLocationOnScreen();
Point me = this.getLocationOnScreen();
ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() + 10, Color.red);
ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET);
}
}
}
@ -383,7 +383,10 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
if (popup != null) {
popup.hide();
popupShowing = false;
ArrowBuilder.removeAllArrows();
//ArrowBuilder.removeAllArrows();
ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.TARGET);
ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.PAIRED);
ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.SOURCE);
}
}

View file

@ -0,0 +1,114 @@
package mage.client.combat;
import mage.cards.MagePermanent;
import mage.client.MageFrame;
import mage.client.game.PlayAreaPanel;
import mage.client.util.SettingsManager;
import mage.client.util.gui.ArrowBuilder;
import mage.view.CardView;
import mage.view.CombatGroupView;
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.UUID;
/**
* @author noxx
*/
public class CombatManager {
private static CombatManager combatManager;
public static CombatManager getInstance() {
if (combatManager == null) {
combatManager = new CombatManager();
}
return combatManager;
}
private Point parentPoint;
public void showCombat(List<CombatGroupView> combatView, UUID gameId) {
ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.COMBAT);
displayArrows(combatView, gameId);
}
public void hideCombat() {
ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.COMBAT);
}
private void displayArrows(List<CombatGroupView> combatView, UUID gameId) {
parentPoint = null;
for (CombatGroupView group : combatView) {
for (CardView attacker : group.getAttackers().values()) {
drawAttacker(group, attacker, gameId);
}
}
}
private void drawAttacker(CombatGroupView group, CardView attacker, UUID gameId) {
for (PlayAreaPanel pa2 : MageFrame.getGame(gameId).getPlayers().values()) {
MagePermanent attackerCard = pa2.getBattlefieldPanel().getPermanents().get(attacker.getId());
if (attackerCard != null) {
drawDefender(group, attackerCard, gameId);
drawBlockers(group, attackerCard, gameId);
}
}
}
private void drawDefender(CombatGroupView group, MagePermanent attackerCard, UUID gameId) {
UUID defenderId = group.getDefenderId();
if (defenderId != null) {
parentPoint = getParentPoint(attackerCard);
PlayAreaPanel p = MageFrame.getGame(gameId).getPlayers().get(defenderId);
if (p != null) {
Point target = p.getLocationOnScreen();
target.translate(-parentPoint.x, -parentPoint.y);
Point attackerPoint = attackerCard.getLocationOnScreen();
attackerPoint.translate(-parentPoint.x, -parentPoint.y);
ArrowBuilder.addArrow((int) attackerPoint.getX() + 45, (int) attackerPoint.getY() + 25, (int) target.getX() + 40, (int) target.getY() - 20, Color.red, ArrowBuilder.Type.COMBAT);
} else {
for (PlayAreaPanel pa : MageFrame.getGame(gameId).getPlayers().values()) {
MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(defenderId);
if (permanent != null) {
Point target = permanent.getLocationOnScreen();
target.translate(-parentPoint.x, -parentPoint.y);
Point attackerPoint = attackerCard.getLocationOnScreen();
attackerPoint.translate(-parentPoint.x, -parentPoint.y);
ArrowBuilder.addArrow((int) attackerPoint.getX() + 45, (int) attackerPoint.getY() + 25, (int) target.getX() + 40, (int) target.getY() + 10, Color.red, ArrowBuilder.Type.COMBAT);
}
}
}
}
}
private void drawBlockers(CombatGroupView group, MagePermanent attackerCard, UUID gameId) {
for (CardView blocker : group.getBlockers().values()) {
for (PlayAreaPanel pa : MageFrame.getGame(gameId).getPlayers().values()) {
MagePermanent blockerCard = pa.getBattlefieldPanel().getPermanents().get(blocker.getId());
if (blockerCard != null) {
parentPoint = getParentPoint(blockerCard);
Point blockerPoint = blockerCard.getLocationOnScreen();
blockerPoint.translate(-parentPoint.x, -parentPoint.y);
Point attackerPoint = attackerCard.getLocationOnScreen();
attackerPoint.translate(-parentPoint.x, -parentPoint.y);
double yRateA = (attackerCard.getSize().height / SettingsManager.getInstance().getCardSize().height);
double xRateA = (attackerCard.getSize().width / SettingsManager.getInstance().getCardSize().width);
double yRateB = (blockerCard.getSize().height / SettingsManager.getInstance().getCardSize().height);
double xRateB = (blockerCard.getSize().width / SettingsManager.getInstance().getCardSize().width);
ArrowBuilder.addArrow((int) blockerPoint.getX() + (int)(55*xRateB), (int) blockerPoint.getY() + (int)(25*xRateB),
(int) attackerPoint.getX() + (int)(70*xRateA), (int) attackerPoint.getY() + (int)(25*yRateA), Color.blue, ArrowBuilder.Type.COMBAT);
}
}
}
}
private Point getParentPoint(MagePermanent permanent) {
if (parentPoint == null) {
Component parentComponent = SwingUtilities.getRoot(permanent);
parentPoint = parentComponent.getLocationOnScreen();
}
return parentPoint;
}
}

View file

@ -34,20 +34,18 @@
package mage.client.dialog;
import java.awt.Color;
import java.awt.Graphics;
import mage.client.cards.BigCard;
import mage.client.game.CombatGroup;
import mage.view.CombatGroupView;
import javax.swing.*;
import java.awt.*;
import java.beans.PropertyVetoException;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import mage.client.cards.BigCard;
import mage.client.game.CombatGroup;
import mage.view.CombatGroupView;
/**
*
* @author BetaSteward_at_googlemail.com
@ -79,7 +77,7 @@ public class CombatDialog extends MageDialog {
jScrollPane1.getViewport().setOpaque(false);
getRootPane().setOpaque(false);
setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE);
//setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE);
}
public void init(UUID gameId, BigCard bigCard) {

View file

@ -38,6 +38,7 @@ import mage.Constants;
import mage.client.MageFrame;
import mage.client.cards.BigCard;
import mage.client.chat.ChatPanel;
import mage.client.combat.CombatManager;
import mage.client.components.MageComponents;
import mage.client.components.ext.dlg.DialogManager;
import mage.client.dialog.*;
@ -421,9 +422,11 @@ public class GamePanel extends javax.swing.JPanel {
showRevealed(game);
showLookedAt(game);
if (game.getCombat().size() > 0) {
combat.showDialog(game.getCombat());
//combat.showDialog(game.getCombat());
CombatManager.getInstance().showCombat(game.getCombat(), gameId);
} else {
combat.hideDialog();
//combat.hideDialog();
CombatManager.getInstance().hideCombat();
}
updatePhases(game.getStep());
this.revalidate();

View file

@ -85,14 +85,14 @@ public class MageActionCallback implements ActionCallback {
if (p != null) {
Point target = p.getLocationOnScreen();
target.translate(-parentPoint.x, -parentPoint.y);
ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() - 40, Color.red);
ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET);
} else {
for (PlayAreaPanel pa : MageFrame.getGame(data.gameId).getPlayers().values()) {
MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(uuid);
if (permanent != null) {
Point target = permanent.getLocationOnScreen();
target.translate(-parentPoint.x, -parentPoint.y);
ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.red);
ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET);
}
}
}
@ -109,7 +109,7 @@ public class MageActionCallback implements ActionCallback {
if (permanent != null) {
Point source = permanent.getLocationOnScreen();
source.translate(-parentPoint.x, -parentPoint.y);
ArrowBuilder.addArrow((int) source.getX() + 40, (int) source.getY() + 10, (int) me.getX() + 35, (int) me.getY() + 20, Color.blue);
ArrowBuilder.addArrow((int) source.getX() + 40, (int) source.getY() + 10, (int) me.getX() + 35, (int) me.getY() + 20, Color.blue, ArrowBuilder.Type.SOURCE);
}
}
}
@ -124,7 +124,7 @@ public class MageActionCallback implements ActionCallback {
if (permanent != null) {
Point target = permanent.getLocationOnScreen();
target.translate(-parentPoint.x, -parentPoint.y);
ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.green);
ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.green, ArrowBuilder.Type.PAIRED);
}
}
}
@ -262,7 +262,10 @@ public class MageActionCallback implements ActionCallback {
public void mouseExited(MouseEvent e, final TransferData data) {
hidePopup();
this.state = false;
ArrowBuilder.removeAllArrows();
//ArrowBuilder.removeAllArrows();
ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.TARGET);
ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.PAIRED);
ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.SOURCE);
}
}

View file

@ -1,7 +1,10 @@
package mage.client.util.gui;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* Class for dealing with arrows in the game.
@ -10,7 +13,13 @@ import javax.swing.JPanel;
*/
public class ArrowBuilder {
public static JPanel arrowsPanel;
private static JPanel arrowsPanel;
private final static Map<Type, java.util.List<Arrow>> map = new HashMap<Type, java.util.List<Arrow>>();
public enum Type {
PAIRED, SOURCE, TARGET, COMBAT;
}
/**
* Get the panel where all arrows are being drawn.
@ -52,13 +61,21 @@ public class ArrowBuilder {
* @param endY
* @param color
*/
public static void addArrow(int startX, int startY, int endX, int endY, Color color) {
public static void addArrow(int startX, int startY, int endX, int endY, Color color, Type type) {
JPanel p = getArrowsPanel();
Arrow arrow = new Arrow();
arrow.setColor(color);
arrow.setArrowLocation(startX, startY, endX, endY);
arrow.setBounds(0, 0, Math.max(startX, endX) + 30, Math.max(startY, endY) + 30); // 30 is offset for arrow heads (being cut otherwise)
p.add(arrow);
arrow.setBounds(0, 0, Math.max(startX, endX) + 40, Math.max(startY, endY) + 30); // 30 is offset for arrow heads (being cut otherwise)
synchronized (map) {
p.add(arrow);
java.util.List<Arrow> arrows = map.get(type);
if (arrows == null) {
arrows = new ArrayList<Arrow>();
map.put(type, arrows);
}
arrows.add(arrow);
}
p.revalidate();
p.repaint();
}
@ -68,11 +85,31 @@ public class ArrowBuilder {
*/
public static void removeAllArrows() {
JPanel p = getArrowsPanel();
if (p.getComponentCount() > 0) {
p.removeAll();
p.revalidate();
p.repaint();
}
synchronized (map) {
if (p.getComponentCount() > 0) {
p.removeAll();
p.revalidate();
p.repaint();
}
map.clear();
}
}
public static void removeArrowsByType(Type type) {
java.util.List<Arrow> arrows = map.get(type);
if (arrows != null) {
JPanel p = getArrowsPanel();
if (arrows.size() > 0) {
synchronized (map) {
for (Arrow arrow : arrows) {
p.remove(arrow);
}
map.put(type, new ArrayList<Arrow>());
}
p.revalidate();
p.repaint();
}
}
}
}