libGDX как сделать реакцию при наведении курсора на кнопку?

Рейтинг: 1Ответов: 1Опубликовано: 06.02.2023

Есть на экране кнопка, просто текст. Хочется, чтобы при наводке курсором на эту кнопку появлялся полупрозрачный фон и сам текст либо увеличивался, либо сдвигался в какую то сторону. Честно, перегуглил все, ответа не нашел. Буду рад помощи

public class MainMenuScreen implements Screen {

final PawnPath game;

OrthographicCamera camera;
TextButton buttonStart;
TextButton.TextButtonStyle buttonStyle;
Stage stage;

public MainMenuScreen(final PawnPath gam) {
    game = gam;

    camera = new OrthographicCamera();
    camera.setToOrtho(false, 1920, 1080);

    stage = new Stage();
    Gdx.input.setInputProcessor(stage);
    buttonStyle = new TextButton.TextButtonStyle();
    buttonStyle.font = game.smFont;
    buttonStart = new TextButton("Click me!",buttonStyle);
    buttonStart.setHeight(100);
    buttonStart.setWidth(100);
    buttonStart.setX(Gdx.graphics.getWidth()/2);
    buttonStart.setY(Gdx.graphics.getHeight()/2-300);
    stage.addActor(buttonStart);
    
}

}

Ответы

▲ 0

Проверяйте в методе render пересечение координат мышки и кнопки. Если произошло пересечение, то обновляйте кнопку: меняйте стил, текст или что вам там надо сделать.

Что-то вроде

    @Override
    public void render(float delta) {
        ScreenUtils.clear(0.2f, 0.2f, 0.2f, 1);

        if (Gdx.input.getX() != x || Gdx.input.getY() != y) {
            Rectangle buttonRect = new Rectangle((int) startButton.getX(), (int) startButton.getY(), (int) startButton.getWidth(), (int) startButton.getHeight());
            boolean overlapped = buttonRect.intersects(new Rectangle(Gdx.input.getX(), Gdx.input.getY(), 1, 1));
            if (overlapped && !startButtonOverlappedState) {
                startButton.setX(startButton.getX() + 10);
                startButtonOverlappedState = true;
            } else if (startButtonOverlappedState && !overlapped) {
                startButton.setX(startButton.getX() - 10);
                startButtonOverlappedState = false;
            }
        }

        x = Gdx.input.getX();
        y = Gdx.input.getY();

            
        stage.draw();
    }

Дополню, что стили при разных событиях можно описывать прямо в скине. Что-то вроде:

    com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: {
        default: {
            font: default
            fontColor: RGBA_255_255_255_255
        }
        start: {
            parent: default
            font: default
            fontColor: RGBA_255_255_255_255
            downFontColor: down
            overFontColor: focused
            focusedFontColor: focused
            focused: focusedDrw
        }
    }
    ...
        com.badlogic.gdx.graphics.Color: {
...
        focused: {
            r: 0.5529412
            g: 0.5529412
            b: 0.5529412
            a: 1
        }
...
    com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: {
        focusedDrw: {
            name: white-pixel
            color: red
        }
    }

Весь скин не привожу, но смысл должен быть ясен. Если есть какие-то проблемы с созданием самого скина, то можно воспользоваться тем же SkinComposer.

Резюмирую: изменять положение кнопки можно из метода render, а сами стили кнопки описать в ские.