Add targeting arrow support

This commit is contained in:
drdev
2014-12-06 07:37:33 +00:00
parent fe2547527e
commit 48bf499e89
3 changed files with 78 additions and 18 deletions

View File

@@ -23,6 +23,7 @@ import forge.assets.FSkinColor.Colors;
import forge.game.card.CardView;
import forge.game.player.PlayerView;
import forge.screens.match.views.VCardDisplayArea.CardAreaPanel;
import forge.toolbox.FDisplayObject;
import forge.util.Utils;
import com.badlogic.gdx.graphics.Color;
@@ -64,6 +65,11 @@ public class TargetingOverlay {
MatchController.getView().getPlayerPanel(targetPlayer).getAvatar().getTargetingArrowOrigin(),
connectsFoes);
}
public static void drawArrow(Graphics g, FDisplayObject startCardDisplay, FDisplayObject endCardDisplay, boolean connectsFoes) {
drawArrow(g, CardAreaPanel.getTargetingArrowOrigin(startCardDisplay, false),
CardAreaPanel.getTargetingArrowOrigin(endCardDisplay, false),
connectsFoes);
}
public static void drawArrow(Graphics g, Vector2 start, Vector2 end, boolean connectsFoes) {
if (start == null || end == null) { return; }

View File

@@ -15,6 +15,7 @@ import forge.card.CardZoom.ActivateHandler;
import forge.game.card.CardView;
import forge.match.MatchUtil;
import forge.toolbox.FCardPanel;
import forge.toolbox.FDisplayObject;
import forge.util.ThreadUtil;
public abstract class VCardDisplayArea extends VDisplayArea implements ActivateHandler {
@@ -376,21 +377,18 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH
return cards;
}
public Vector2 getTargetingArrowOrigin() {
//don't show targeting arrow unless in display area that's visible
if (displayArea == null || !displayArea.isVisible()) { return null; }
Vector2 origin = new Vector2(screenPos.x, screenPos.y);
public static Vector2 getTargetingArrowOrigin(FDisplayObject cardDisplay, boolean isTapped) {
Vector2 origin = new Vector2(cardDisplay.screenPos.x, cardDisplay.screenPos.y);
float left = PADDING;
float top = PADDING;
float w = getWidth() - 2 * PADDING;
float h = getHeight() - 2 * PADDING;
float w = cardDisplay.getWidth() - 2 * PADDING;
float h = cardDisplay.getHeight() - 2 * PADDING;
if (w == h) { //adjust width if needed to make room for tapping
w = h / ASPECT_RATIO;
}
if (isTapped()) { //rotate box if tapped
if (isTapped) { //rotate box if tapped
top += h - w;
float temp = w;
w = h;
@@ -403,6 +401,13 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH
return origin;
}
public Vector2 getTargetingArrowOrigin() {
//don't show targeting arrow unless in display area that's visible
if (displayArea == null || !displayArea.isVisible()) { return null; }
return getTargetingArrowOrigin(this, isTapped());
}
@Override
protected float getTappedAngle() {
if (displayArea != null && displayArea.rotateCards180) {

View File

@@ -31,6 +31,7 @@ import forge.planarconquest.ConquestPlaneData;
import forge.planarconquest.ConquestPlaneData.RegionData;
import forge.planarconquest.ConquestPreferences.CQPref;
import forge.screens.FScreen;
import forge.screens.match.TargetingOverlay;
import forge.toolbox.FCardPanel;
import forge.toolbox.FContainer;
import forge.toolbox.FDisplayObject;
@@ -108,6 +109,35 @@ public class ConquestMapScreen extends FScreen {
g.drawImage(background, 0, getHeight() - h, w, h); //retain proportions, remaining area will be covered by back color
}
@Override
protected void drawOverlay(Graphics g) {
ConquestCommander commander = regionDisplay.deployedCommander.commander;
if (commander == null) { return; }
int idx;
switch (commander.getCurrentDayAction()) {
case Attack1:
TargetingOverlay.drawArrow(g, regionDisplay.deployedCommander, regionDisplay.opponents[0], true);
break;
case Attack2:
TargetingOverlay.drawArrow(g, regionDisplay.deployedCommander, regionDisplay.opponents[1], true);
break;
case Attack3:
TargetingOverlay.drawArrow(g, regionDisplay.deployedCommander, regionDisplay.opponents[2], true);
break;
case Deploy:
idx = model.getCurrentPlane().getCommanders().indexOf(regionDisplay.deployedCommander.commander);
TargetingOverlay.drawArrow(g, commanderRow.panels[idx], regionDisplay.deployedCommander, false);
break;
case Undeploy:
idx = model.getCurrentPlane().getCommanders().indexOf(regionDisplay.deployedCommander.commander);
TargetingOverlay.drawArrow(g, regionDisplay.deployedCommander, commanderRow.panels[idx], false);
break;
default:
break;
}
}
@Override
protected void doLayout(float startY, float width, float height) {
btnEndDay.setSize(width / 2, btnEndDay.getAutoSizeBounds().height);
@@ -233,24 +263,43 @@ public class ConquestMapScreen extends FScreen {
}
else if (index > -4) { //opponent panel
ConquestCommander commander = regionDisplay.deployedCommander.commander;
if (commander != null && commander.getCurrentDayAction() == null) {
//TODO: Attack opponent
if (commander != null && commander.getCurrentDayAction() != ConquestAction.Deploy) {
ConquestAction action;
switch (index) {
case -1:
action = ConquestAction.Attack1;
break;
case -2:
action = ConquestAction.Attack2;
break;
default:
action = ConquestAction.Attack3;
break;
}
if (commander.getCurrentDayAction() == action) {
action = null; //toggle off set to attack this opponent
}
commander.setCurrentDayAction(action);
}
}
else { //deploy panel - toggle whether selected commander is deployed to current region
if (commanderRow.selectedIndex != -1) {
ConquestCommander commander = commanderRow.panels[commanderRow.selectedIndex].commander;
if (commander.getCurrentDayAction() == null) {
regionDisplay.deployedCommander.setCommander(commander);
regionDisplay.data.setDeployedCommander(commander);
commander.setCurrentDayAction(ConquestAction.Deploy);
commander.setDeployedRegion(regionDisplay.data.getRegion());
if (regionDisplay.deployedCommander.commander == null) {
regionDisplay.deployedCommander.setCommander(commander);
regionDisplay.data.setDeployedCommander(commander);
commander.setCurrentDayAction(ConquestAction.Deploy);
commander.setDeployedRegion(regionDisplay.data.getRegion());
}
}
else if (commander.getCurrentDayAction() == ConquestAction.Deploy) {
regionDisplay.deployedCommander.setCommander(null);
regionDisplay.data.setDeployedCommander(null);
commander.setCurrentDayAction(null);
commander.setDeployedRegion(null);
if (regionDisplay.deployedCommander.commander == commander) {
regionDisplay.deployedCommander.setCommander(null);
regionDisplay.data.setDeployedCommander(null);
commander.setCurrentDayAction(null);
commander.setDeployedRegion(null);
}
}
}
}