0

I have created a button and I want to change its appearance on hover and on click. I get no errors, but it isn't working. It doesn't change the image when it is clicked or when it is hovered. The only image that is displayed is the one from playButtonStyle.up.

Here is my code:

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.*;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import com.starships.MainClass;
import com.sun.prism.paint.Color;
import helpers.Info;
public class MainMenuScreen implements Screen {
 MainClass game;
 Stage stage; 
 private Texture background; 
 private AssetManager assets;
 private TextureAtlas atlas; 
 private Skin skin;
 private Table table;
 private Button playButton;
 public MainMenuScreen(MainClass mainClass) {
 game = mainClass;
 Gdx.input.setInputProcessor(stage); 
 stage = new Stage();
 background = new Texture(Gdx.files.internal("Background.png"));
 assets = new AssetManager();
 assets.load("Buttons/PlayButtonAtlas.atlas", TextureAtlas.class);
 assets.finishLoading();
 atlas = assets.get("Buttons/PlayButtonAtlas.atlas");
 skin = new Skin(atlas);
 table = new Table(skin);
 table.setBounds(0, 0, Info.WIDTH, Info.HEIGHT);
 Button.ButtonStyle playButtonStyle = new Button.ButtonStyle();
 playButtonStyle.up = skin.getDrawable("PlayButton");
 playButtonStyle.over = skin.getDrawable("PlayButtonHover");
 playButtonStyle.down = skin.getDrawable("PlayButtonPressed");
 playButton = new Button(playButtonStyle); 
 table.add(playButton);
 stage.addActor(table);
 }
 @Override
 public void show() {
 }
 @Override
 public void render(float delta) {
 Gdx.gl.glClearColor(0, 0.7f, 0.8f, 1);
 Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);
 stage.act(delta);
 stage.draw();
 }
 @Override
 public void resize(int width, int height) {
 }
 @Override
 public void pause() {
 }
 @Override
 public void resume() {
 }
 @Override
 public void hide() {
 }
 @Override
 public void dispose() {
 stage.dispose();
 }
}
AAryan
20.2k8 gold badges49 silver badges69 bronze badges
asked May 23, 2017 at 16:29
1

1 Answer 1

3

Set InputProcessor after initialisation of Stage like this :

public MainMenuScreen(MainClass mainClass) {
 game = mainClass;
 stage = new Stage();
 Gdx.input.setInputProcessor(stage); // This call should be after initialisation of stage.
 background = new Texture(Gdx.files.internal("Background.png"));
 ...
 ...
}
answered May 23, 2017 at 17:39
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks. It worked. I spend the entire day trying to make a button.. :\
@iulyus01 If you want multiple input processors you can use InputMultiplexer. Put the InputProcessors (stage is an InputProcessor as well) with higher priorities in first and then add the InputMultiplexer instead of just the stage like shown in this answer.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.