【问题标题】:LibGDX Button not responding on touchLibGDX 按钮在触摸时没有响应
【发布时间】:2025-12-08 03:35:01
【问题描述】:

我的第一个问题是文本字段没有显示,第二个问题是按钮没有响应。我的想法是当触摸图像“vault1”时,文本字段应显示 5。

这是我想出的,我无法弄清楚我做错了什么。

(我只剪掉了必要的代码)

public void render(float delta) {

    drawSprite("vault1", 600, 450);
}

public void show() {

    Gdx.input.setInputProcessor(stage);
    skin = new Skin(Gdx.files.internal("ui/menuSkin.json"), new TextureAtlas("ui/atlas.pack"));

    vaultInput = new TextField("", skin);
    vaultInput.setPosition(300, 250);
    vaultInput.setSize(300, 40);
    vaultInput.setText(text2);
    vault1Button = new Image(vault1);

    vault1Button.addListener(new ClickListener() {
        public boolean touchDown(InputEvent e, float x, float y, int point, int button) {
            System.out.println("133");
           vaultInput.setText(score);
            return false;
        }});
}

private void drawSprite(String name, float x, float y) {
    Sprite sprite = textureAtlas.createSprite(name);

    sprite.setPosition(x, y);

    sprite.draw(batch);
    vault1 = sprite;
}

【问题讨论】:

    标签: java android-studio libgdx


    【解决方案1】:

    很难判断您何时遗漏了代码,但您正在向输入处理器添加阶段:

     Gdx.input.setInputProcessor(stage);
    

    舞台和添加到舞台的演员现在是唯一响应输入的东西。但是你从来没有在舞台上添加任何东西,也没有绘制舞台,你是在 drawSprite 方法中单独绘制你的精灵。

    如果您改为将按钮添加到舞台,您只需调用 stage.draw():

    public void render(float delta) {
        stage.draw();
        stage.act(delta);
    }
    
    public void show() {
       Gdx.input.setInputProcessor(stage);
           skin = new Skin(Gdx.files.internal("ui/menuSkin.json"), new TextureAtlas("ui/atlas.pack"));
    
    
        vaultInput = new TextField("", skin);
        vaultInput.setPosition(300, 250);
        vaultInput.setSize(300, 40);
        vaultInput.setText(text2);
        vault1Button = new Image(vault1);
    
    
        vault1Button = new Image(vault1);
    
    
    
        vault1Button.addListener(new ClickListener() {
        public boolean touchDown(InputEvent e, float x, float y, int point, int button) {
                System.out.println("133");
               vaultInput.setText(score);
                return false;
        }});
        vaultInput.setPosition(x1, y1);
        vault1Button.setPosition(x2, y2);
        stage.addActor(vaultInput);
        stage.addActor(vault1Button);
    }
    

    调用stage.draw()时,添加到舞台的所有东西都会被绘制

    【讨论】:

      【解决方案2】:

      在调用show() 时,vault1 字段的值仍然为空。因此,您将侦听器添加到的实际按钮大小为零,并且没有可绘制的内容。

      此外,由于在游戏循环中不断调用render(),因此您正在创建新的精灵以在每一帧上绘制并在每一帧重新分配vault1 变量。

      您需要为show() 中的按钮创建图像并将按钮添加到舞台。然后你只需要绘制舞台。

      【讨论】: