Обновление изображения в таблице - PullRequest
0 голосов
/ 10 марта 2019

В настоящее время я создаю систему инвентаризации, в которой пользователь может выбрать элемент из коллекции инвентаризации, и значок справа обновится.

На данный момент я реализовал ClickListenerчтобы получить выбранный в данный момент предмет из списка инвентаря и вызвать метод .getImage (), который я создал для получения значка выбранного предмета.

Я использовал table.add (image);добавить иконку в таблицу.Однако, когда значок добавляется в таблицу, он заполняет это пространство, и другой столбец создается справа, когда пользователь выбирает другой элемент.Это проблема.

Как получить область изображения для обновления, когда пользователь выбирает другой элемент, вместо создания другого столбца справа?

В настоящее время это так: https://imgur.com/a/O6SW8gi

Я хочу, чтобы область, где должен быть меч, была обновлена ​​до последнего элемента, на который нажал пользователь.

Вот мой код:

package com.sps.game.inventory;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.*;
import com.badlogic.gdx.scenes.scene2d.ui.*;

import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
import com.sps.game.controller.InventoryController;
import com.sps.game.controller.PlayerController;

import java.util.ArrayList;

public class PlayerInventory {
    public Stage stage;
    public SpriteBatch sb;
    private Viewport viewport;

    private Skin skin = new Skin(Gdx.files.internal("core/assets/pixthulhuui/pixthulhu-ui.json"));

    private List<Item> inventory;
    private List<Image> itemImages;

    private InventoryController inventoryController;
    private InputProcessor oldInput;

    Table table = new Table(skin);



    public PlayerInventory(SpriteBatch sb, PlayerController playerController) {
        this.sb = sb;
        viewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), new OrthographicCamera());
        stage = new Stage(viewport, sb);

        inventoryController = new InventoryController();
        inventory = inventoryController.getInventoryList();
       // itemImages = inventoryController.getImageList();
    }


    //THIS IS WHERE THE IMAGE IS ADDED

    private void formatting() {
        stage = new Stage();
        Label inventoryLabel = new Label("Inventory", skin);
        final Label imageLabel = new Label("Item", skin);

        table.setDebug(true);
        table.defaults();
        table.center();
        table.setFillParent(true);
        table.add(inventoryLabel);
        table.add(imageLabel);
        table.row();

        table.add(inventory); //need a way to get the current item selected
        inventory.addListener(new ClickListener() {
            public void clicked(InputEvent event, float x, float y) {
                Item clickedItem = inventory.getSelected();
                Image clickedImage = clickedItem.getImage();
                table.add(clickedImage);
                System.out.println(clickedItem.getName());
                }
            });



     //   stage.addActor(itemImages);
        stage.addActor(table);
    }





    public void setInput() {
        oldInput = Gdx.input.getInputProcessor(); //Get the old input from the user.
        Gdx.input.setInputProcessor(stage);       //Set the input to now work on the inventory.
    }

    public void update() {
        if (Gdx.input.isKeyPressed(Input.Keys.I) && oldInput == null) {
            formatting();
            setInput();
        }

        if (Gdx.input.isKeyPressed(Input.Keys.O) && oldInput != null) {
            stage.dispose();
            Gdx.input.setInputProcessor(oldInput);
            oldInput = null;
        }
    }

    public void dispose() {
        stage.dispose();
    }

}

Изображениедобавлен в метод форматирования () -

             inventory.addListener(new ClickListener() {
             public void clicked(InputEvent event, float x, float y) {
                Item clickedItem = inventory.getSelected();
                Image clickedImage = clickedItem.getImage();
                table.add(clickedImage);
                System.out.println(clickedItem.getName());
                }

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Я нашел проблему, просматривая LibGDX Wiki Таблица - Добавление ячеек кажется, что вы используете метод add(), который не заменяет предыдущего актора в ячейке, он только добавляет другого вряд.Вместо этого вы должны сохранить отображаемое изображение отдельно от List

public class PlayerInventory {

    [..........................]

    Item clickedItem; // This will save your clicked item
    Image clickedImage; // This will save your clicked image;

    [..........................]

    inventory.addListener(new ClickListener() {
         public void clicked(InputEvent event, float x, float y) {
                if (clickedItem == null && clickedImage == null) {
                    clickedItem = inventory.getSelected(); // This line changed
                    clickedImage = clickedItem.getImage(); // This line changed
                    table.add(clickedImage);
                } else {
                    clickedItem = inventory.getSelected(); // This line changed
                    clickedImage = clickedItem.getImage(); // This line changed
                }

                System.out.println(clickedItem.getName());
            }
}

. Это добавит изображение, если ранее не было изображения, и заменит изображение, если оно было ранее.Надеюсь, это поможет!

0 голосов
/ 11 марта 2019

решаемая.Вы не должны использовать table.add (clickedImage) каждый раз, когда нажимаете на экран.add () создает новую ячейку.Вместо этого добавьте заполнитель Image только один раз во время первоначального макета и сохраните ссылку на него.В моем ClickListener я использовал взамен clickedImage.setDrawable (), чтобы изменить отображаемое изображение.

...