mirror of
https://github.com/magefree/mage.git
synced 2025-12-25 04:52:07 -08:00
New way for displaying combat
This commit is contained in:
parent
77ecea1253
commit
0c785abb46
7 changed files with 198 additions and 33 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
114
Mage.Client/src/main/java/mage/client/combat/CombatManager.java
Normal file
114
Mage.Client/src/main/java/mage/client/combat/CombatManager.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue