表未显示图像

时间:2013-12-11 21:43:47

标签: java libgdx widget scene2d

哦,好吧......经过将近一天的努力弄明白,无法找到它......就在这里。我使用的是scene2d。

我的问题是这个,我有一个名为" Tile"它扩展了Image类(扩展了widget)并且其中的纹理大小为128x128,但是当我尝试将它添加到表(Widget Group)中时,我的Tile消失了。

编辑:我刚刚对表格进行了大小检查,并确认在表格中添加了尺寸为128x128的平铺后,表格显示为大小为0x0。 ..这里有什么问题吗?

我已经尝试过:

  • 使用addActor()而不是add(),并且Tile显示完美,但无法按照我需要的方式使用该表...
  • 使用add()添加其他actor,它们会显示出来。
  • 在其他actor的中间添加Tile,发生的事情是Tile根本不会出现,甚至不是空的空间(如果你向表中添加一个空对象会发生这种情况)。
  • 看看瓷砖的首选尺寸是否有问题,这是好的,幸福的是128x128。

OBS:我奇怪地观察到的一件事是,当我尝试在我的Tile构造函数中使用setDrawable()时(对Texture-> TextureRegion-> TextureRegionDrawable进行适当的转换),我无法获得它通过任何方式绘制,我只是通过在构造函数中调用super(Texture)来获取我的纹理,并观察Image(Drawable)构造函数,我碰巧注意到它在第一次设置drawable时做了一些其他事情,但是第一次...... AND ...即使使用超级(纹理),在向表中添加单元格时也不会显示... 也许问题出在这里?我不知道......

我的问题是:

  • 有什么问题?
  • 如果了解问题并不足以解决问题,我该怎么办?

编辑2:根据要求,以下是相关代码:

public class Tile extends Image{

// Tiles
private Texture unselected;
private Texture selected;

// InputListener for detecting mouse over
private class MouseOver extends InputListener{

    public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
        setDrawable(new TextureRegionDrawable(new TextureRegion(selected)));
    }
}
private class MouseOut extends InputListener{

    public void exit(InputEvent event, float x, float y, int pointer, Actor fromActor) {
        setDrawable(new TextureRegionDrawable(new TextureRegion(unselected)));
    }
}

public Tile(){
    super(TextureFactory.unselectedTile());
    unselected = TextureFactory.unselectedTile();
    selected = TextureFactory.selectedTile();
    this.addListener(new MouseOver());
    this.addListener(new MouseOut());
}
}

Tile有一个监听器,当我将鼠标移到它上面时会改变它的纹理。我删除了那些用于测试的监听器,但错误仍在发生,所以......不是他们。

实现Tile的屏幕(有些东西被评论,因为我希望像那样使用它...)

public class CombatScreen extends AbstractScreen{

private Table board;

public CombatScreen(SpaceGameMain game, int boardSize) {
    // Passing game to super class and getting class name for tracking
    super(game);
    this.className = this.getClass().getSimpleName();

    // Creating tile board
    board = new Table();
    /*
    for(int i = 0; i < boardSize; i++)
    {
        for(int j = 0; j < boardSize; j++){
            board.add(new Tile());
        }
        board.row();
    }
    */
}

@Override
public void show(){
    super.show();
    board.add(new Tile());
    mainStage.addActor(board);
}

public void resize(int width, int height){
    super.resize(width, height);

    board.setPosition((Gdx.graphics.getWidth() - Tile.width)/2, (Gdx.graphics.getHeight() - Tile.height)/2);
}
}

将表格设置在屏幕中间进行测试。

3 个答案:

答案 0 :(得分:3)

在badlogic论坛的Tanmay和NateS的帮助下找到解决方案,他们引导我进一步了解TableLayout。

在这种情况下,孩子的原始大小不会影响“棋盘”布局。你需要做的是使用TableLayout来设置子节点的SIZE(而不是prefSize),所以工作代码是这样的:

board.add(new Tile()).size(128, 128);

就是这样,对如何使用表格有一些简单的误解。

谢谢大家。

答案 1 :(得分:1)

Table类在使用add方法时,在布局子元素时调用getPrefWidth()和getPrefHeight()。

他们的默认值是0。

解决方案1)覆盖Tile类中的getPrefWidth()和getPrefHeight()并让它们返回您想要的任何内容。

解决方案2)使用prefSize的链表添加方法。 e.g。

table.add(actor).prefSize(200,200);

答案 2 :(得分:0)

此外,如果上述答案对其他人(如我)不起作用,则调用image.setScaling(Scaling.none)或image.setScaling(Scaling.fit)也可能是解决方案。