【问题标题】:Show bigger version of actor while actor is tapped libgdx在点击演员时显示更大版本的演员 libgdx
【发布时间】:2017-04-01 15:33:50
【问题描述】:

假设我有一个演员foo 和一个演员bar,这是foo 演员的更大版本。如何在foo 被点击时在foo 旁边显示bar,然后在不再点击foo 时让它消失(有点像工具提示)? Foo 在 stage2d 表中。 如何在点击时显示更大、更完整的演员版本?

大致了解我想要什么:

    Actor foo = new Actor();
    foo.addListener(new ActorGestureListener() {

        public void touchDown (InputEvent event, float x, float y, int pointer, int button) {
            // show bar next to foo (like a tooltip)
        }

        public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
            // make bar dissapear
        }
    });

这样的代码可以满足我的需求: 在这种情况下,toolTipCard 是我在触摸来自selectedDeck 的字符串之一时想要显示的演员。

Stage collectionStage;
List<String> selectedDeck;
TestCard tooltipCard;
Vector3 touch = new Vector3();

            selectedDeck.addListener(new ActorGestureListener() {

                public void touchDown(InputEvent event, float x, float y, int count, int button) {
                    if (selectedDeck.getItems().size > 0) {
                        tooltipCard = new TestCard(game.cardFont, cardNameToCard.get(selectedDeck.getSelected()));
                        tooltipCard.setWidth(Gdx.graphics.getWidth() / (7 * scale));
                        tooltipCard.setHeight(Gdx.graphics.getHeight() / (3.3f * scale));
                        touch = viewport.unproject(touch.set(Gdx.input.getX(), Gdx.input.getY(), 0));
                        tooltipCard.setPosition(touch.x - tooltipCard.getWidth(), touch.y - tooltipCard.getHeight());
                        collectionStage.addActor(tooltipCard);
                    }
                }

                public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                    tooltipCard.remove();
                }
            });

【问题讨论】:

  • 创建自己的 Image(foo),覆盖该 Image 的 draw 方法并使用标志绘制条(纹理或标签)。在 touchDown 方法上更改平面值。
  • 获取被点击的演员 (foo) 的位置,然后将另一个演员 (bar) 添加到舞台上转换为大小的那个位置不是更好的主意吗被窃听的演员 (foo)?
  • 不需要再创建一个actor,只有一个actor foo,bar只是foo的一部分,就像你的actor的数据成员一样。

标签: android libgdx scene2d


【解决方案1】:

如 cmets 中所述,有 2 个选项:

  1. 编辑演员的绘制方法(如果您需要显示一个非常简单的工具提示,请使用此方法)。

  2. 如果你想展示一个更高级的演员,可以有自己的动作。您可以获取 foo 的全局坐标并将演员直接添加到您设置为可见/不可见(或淡入/淡出以获得更好的外观/感觉)的舞台。

要获取您可以使用的坐标:localToStageCoordinates

Vector2 v = foo.localToStageCoordinates(new Vector2());

或相对于其中心:

Vector2 v = foo.localToStageCoordinates(new Vector2(foo.getWidth()/2,foo.getHeight()/2));

然后使用例如:bar.addAction(Actions.fadeIn(0.5f));bar.addAction(Actions.fadeOut(0.5f)); 来显示/隐藏工具提示

出于优化目的,您可以为屏幕上的所有 foo 实例重用 bar actor,并在每次点击时重新调整它的用途。这可能比为每个人都创建一个完整的演员便宜。但是,如果您甚至可以在着陆/着陆时创建和销毁它而不会出现任何问题。

【讨论】:

  • 谢谢。我已经通过获取触摸位置、取消投影并将bar 添加到该位置(在 touchDown 上),然后在 touchUp 上从舞台上移除演员来实现我想要的。但是foo 实际上是ListString,我希望在单击字符串时出现bar,问题是当我单击没有字符串的列表时,它会显示bar选择的String,所以bar 不会出现在它应该出现的位置。我怎样才能得到字符串的位置? (localToStageCoordinates 仅适用于演员)
  • 我看不出字符串是如何成为演员的。你是说标签吗?请添加您使用的实际代码,以便让我更好地了解您的意思。添加屏幕截图/绘图也会有所帮助。
  • 添加了我使用的代码。我想一个解决方案是从 List 更改为 List
  • 是的,因为您需要添加到阶段的演员才能使用该阶段的输入侦听器。不确定如何在字符串列表中添加监听器..
  • 您可以将Listener 添加到List&lt;String&gt;,因为它是一个小部件(一个列表框),它可以检测其上发生的事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
相关资源
最近更新 更多