android - 如何使演员可触摸 LibGdx
问题描述
我在尝试使我的 Actor 可触摸时遇到了一些问题。这是我正在使用的代码。第一堂课是我创建按钮的地方。
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”。它稍后会做其他事情,但现在我只是想打印它。无论如何,似乎没有检测到任何东西,我不知道为什么。我已经尝试过:Botones 中的 This.setTouchable( Touchable.enabled),但它也不起作用。
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;
}
}
但它似乎无法识别屏幕上的触摸或仅用鼠标单击它。
解决方案
好的!我找到了解决方案。似乎仅在 Botones 类上设置边界是不够的,而且在我实现它们的地图中也需要它。在地图上设置边界,一切都很好!
推荐阅读
- python-3.x - 根据给定的分布和趋势创建随机 Numpy 数组
- vb.net - 最小化到系统托盘循环时形成最后一个位置
- selenium - 如何使用 selenium 和 scrapy 在 chrome 中启用“阅读器模式”?
- mongodb - Go Context 应该如何声明?
- json - JMeter - JSON 路径表达式:提取带有元素的 JSON 块和带有多个条件的正则表达式
- authentication - .NetCore blazor 身份验证不起作用
- python - Python 3 f 格式中 %g 的等价物是什么?
- python - Python dbf:如何更新值?
- amazon-web-services - 将存储桶策略附加到 s3 存储桶时,Terraform 抛出存储桶区域错误
- javascript - 如何渲染动画,然后在播放完成后将其渲染出来?