Как сделать актера осязаемым LibGdx - PullRequest
0 голосов
/ 01 марта 2020

У меня возникли некоторые проблемы при попытке сделать моих актеров осязаемыми. Вот код, который я использую. Первый класс - это то, где я создаю кнопки .

import personajes.Jugador;

public class Botones extends Actor {
    protected Texture texture;
    protected Sprite sprite;
    protected SpriteBatch batch;
    protected ShapeRenderer shapeRenderer;

    public Botones(Jugador j) {
        shapeRenderer = new ShapeRenderer();
        this.setTouchable(Touchable.enabled);
        batch = new SpriteBatch();
        texture = new Texture(Gdx.files.internal("Mapas/upButtonFinal.png"));
        this.sprite = new Sprite(texture);
        sprite.setBounds(Gdx.graphics.getWidth() / 18.9666f, Gdx.graphics.getHeight() / 6.4f, Gdx.graphics.getWidth() / 11, Gdx.graphics.getHeight() / 11);

    }
    public static class BotonAbajo extends Botones {
        public BotonAbajo(Jugador j){
            super(j);
            shapeRenderer=new ShapeRenderer();
            texture=new Texture(Gdx.files.internal("Mapas/downButtonFinal.png"));
            this.sprite=new Sprite(texture);
            sprite.setBounds(Gdx.graphics.getWidth()/18.9625f,Gdx.graphics.getHeight()/54,Gdx.graphics.getWidth()/11,Gdx.graphics.getHeight()/11);

        }
    }

    public static class BotonDerecha extends Botones {
        public BotonDerecha(Jugador j){
            super(j);
            shapeRenderer=new ShapeRenderer();
            texture=new Texture(Gdx.files.internal("Mapas/rightButton.png"));
            this.sprite=new Sprite(texture);
            sprite.setBounds(Gdx.graphics.getWidth()/8.9666f,Gdx.graphics.getWidth()/21,Gdx.graphics.getWidth()/12,Gdx.graphics.getHeight()/13);

        }
    }

    public static class BotonIzquierda extends Botones {
        public BotonIzquierda(Jugador j){
            super(j);
            shapeRenderer=new ShapeRenderer();
            texture=new Texture(Gdx.files.internal("Mapas/leftButton.png"));
            this.sprite=new Sprite(texture);
            sprite.setBounds(0,Gdx.graphics.getWidth()/23,Gdx.graphics.getWidth()/11,Gdx.graphics.getHeight()/11);
        }
    }
    public void dibujarConHitbox(){
        batch.begin();
        sprite.draw(batch);
        batch.end();
        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
        shapeRenderer.box(sprite.getX(),sprite.getY(),0,sprite.getWidth(),sprite.getHeight(),20);
        shapeRenderer.setColor(Color.BLUE);

        shapeRenderer.end();
    }


}

Во втором классе я пытаюсь это реализовать. Этот класс представляет собой карту, на которой я пытаюсь реализовать осязательный актер. Предполагается напечатать «Hola», если я нажму на актера. Позже он сделает что-то еще, но сейчас я просто пытаюсь это напечатать. В любом случае, кажется, что ничего не обнаружено, и я не знаю почему. Я уже пытался: This.setTouchable (Touchable.enabled) в Botones, но это тоже не работает.

public class Mapa2 extends BaseScreen {
    private Juego juego;
    private SpriteBatch batch;
    private EntradaCasaMapa2 ecm;
    private SalidaMapa2 sm;


    public Mapa2(Juego g){
        super(g);
        this.juego=g;
        shapeRenderer=new ShapeRenderer();

         map = new TmxMapLoader().load("Mapas/MapaInicialFinal.tmx");
        renderer = new OrthogonalTiledMapRenderer(map,unitScale);
        camera = new OrthographicCamera(Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
        camera.translate(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);
        camera.update();
         properties = map.getProperties();
        tileWidth = properties.get("tilewidth", Integer.class);
        tileHeight = properties.get("tileheight", Integer.class);
        mapWidthInTiles = properties.get("width", Integer.class);
        mapHeightInTiles = properties.get("height", Integer.class);
        mapWidthInPixels = mapWidthInTiles * tileWidth;
        mapHeightInPixels = mapHeightInTiles * tileHeight;
        batch=new SpriteBatch();
        //Crear variable para posicionPersonajeX e Y, para que segun desde que mapa entre, se origine el jugador en un lado u otro.
        jugador=new Jugador(map,camera,480,500,mapWidthInPixels/20 ,mapHeightInPixels/20 );
        System.out.println(mapWidthInTiles);//El sout de mapWidthInTiles y Heigh da la altura y anchura del mapa, el de Gdx da el viewportWidth y Heigth
        System.out.println(mapHeightInTiles);
        //MUY IMPORTANTE, DURANTE LA FASE DE ORDENADOR, EL PERSONAJE ESTARÁ EN 280,100,/20,/20, PERO EN MOVIL ESTARÁ EN 1080,150,/10,/5

        WIDTH = ((TiledMapTileLayer) map.getLayers().get(0)).getWidth(); //Obtenemos desde el mapa el número de tiles de ancho de la 1º Capa
        HEIGHT = ((TiledMapTileLayer) map.getLayers().get(0)).getHeight(); //Obtenemos desde el mapa el número de tiles de alto de la 1º Capa
        System.out.println(WIDTH);
        System.out.println(HEIGHT);
        camera.setToOrtho(false, WIDTH,HEIGHT);

        camera.position.x=WIDTH/2;
        camera.position.y=HEIGHT/2;
        camera.position.set(WIDTH/2,HEIGHT/2,1);

        MapLayers mapLayers = map.getLayers();
        terrainLayer = (TiledMapTileLayer) mapLayers.get("Suelo");
        terrainLayer2 = (TiledMapTileLayer) mapLayers.get("Cosas");

        colisiones=new Colisiones();
        colisiones.checkCollision(map,jugador);

        InputMultiplexer multiplexer = new InputMultiplexer();
        multiplexer.addProcessor(new TecladoJugador(jugador));
        Gdx.input.setInputProcessor(multiplexer);

        pantalla=new Stage();
        Gdx.input.setInputProcessor(pantalla);
        pantalla.setDebugAll(true);
        pantalla.addActor(jugador);
        botonArriba=new Botones(jugador);
        botonAbajo=new Botones.BotonAbajo(jugador);
        botonIzquierda=new Botones.BotonIzquierda(jugador);
        botonDerecha=new Botones.BotonDerecha(jugador);
        ecm=new EntradaCasaMapa2();
        sm=new SalidaMapa2();

        pantalla.addActor(botonArriba);
        botonArriba.setTouchable(Touchable.enabled);
        pantalla.addActor(botonAbajo);
        pantalla.addActor(botonIzquierda);
        pantalla.addActor(botonDerecha);
        pantalla.addActor(ecm);
        pantalla.addActor(sm);



        botonArriba.addListener(new ChangeListener() {
            @Override
            public void changed(ChangeEvent event, Actor actor) {
                System.out.println("Hola");
            }
        });



        for(int b=0;b<colisiones.getActores().length-1;b++){
            pantalla.addActor(colisiones.getActores()[b]);
            colisiones.getActores()[b].setColor(Color.BLUE);

        }
        System.out.println(colisiones.getActores().length);

    }




    @Override
    public void show() {

    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(0, 0, 0, 1);

        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        super.render(delta);

        renderer.getBatch().begin();
        renderer.renderTileLayer(terrainLayer);
        renderer.getBatch().end();
        batch.begin();
        jugador.dibujarConHitbox(batch);
       // upImg.draw(batch,delta);
        batch.end();
        renderer.getBatch().begin();
        renderer.renderTileLayer(terrainLayer2);
        renderer.getBatch().end();
        ecm.dibujar();
        sm.dibujar();
        botonArriba.dibujarConHitbox();
        botonAbajo.dibujarConHitbox();
        botonIzquierda.dibujarConHitbox();
        botonDerecha.dibujarConHitbox();
        renderer.setView(camera);
        pantalla.act(Gdx.graphics.getDeltaTime());
        pantalla.draw();
    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    public void dispose() {
        jugador.dispose();
        renderer.dispose();
        pantalla.dispose();
    }

    public TiledMap getMap() {
        return map;
    }

}

Но, похоже, он не распознает прикосновение к экрану или просто щелкает по нему мышью.

1 Ответ

0 голосов
/ 01 марта 2020

Хорошо! Я нашел решение. Кажется, что было недостаточно установить Bounds только для класса Botones, но это также необходимо в карте, где я их реализую. установить границы на карте, и все хорошо!

...