如何使演员可触摸的LibGdx

问题描述 投票:0回答:1

我在尝试使演员可动时遇到一些问题。这是我正在使用的代码。 第一类是我创建按钮的地方

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();
    }


}

第二类是我尝试实现它的地方。此类是我尝试实现可触摸actor的地图。如果单击演员,则应该打印“ 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;
    }

}

但是似乎它无法识别屏幕上的触摸或仅通过用鼠标单击即可识别。

android libgdx actor
1个回答
0
投票

好!我找到了解决方案。仅仅在类Botones上设置setBounds似乎还不够,但是在实现它们的地图中也需要它。 setBounds在地图上,一切都很好!

© www.soinside.com 2019 - 2024. All rights reserved.