У меня возникли некоторые проблемы при попытке сделать моих актеров осязаемыми. Вот код, который я использую. Первый класс - это то, где я создаю кнопки .
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;
}
}
Но, похоже, он не распознает прикосновение к экрану или просто щелкает по нему мышью.