【问题标题】:libgdx - ClickListener not affected by actor scale?libgdx - ClickListener 不受演员规模的影响?
【发布时间】:2016-04-23 00:07:07
【问题描述】:

这是我正在制作的卡片类的构造函数。当我创建一个缩放并单击它时,实际上只注册了 1.0x 缩放区域内的单击。即,如果我为比例传递 1.5,则单击边框不起作用。为什么不?我已经缩放了演员本身。

public Card(float x, float y, float scale)
{
    this.setPosition(x, y);

    faceSprite = new Sprite(MyResources.getInstance().cardTextureRegion);
    faceSprite.setPosition(x, y);
    faceSprite.setScale(scale);

    borderSprite = new Sprite(MyResources.getInstance().cardBorderTextureRegion);
    borderSprite.setPosition(x, y);
    borderSprite.setScale(scale);

    // Set boundaries for ourselves (the actor).  Note that we have to match the scale of the sprites.
    setSize(borderSprite.getWidth(), borderSprite.getHeight());
    setScale(scale);

    // Add ClickListener
    final Card thisCard = this;
    addListener(new ClickListener() {
        public void clicked(InputEvent event, float x, float y) {
            ((MyStage)(thisCard.getStage())).cardClicked(thisCard);
        }
    });

}

【问题讨论】:

    标签: libgdx sprite actor clicklistener


    【解决方案1】:

    Basic Actor 类可能缺少一些功能,包括正确的比例处理。如果您只想显示一些图像(根据您使用的 Sprite 对象判断),我建议使用现有的类而不是制作自定义演员 - 特别是因为您可能无法使用精确的 Actor 参数渲染 Sprites如果您使用大量自定义操作。

    Image 允许您显示“精灵”——虽然有些简化,但应该足够了。要存储图像,您可以使用Table(更灵活)或Stack(将处理多个相同大小的图像)。

    如果你真的想坚持使用自定义演员方法,试试这个而不是改变比例:

    setSize(borderSprite.getWidth() * scale, borderSprite.getHeight() * scale);
    

    如果您不在运行时手动更改 Card 缩放比例(仅在创建期间进行设置),它应该可以正常工作。

    【讨论】:

    • 谢谢——我主要是想弄清楚为什么演员的行为不符合我的预期。我实际上已经放入了您建议的 setSize() 版本,但感觉就像是 hack。当您说“如果您使用大量自定义操作,您可能无法使用精确的 Actor 参数来渲染 Sprites?”您的意思是什么?
    • Sprite 不是Scene2D API 的一部分。您基本上必须使用旋转、原点等覆盖每个 Actor 设置器,并调用 Sprite 方法。或者根据当前的Actor 状态更新每个渲染上的Sprite 状态。例如,如果您要添加旋转或移动操作,Sprite 将忽略 Actor 参数,除非您自己手动更新它们。这对于已经实现的东西来说是很多额外的工作——只需使用Image 类来显示和管理Stage 上的图像。如果您需要将多个纹理显示为一个,请使用Group 扩展之一。
    • 好的——对 libgdx 来说还是新手,但我想我明白你在说什么。这对我来说并不是一个问题,因为现在我的 Card 类作为演员的唯一用途就是可以点击它。以后我肯定会使用一些实际的动作,我会发现你在说什么。也感谢集团的参考。一般来说,我最初认为 Sprites 可能是更好的选择,因为它会给我更多控制,但我需要“更多控制”的少数原因之一是堆叠纹理,我应该知道其他地方支持.
    【解决方案2】:

    您可以使用 image 类来显示图像。

    Texture texture=new Texture("test.jpg");
    Image image=new Image(texture);
    

    //你可以根据需要使用setsize()或setBounds()。

    image.setScale(scale);
    
    image.addListener(new ClickListener(){
         @Override
        public void clicked(InputEvent event, float x, float y) {
    
         ((MyStage)(thisCard.getStage())).cardClicked(event.getTarget());
         } 
      });
    

    【讨论】:

    • 谢谢。我知道 Image 类,但计划扩展我的 Card actor 以做更多的事情,而不仅仅是 Image 功能。最终可能还是要走的路,但我想了解为什么 Actor 没有按我预期的方式工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多