Merge pull request #1994 from kevlahnota/newmaster2

update RewardActor tooltips
This commit is contained in:
Anthony Calosa
2022-12-02 05:20:36 +08:00
committed by GitHub
5 changed files with 245 additions and 110 deletions

View File

@@ -6,6 +6,7 @@ import java.util.Deque;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.*;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
@@ -1286,6 +1287,11 @@ public class Graphics {
bitmapFont.setColor(color.r, color.g, color.b, alpha);
bitmapFont.draw(batch, text, x, y);
}
public void drawText(BitmapFont bitmapFont, GlyphLayout layout, float x, float y) {
if (bitmapFont == null || layout == null)
return;
bitmapFont.draw(batch, layout, x, y);
}
public void drawText(String text, FSkinFont font, FSkinColor skinColor, float x, float y, float w, float h, boolean wrap, int horzAlignment, boolean centerVertically) {
drawText(text, font, skinColor.getColor(), x, y, w, h, wrap, horzAlignment, centerVertically);

View File

@@ -32,6 +32,7 @@ import forge.item.IPaperCard;
import forge.player.GamePlayerUtil;
import forge.player.PlayerControllerHuman;
import forge.screens.FScreen;
import forge.screens.LoadingOverlay;
import forge.screens.match.MatchController;
import forge.sound.MusicPlaylist;
import forge.sound.SoundSystem;
@@ -65,6 +66,7 @@ public class DuelScene extends ForgeScene {
Deck playerDeck;
boolean chaosBattle = false;
boolean callbackExit = false;
private LoadingOverlay matchOverlay;
List<IPaperCard> playerExtras = new ArrayList<>();
List<IPaperCard> AIExtras = new ArrayList<>();
@@ -82,7 +84,12 @@ public class DuelScene extends ForgeScene {
}
public void GameEnd() {
boolean winner = humanPlayer == hostedMatch.getGame().getMatch().getWinner();
boolean winner = false;
try {
winner = humanPlayer == hostedMatch.getGame().getMatch().getWinner();
} catch (Exception e) {
e.printStackTrace();
}
String enemyName = (enemy.nameOverride.isEmpty() ? enemy.getData().name : enemy.nameOverride);
boolean showMessages = enemy.getData().copyPlayerDeck && Current.player().isUsingCustomDeck();
Current.player().clearBlessing();
@@ -101,6 +108,7 @@ public class DuelScene extends ForgeScene {
"Is that all you can do?", "You need to learn more to stand a chance.", "You weren't that bad.", "You made an effort at least.",
"From today, you can call me teacher.", "Hmph, predictable!", "I haven't used a fraction of my REAL power!");
String message = Aggregates.random(insult);
boolean finalWinner = winner;
FThreads.invokeInEdtNowOrLater(() -> FOptionPane.showMessageDialog(message, enemyName, new FBufferedImage(120, 120) {
@Override
protected void draw(Graphics g, float w, float h) {
@@ -111,17 +119,17 @@ public class DuelScene extends ForgeScene {
@Override
public void run(Integer result) {
if (result == 0) {
afterGameEnd(enemyName, winner);
afterGameEnd(enemyName, finalWinner, true);
}
}
}));
} else {
afterGameEnd(enemyName, winner);
afterGameEnd(enemyName, winner, false);
}
}
void afterGameEnd(String enemyName, boolean winner) {
Gdx.app.postRunnable(() -> {
void afterGameEnd(String enemyName, boolean winner, boolean showOverlay) {
Runnable runnable = () -> Gdx.app.postRunnable(()-> {
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
dungeonEffect = null;
callbackExit = false;
@@ -134,6 +142,14 @@ public class DuelScene extends ForgeScene {
((IAfterMatch) last).setWinner(winner);
}
});
if (showOverlay) {
FThreads.invokeInEdtNowOrLater(() -> {
matchOverlay = new LoadingOverlay(runnable, true);
matchOverlay.show();
});
} else {
runnable.run();
}
}
void addEffects(RegisteredPlayer player, Array<EffectData> effects) {
@@ -311,13 +327,17 @@ public class DuelScene extends ForgeScene {
"It's all or nothing!", "It's all on the line!", "You can't back down now!", "Do you have what it takes?", "What will happen next?",
"Don't blink!", "You can't lose here!", "There's no turning back!", "It's all or nothing now!");
String message = Aggregates.random(list);
FThreads.delayInEDT(600, () -> FThreads.invokeInEdtNowOrLater(() -> FOptionPane.showMessageDialog(message, enemy.nameOverride.isEmpty() ? enemy.getData().name : enemy.nameOverride, new FBufferedImage(120, 120) {
@Override
protected void draw(Graphics g, float w, float h) {
if (FSkin.getAvatars().get(90001) != null)
g.drawImage(FSkin.getAvatars().get(90001), 0, 0, w, h);
}
})));
matchOverlay = new LoadingOverlay(() -> FThreads.delayInEDT(300, () -> FThreads.invokeInEdtNowOrLater(() ->
FOptionPane.showMessageDialog(message, enemy.nameOverride.isEmpty() ? enemy.getData().name : enemy.nameOverride,
new FBufferedImage(120, 120) {
@Override
protected void draw(Graphics g, float w, float h) {
if (FSkin.getAvatars().get(90001) != null)
g.drawImage(FSkin.getAvatars().get(90001), 0, 0, w, h);
}
}))), false);
} else {
matchOverlay = new LoadingOverlay(null);
}
for (final Player p : hostedMatch.getGame().getPlayers()) {
@@ -329,6 +349,7 @@ public class DuelScene extends ForgeScene {
}
}
super.enter();
matchOverlay.show();
}
@Override

View File

@@ -1,10 +1,7 @@
package forge.adventure.scene;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import forge.Forge;
import forge.animation.ForgeAnimation;
import forge.assets.ImageCache;
import forge.gamemodes.match.LobbySlotType;
import forge.interfaces.IUpdateable;
import forge.screens.FScreen;
@@ -16,14 +13,15 @@ import java.util.List;
/**
* base class to render base forge screens like the deck editor and matches
*/
public abstract class ForgeScene extends Scene implements IUpdateable {
public abstract class ForgeScene extends Scene implements IUpdateable {
@Override
public void dispose() {
}
@Override
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Clear the screen.
/*Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Clear the screen.
if (getScreen() == null) {
return;
}
@@ -50,30 +48,31 @@ public abstract class ForgeScene extends Scene implements IUpdateable {
}
}
}
Forge.getGraphics().end();
Forge.getGraphics().end();*/
}
@Override
public void act(float delta) {
ImageCache.allowSingleLoad();
ForgeAnimation.advanceAll();
/*ImageCache.allowSingleLoad();
ForgeAnimation.advanceAll();*/
}
@Override
public void enter() {
FOverlay.hideAll();
if(getScreen()!=null)
if (getScreen() != null)
getScreen().setSize(Forge.getScreenWidth(), Forge.getScreenHeight());
//update language for ForgeScene
Forge.getLocalizer().setEnglish(Forge.forcedEnglishonCJKMissing);
Forge.openScreen(getScreen());
Gdx.input.setInputProcessor(Forge.getInputProcessor());
}
public abstract FScreen getScreen();
public void buildTouchListeners(int x, int y, List<FDisplayObject> potentialListeners) {
if(getScreen()!=null)
if (getScreen() != null)
getScreen().buildTouchListeners(x, y, potentialListeners);
}

View File

@@ -5,6 +5,8 @@ import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
@@ -30,7 +32,6 @@ import forge.ImageKeys;
import forge.adventure.data.ItemData;
import forge.adventure.scene.Scene;
import forge.assets.FSkin;
import forge.assets.FSkinFont;
import forge.assets.ImageCache;
import forge.card.CardImageRenderer;
import forge.card.CardRenderer;
@@ -49,7 +50,7 @@ import static forge.adventure.util.Paths.ITEMS_ATLAS;
* Render the rewards as a card on the reward scene.
*/
public class RewardActor extends Actor implements Disposable, ImageFetcher.Callback {
Tooltip<Image> tooltip;
ImageToolTip tooltip;
HoldTooltip holdTooltip;
Reward reward;
ShaderProgram shaderGrayscale = Forge.getGraphics().getShaderGrayscale();
@@ -86,15 +87,17 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
if (T != null)
T.dispose();
}
public boolean toolTipIsVisible()
{
if(holdTooltip!=null)
return holdTooltip.tooltip_actor.getStage()!=null;
return false;
}
public boolean toolTipIsVisible() {
if (holdTooltip != null)
return holdTooltip.tooltip_actor.getStage() != null;
return false;
}
public Reward getReward() {
return reward;
}
@Override
public void onImageFetched() {
String imageKey = reward.getCard().getImageKey(false);
@@ -109,7 +112,7 @@ public boolean toolTipIsVisible()
if (!Forge.getAssets().manager().contains(imageFile.getPath())) {
Forge.getAssets().manager().load(imageFile.getPath(), Texture.class, Forge.getAssets().getTextureFilter());
Forge.getAssets().manager().finishLoadingAsset(imageFile.getPath());
count+=1;
count += 1;
}
Texture replacement = Forge.getAssets().manager().get(imageFile.getPath(), Texture.class, false);
if (replacement == null)
@@ -122,7 +125,7 @@ public boolean toolTipIsVisible()
}
toolTipImage.remove();
toolTipImage = new Image(processDrawable(image));
if (GuiBase.isAndroid()||Forge.hasGamepad()) {
if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (holdTooltip.tooltip_image.getDrawable() instanceof TextureRegionDrawable) {
((TextureRegionDrawable) holdTooltip.tooltip_image.getDrawable()).getRegion().getTexture().dispose();
}
@@ -155,7 +158,7 @@ public boolean toolTipIsVisible()
if (!Forge.getAssets().manager().contains(frontFace.getPath())) {
Forge.getAssets().manager().load(frontFace.getPath(), Texture.class, Forge.getAssets().getTextureFilter());
Forge.getAssets().manager().finishLoadingAsset(frontFace.getPath());
count+=1;
count += 1;
}
Texture front = Forge.getAssets().manager().get(frontFace.getPath(), Texture.class, false);
if (front != null) {
@@ -164,7 +167,7 @@ public boolean toolTipIsVisible()
loaded = false;
}
} catch (Exception e) {
System.err.println("Failed to load image: "+frontFace.getPath());
System.err.println("Failed to load image: " + frontFace.getPath());
loaded = false;
}
} else {
@@ -183,13 +186,13 @@ public boolean toolTipIsVisible()
ImageCache.updateSynqCount(backFace, 1);
}
} catch (Exception e) {
System.err.println("Failed to load image: "+backFace.getPath());
System.err.println("Failed to load image: " + backFace.getPath());
}
}
}
} else {
String imagePath = ImageUtil.getImageRelativePath(reward.getCard(), "", true, false);
File lookup = ImageKeys.hasSetLookup(imagePath) ? ImageKeys.setLookUpFile(imagePath, imagePath+"border") : null;
File lookup = ImageKeys.hasSetLookup(imagePath) ? ImageKeys.setLookUpFile(imagePath, imagePath + "border") : null;
int count = 0;
if (lookup != null) {
try {
@@ -206,7 +209,7 @@ public boolean toolTipIsVisible()
}
ImageCache.updateSynqCount(lookup, count);
} catch (Exception e) {
System.err.println("Failed to load image: "+lookup.getPath());
System.err.println("Failed to load image: " + lookup.getPath());
loaded = false;
}
} else if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) {
@@ -225,10 +228,9 @@ public boolean toolTipIsVisible()
Pixmap drawingMap = new Pixmap((int) backSprite.getWidth(), (int) backSprite.getHeight(), Pixmap.Format.RGBA8888);
DrawOnPixmap.draw(drawingMap, backSprite);
if(reward.getItem()==null)
{
if (reward.getItem() == null) {
needsToBeDisposed = true;
image=new Texture(drawingMap);
image = new Texture(drawingMap);
break;
}
Sprite item = reward.getItem().sprite();
@@ -236,8 +238,8 @@ public boolean toolTipIsVisible()
DrawOnPixmap.draw(drawingMap, (int) ((backSprite.getWidth() / 2f) - item.getWidth() / 2f), (int) ((backSprite.getHeight() / 4f) * 1.7f), item);
//DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getItem().name), 0, (int) ((backSprite.getHeight() / 8f) * 1f), backSprite.getWidth(), false);
setItemTooltips(item);
image=new Texture(drawingMap);
setItemTooltips(item, backSprite);
image = new Texture(drawingMap);
drawingMap.dispose();
needsToBeDisposed = true;
break;
@@ -250,23 +252,25 @@ public boolean toolTipIsVisible()
Pixmap drawingMap = new Pixmap((int) backSprite.getWidth(), (int) backSprite.getHeight(), Pixmap.Format.RGBA8888);
DrawOnPixmap.draw(drawingMap, backSprite);
Sprite gold = atlas.createSprite(reward.type.toString());
DrawOnPixmap.draw(drawingMap, (int) ((backSprite.getWidth() / 2f) - gold.getWidth() / 2f), (int) ((backSprite.getHeight() / 4f) * 1f), gold);
DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getCount()), 0, (int) ((backSprite.getHeight() / 4f) * 2f)-1, backSprite.getWidth(), true,Color.WHITE);
Sprite item = atlas.createSprite(reward.type.toString());
DrawOnPixmap.draw(drawingMap, (int) ((backSprite.getWidth() / 2f) - item.getWidth() / 2f), (int) ((backSprite.getHeight() / 4f) * 1f), item);
DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getCount()), 0, (int) ((backSprite.getHeight() / 4f) * 2f) - 1, backSprite.getWidth(), true, Color.WHITE);
image=new Texture(drawingMap);
setItemTooltips(item, backSprite);
image = new Texture(drawingMap);
drawingMap.dispose();
needsToBeDisposed = true;
break;
}
}
if (GuiBase.isAndroid()||Forge.hasGamepad()) {
if (GuiBase.isAndroid() || Forge.hasGamepad()) {
addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
if (flipOnClick)
flip();
}
@Override
public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
hover = true;
@@ -276,6 +280,7 @@ public boolean toolTipIsVisible()
public void exit(InputEvent event, float x, float y, int pointer, Actor fromActor) {
hover = false;
}
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
hover = true;
@@ -311,6 +316,7 @@ public boolean toolTipIsVisible()
});
}
}
private void switchTooltip() {
if (!Reward.Type.Card.equals(reward.type))
return;
@@ -318,7 +324,7 @@ public boolean toolTipIsVisible()
return;
Texture alt = ImageCache.getImage(reward.getCard().getImageKey(true), false);
PaperCard altCard = ImageUtil.getPaperCardFromImageKey(reward.getCard().getCardAltImageKey());
if (GuiBase.isAndroid()||Forge.hasGamepad()) {
if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (alternate) {
if (alt != null) {
holdTooltip.tooltip_actor.clear();
@@ -352,6 +358,7 @@ public boolean toolTipIsVisible()
}
}
}
private TextureRegionDrawable processDrawable(Texture texture) {
TextureRegionDrawable drawable = new TextureRegionDrawable(ImageCache.croppedBorderImage(texture));
float origW = texture.getWidth();
@@ -368,7 +375,7 @@ public boolean toolTipIsVisible()
newH = boundH;
newW = (newH * origW) / origH;
}
float AR = 480f/270f;
float AR = 480f / 270f;
int x = Forge.getDeviceAdapter().getRealScreenSize(false).getLeft();
int y = Forge.getDeviceAdapter().getRealScreenSize(false).getRight();
int realX = Forge.getDeviceAdapter().getRealScreenSize(true).getLeft();
@@ -380,25 +387,26 @@ public boolean toolTipIsVisible()
}
float fW = x > y ? x : y;
float fH = x > y ? y : x;
float mul = fW/fH < AR ? AR/(fW/fH) : (fW/fH)/AR;
float mul = fW / fH < AR ? AR / (fW / fH) : (fW / fH) / AR;
Float custom = Forge.isLandscapeMode() ? Config.instance().getSettingData().cardTooltipAdjLandscape : Config.instance().getSettingData().cardTooltipAdj;
if (custom != null && custom != 1f) {
mul *= custom;
} else {
if (fW/fH >= 2f) {//tall display
mul = (fW/fH) - ((fW/fH)/AR);
if ((fW/fH) >= 2.1f && (fW/fH) < 2.2f)
if (fW / fH >= 2f) {//tall display
mul = (fW / fH) - ((fW / fH) / AR);
if ((fW / fH) >= 2.1f && (fW / fH) < 2.2f)
mul *= 0.9f;
else if ((fW/fH) > 2.2f) //ultrawide 21:9 Galaxy Fold, Huawei X2, Xperia 1
else if ((fW / fH) > 2.2f) //ultrawide 21:9 Galaxy Fold, Huawei X2, Xperia 1
mul *= 0.8f;
}
}
if (Forge.isLandscapeMode())
drawable.setMinSize(newW*mul, newH);
drawable.setMinSize(newW * mul, newH);
else
drawable.setMinSize(newW, newH*mul);
drawable.setMinSize(newW, newH * mul);
return drawable;
}
private void setCardImage(Texture img) {
if (img == null)
return;
@@ -407,41 +415,41 @@ public boolean toolTipIsVisible()
image.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear);
if (toolTipImage == null)
toolTipImage = new Image(processDrawable(image));
if (GuiBase.isAndroid()||Forge.hasGamepad()) {
if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (holdTooltip == null)
holdTooltip = new HoldTooltip(toolTipImage);
if (frontSideUp())
addListener(holdTooltip);
addListener(holdTooltip);
} else {
if (tooltip == null)
tooltip = new Tooltip<Image>(toolTipImage);
tooltip = new ImageToolTip(toolTipImage);
tooltip.setInstant(true);
if (frontSideUp())
addListener(tooltip);
addListener(tooltip);
}
}
public void showTooltip() {
if (holdTooltip != null) {
holdTooltip.show();
}
}
public void hideTooltip() {
if (holdTooltip != null) {
holdTooltip.hide();
}
}
private Texture renderPlaceholder(Graphics g, PaperCard card){ //Use CardImageRenderer to output a Texture.
if(renderedCount++ == 0) {
private Texture renderPlaceholder(Graphics g, PaperCard card) { //Use CardImageRenderer to output a Texture.
if (renderedCount++ == 0) {
//The first time we find a card that has no art, render one out of view to fully initialize CardImageRenderer.
g.begin(preview_w, preview_h);
CardImageRenderer.drawCardImage(g, CardView.getCardForUi(reward.getCard()), false, -(preview_w + 20), 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.allowCardBG, true);
g.end();
}
Matrix4 m = new Matrix4();
Matrix4 m = new Matrix4();
FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGB888, preview_w, preview_h, false);
frameBuffer.begin();
m.setToOrtho2D(0,preview_h, preview_w, -preview_h); //So it renders flipped directly.
m.setToOrtho2D(0, preview_h, preview_w, -preview_h); //So it renders flipped directly.
g.begin(preview_w, preview_h);
g.setProjectionMatrix(m);
@@ -457,30 +465,38 @@ public boolean toolTipIsVisible()
return result;
}
private void setItemTooltips(Sprite icon) {
private void setItemTooltips(Sprite icon, Sprite backSprite) {
if (generatedTooltip == null) {
float icon_w = 64f; float icon_h = 64f; //Sizes for the embedded icon. Could be made smaller on smaller resolutions.
Matrix4 m = new Matrix4();
Matrix4 m = new Matrix4();
GlyphLayout layout = new GlyphLayout();
ItemData item = getReward().getItem();
FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, preview_w, preview_h, false);
frameBuffer.begin();
m.setToOrtho2D(0,preview_h, preview_w, -preview_h); //So it renders flipped directly.
getGraphics().begin(preview_w, preview_h);
getGraphics().setProjectionMatrix(m);
getGraphics().startClip();
//Draw item description panel.
getGraphics().fillRect(new Color(0f, 0f, 0f, 0.96f), 0, 0, preview_w, preview_h); //Translucent background.
getGraphics().drawRectLines(2, Color.WHITE, 0, 0, preview_w, preview_h); //Add a border.
getGraphics().drawImage(icon, 2, 2, icon_w, icon_h); //Draw the item's icon.
getGraphics().drawText(item.name, FSkinFont.get(24), Color.WHITE, icon_w + 2, 2, preview_w - (icon_w + 2), icon_h, false, 1, true); //Item name.
getGraphics().drawRectLines(1, Color.WHITE, 6, icon_h + 2, preview_w - 12, preview_h - (icon_h + 6)); //Description border.
getGraphics().drawText(item.getDescription(), FSkinFont.get(18), Color.WHITE, 10, icon_h + 8, preview_w - 10, preview_h - 4, true, Align.left, false); //Description.
getGraphics().end();
getGraphics().endClip();
generatedTooltip = new Texture(Pixmap.createFromFrameBuffer(0, 0, preview_w, preview_h), Forge.isTextureFilteringEnabled());
frameBuffer.end();
getGraphics().dispose();
frameBuffer.dispose();
try {
m.setToOrtho2D(0, preview_h, preview_w, -preview_h); //So it renders flipped directly.
getGraphics().begin(preview_w, preview_h);
getGraphics().setProjectionMatrix(m);
getGraphics().startClip();
getGraphics().drawImage(backSprite, 0, 0, preview_w, preview_h);
getGraphics().drawImage(icon, preview_w / 2 - 75, 160, 160, 160);
BitmapFont font = Controls.getBitmapFont("default", 4 / (preview_h / preview_w));
layout.setText(font, item != null ? item.name : getReward().type.name(), Color.WHITE, preview_w - 64, Align.center, true);
getGraphics().drawText(font, layout, 32, preview_h - 70);
font = Controls.getBitmapFont("default", 3.5f / (preview_h / preview_w));
layout.setText(font, item != null ? item.getDescription() : "Adds " +
String.valueOf(getReward().getCount()) + " " + getReward().type, Color.WHITE, preview_w - 128, item != null ? Align.left : Align.center, true);
getGraphics().drawText(font, layout, 64, preview_h / 2.5f);
getGraphics().end();
getGraphics().endClip();
generatedTooltip = new Texture(Pixmap.createFromFrameBuffer(0, 0, preview_w, preview_h), Forge.isTextureFilteringEnabled());
} catch (Exception e) {
e.printStackTrace();
} finally {
frameBuffer.end();
getGraphics().dispose();
frameBuffer.dispose();
Controls.getBitmapFont("default");
}
}
//Rendering code ends here.
@@ -488,18 +504,16 @@ public boolean toolTipIsVisible()
if (toolTipImage == null)
toolTipImage = new Image(processDrawable(generatedTooltip));
if (frontSideUp()) {
if (GuiBase.isAndroid()||Forge.hasGamepad()) {
if (holdTooltip == null)
holdTooltip = new HoldTooltip(toolTipImage);
addListener(holdTooltip);
} else {
if (tooltip == null) {
tooltip = new Tooltip<>(toolTipImage);
tooltip.setInstant(true);
}
addListener(tooltip);
if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (holdTooltip == null)
holdTooltip = new HoldTooltip(toolTipImage);
addListener(holdTooltip);
} else {
if (tooltip == null) {
tooltip = new ImageToolTip(toolTipImage);
tooltip.setInstant(true);
}
addListener(tooltip);
}
}
@@ -510,18 +524,21 @@ public boolean toolTipIsVisible()
public boolean isFlipped() {
return (clicked && flipProcess >= 1);
}
public void removeTooltip() {
if (tooltip != null) {
tooltip.getActor().remove();
}
}
public void clearHoldToolTip() {
if (holdTooltip != null) {
try {
hover = false;
holdTooltip.tooltip_actor.clear();
holdTooltip.tooltip_actor.remove();
} catch (Exception e){}
} catch (Exception e) {
}
}
}
@@ -531,6 +548,7 @@ public boolean toolTipIsVisible()
clicked = true;
flipProcess = 0;
}
public void sold() {
//todo add new card to be sold???
if (sold)
@@ -538,6 +556,7 @@ public boolean toolTipIsVisible()
sold = true;
getColor().a = 0.5f;
}
@Override
public void act(float delta) {
super.act(delta);
@@ -547,12 +566,12 @@ public boolean toolTipIsVisible()
else
flipProcess = 1;
if (GuiBase.isAndroid()||Forge.hasGamepad()) {
if (holdTooltip != null && frontSideUp() && !getListeners().contains(holdTooltip, true)) {
if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (holdTooltip != null && !getListeners().contains(holdTooltip, true)) {
addListener(holdTooltip);
}
} else {
if (tooltip != null && frontSideUp() && !getListeners().contains(tooltip, true)) {
if (tooltip != null && !getListeners().contains(tooltip, true)) {
addListener(tooltip);
}
}
@@ -569,7 +588,7 @@ public boolean toolTipIsVisible()
applyProjectionMatrix(batch);
if (hover|hasKeyboardFocus())
if (hover | hasKeyboardFocus())
batch.setColor(0.5f, 0.5f, 0.5f, 1);
@@ -609,6 +628,7 @@ public boolean toolTipIsVisible()
batch.draw(image, x, -getHeight() / 2, width, getHeight());
}
}
private void drawCard(Batch batch, Texture image, float x, float width) {
if (image != null) {
if (!sold)
@@ -629,11 +649,13 @@ public boolean toolTipIsVisible()
}
}
}
private Graphics getGraphics() {
if (graphics == null)
graphics = new Graphics();
return graphics;
}
private void applyProjectionMatrix(Batch batch) {
final Vector3 direction = new Vector3(0, 0, -1);
final Vector3 up = new Vector3(0, 1, 0);
@@ -689,6 +711,19 @@ public boolean toolTipIsVisible()
return computedTransform;
}
class ImageToolTip extends Tooltip<Image> {
public ImageToolTip(Image contents) {
super(contents);
}
@Override
public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
if (!frontSideUp())
return;
super.enter(event, x, y, pointer, fromActor);
}
}
class HoldTooltip extends ActorGestureListener {
Image tooltip_image;
Table tooltip_actor;
@@ -717,6 +752,8 @@ public boolean toolTipIsVisible()
@Override
public boolean longPress(Actor actor, float x, float y) {
if (!frontSideUp())
return false;
TextraButton done = actor.getStage().getRoot().findActor("done");
if (done != null && Reward.Type.Card.equals(reward.type)) {
switchButton.setBounds(done.getX(), done.getY(), done.getWidth(), done.getHeight());
@@ -728,7 +765,7 @@ public boolean toolTipIsVisible()
//right if poosible, if exceeds width, draw left
tooltip_actor.setX(actor.getRight());
if (tooltip_actor.getX() + tooltip_actor.getWidth() > Scene.getIntendedWidth())
tooltip_actor.setX(Math.max(0,actor.getX() - tooltip_actor.getWidth()));
tooltip_actor.setX(Math.max(0, actor.getX() - tooltip_actor.getWidth()));
} else {
//middle
tooltip_actor.setX(Scene.getIntendedWidth() / 2 - tooltip_actor.getWidth() / 2);
@@ -754,12 +791,16 @@ public boolean toolTipIsVisible()
}
super.tap(event, x, y, count, button);
}
public void show() {
if (!frontSideUp())
return;
tooltip_actor.setX(Scene.getIntendedWidth() / 2 - tooltip_actor.getWidth() / 2);
tooltip_actor.setY(Scene.getIntendedHeight() / 2 - tooltip_actor.getHeight() / 2);
getStage().addActor(tooltip_actor);
shown = true;
}
public void hide() {
tooltip_actor.remove();
switchButton.remove();

View File

@@ -1,10 +1,12 @@
package forge.screens;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Align;
import forge.Forge;
import forge.Graphics;
import forge.animation.ForgeAnimation;
import forge.assets.FSkin;
import forge.assets.FSkinColor;
import forge.assets.FSkinColor.Colors;
@@ -20,19 +22,26 @@ public class LoadingOverlay extends FOverlay {
private static final float LOGO_SIZE_FACTOR = 0.7f;
private static final float INSETS_FACTOR = 0.025f;
private static final FSkinFont FONT = FSkinFont.get(22);
private BGAnimation bgAnimation;
private Runnable runnable;
private boolean afterMatch;
private static FSkinColor getOverlayColor() {
if (Forge.isMobileAdventureMode)
return FSkinColor.get(Colors.ADV_CLR_ACTIVE).alphaColor(0.75f);
return FSkinColor.get(Colors.CLR_ACTIVE).alphaColor(0.75f);
}
private static FSkinColor getForeColor() {
if (Forge.isMobileAdventureMode)
return FSkinColor.get(Colors.ADV_CLR_TEXT);
return FSkinColor.get(Colors.CLR_TEXT);
}
public static void show(String caption0, final Runnable runnable) {
show(caption0, false, runnable);
}
public static void show(String caption0, boolean textMode, final Runnable runnable) {
final LoadingOverlay loader = new LoadingOverlay(caption0, textMode);
loader.show(); //show loading overlay then delay running remaining logic so UI can respond
@@ -53,18 +62,27 @@ public class LoadingOverlay extends FOverlay {
}
private String caption;
private boolean textMode = false;
public LoadingOverlay(String caption0) {
caption = caption0;
textMode = false;
}
private boolean textMode = false, match = false;
private TextureRegion textureRegion;
public LoadingOverlay(String caption0, boolean textOnly) {
caption = caption0;
textMode = textOnly;
}
public LoadingOverlay(Runnable toRunBeforeMatch) {
this(toRunBeforeMatch, false);
}
public LoadingOverlay(Runnable toRunBeforeMatch, boolean aftermatch) {
caption = "";
textMode = true;
textureRegion = Forge.takeScreenshot();
match = true;
bgAnimation = new BGAnimation();
runnable = toRunBeforeMatch;
afterMatch = aftermatch;
}
public void setCaption(String caption0) {
caption = caption0;
}
@@ -80,6 +98,13 @@ public class LoadingOverlay extends FOverlay {
@Override
public void drawOverlay(Graphics g) {
if (match) {
if (bgAnimation != null) {
bgAnimation.start();
bgAnimation.drawBackground(g);
return;
}
}
if (!textMode) {
float x = INSETS;
float panelWidth = getWidth() - 2 * INSETS;
@@ -114,4 +139,47 @@ public class LoadingOverlay extends FOverlay {
g.drawText(caption, FONT, getForeColor(), 0, 0, getWidth(), getHeight(), true, Align.center, true);
}
}
@Override
public boolean keyDown(int keyCode) {
if (match)
return true;
return super.keyDown(keyCode);
}
private class BGAnimation extends ForgeAnimation {
float DURATION = 0.9f;
private float progress = 0;
public void drawBackground(Graphics g) {
float percentage = progress / DURATION;
float oldAlpha = g.getfloatAlphaComposite();
if (percentage < 0) {
percentage = 0;
} else if (percentage > 1) {
percentage = 1;
}
if (afterMatch) {
g.drawGrayTransitionImage(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), false, percentage);
} else {
g.setAlphaComposite(1 - percentage);
g.drawImage(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
g.setAlphaComposite(oldAlpha);
}
}
@Override
protected boolean advance(float dt) {
progress += dt;
return progress < DURATION;
}
@Override
protected void onEnd(boolean endingAll) {
match = false;
hide();
if (runnable != null)
runnable.run();
}
}
}