¿Cómo puedo detectar si un sprite fue tocado en Java libGDX?

En los últimos días he estado portando mi juego ( Apopalypse ) a la plataforma Android Mobile. He hecho una búsqueda rápida en Google de la detección del tacto del sprite pero no encontré nada provechoso. Cada globo saltará una vez tocado y solo necesito detectar si es tocado. Aquí está mi código de desove de globo:

La representación (x, y, anchura y altura se aleatoriza):

public void render() { y += 2; balloon.setX(x); balloon.setY(y); balloon.setSize(width, height); batch.begin(); balloon.draw(batch); batch.end(); } 

Desove en la clase de juego principal:

 addBalloon(new Balloon()); public static void addBalloon(Balloon b) { balloons.add(b); } 

6 Solutions collect form web for “¿Cómo puedo detectar si un sprite fue tocado en Java libGDX?”

Así es como lo hice, pero dependiendo de la escena que esté usando y de los elementos que pueden ser tocados, puede haber formas un poco más optimizadas de hacer esto:

 public GameScreen implements Screen, InputProcessor { @Override public void show() { Gdx.input.setInputProcessor(this); } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { float pointerX = InputTransform.getCursorToModelX(windowWidth, screenX); float pointerY = InputTransform.getCursorToModelY(windowHeight, screenY); for(int i = 0; i < balloons.size(); i++) { if(balloons.get(i).contains(pointerX, pointerY)) { balloons.get(i).setSelected(true); } } return true; } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { float pointerX = InputTransform.getCursorToModelX(windowWidth, screenX); float pointerY = InputTransform.getCursorToModelY(windowHeight, screenY); for(int i = 0; i < balloons.size(); i++) { if(balloons.get(i).contains(pointerX, pointerY) && balloons.get(i).getSelected()) { balloons.get(i).execute(); } balloons.get(i).setSelected(false); } return true; } public class InputTransform { private static int appWidth = 480; private static int appHeight = 320; public static float getCursorToModelX(int screenX, int cursorX) { return (((float)cursorX) * appWidth) / ((float)screenX); } public static float getCursorToModelY(int screenY, int cursorY) { return ((float)(screenY - cursorY)) * appHeight / ((float)screenY) ; } } 

En su clase el uso del método render puede hacer el siguiente código

 Vector3 touchPoint=new Vector3(); void update() { if(Gdx.input.justTouched()) { camera.unproject(touchpoint.set(Gdx.input.getX(),Gdx.input.getY(),0); if(balloon.getBoundingRectangles().contains(touchPoint.x,touchPoint.y)) { // will be here when balloon will be touched } } } 

Hice una pequeña clase que utilizo para mis juegos para detectar es Sprite se toca

 public class SpriteTouchable extends Sprite { public SpriteTouchable(Texture texture) { super(texture); } public SpriteTouchable(Sprite sprite) { set(sprite); } public static float xTrans(float x) { return x*Gdx.graphics.getWidth()/480; } public static float yTrans(float y) { return y*Gdx.graphics.getHeight()/320; } private boolean isTouched; /** * Type: Input Listener function * listen if this sprite button was pressed (touched) * @param marge : the extra touchable space out of sprite * @param x : x position touched by user * @param y : y position touched by user * * return true : Sprite touched * return false : Sprite not touched */ public boolean isPressing(int marge,int x, int y) { if((x>getX() -xTrans(marge))&& x<getX() +getWidth()+xTrans(marge)) { if((y>getY() -yTrans(marge))&& y<getY()+getHeight()+yTrans(marge)) { return true; } } return false; } } public boolean isTouched() { return isTouched; } 

Aquí cómo lo uso

 Gdx.input.setInputProcessor(new GameInputListener() { @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchDown(int x, int yy, int pointer, int button) { int y = Gdx.graphics.getHeight() - yy; // if sprite + 10 of px marge is touched if(mySpriteTouchable.isPressing(10, x, y)) { // sprite is touched down } return false; } } 

Con la misma lógica que puede detectar la liberación de sprite y también se puede personalizar para el tamaño del efecto cuando el sprite se toca y más …

Espero que esto fue útil!

Tiene Gdx.input.getX() y Gdx.input.getY() . Las coordenadas X e Y del último toque. Sólo compararlos con el marco de globo.

Usted podría agregar un pequeño rectángulo de 1×1 píxeles a su ratón y comprobar si se cruza o contiene otras cajas. Es necesario utilizar cuadros para todos los objetos que desea hacer clicable de esta manera.

Tengo una solución simple que es como que crear un pequeño rectángulo 1 píxel por un píxel

Rectangle rect;

rect = new Rectangle(0, 0, 1, 1);

Luego haga un método llamado

touching_checking();

En este método haremos tres cosas

Primero verifique si se toca la pantalla

Segundo, coloque el rectángulo donde toque la pantalla

A continuación, al final, compruebe si el rectángulo se superpone con el rectángulo de sprite. como eso

private void touching_checking() { if (Gdx.input.isTouched()) { rect.setPosition(Gdx.input.getX(), Gdx.input.getY()); if (rect.overlaps(back.getBoundingRectangle())) { //do what you want here } } } private void touching_checking() { if (Gdx.input.isTouched()) { rect.setPosition(Gdx.input.getX(), Gdx.input.getY()); if (rect.overlaps(back.getBoundingRectangle())) { //do what you want here } } } tengo una matriz de sprites llamados niveles i comprobar que uno presionado como que

 private void touching_checking() { if (Gdx.input.isTouched()) { rect.setPosition(Gdx.input.getX(), Gdx.graphics.getWidth() - Gdx.input.getY()); for (int i = 0; i < levels.size; i++) { if (rect.overlaps(levels.get(i).getBoundingRectangle())) { //do what you want here } } } } 
  • Java libgdx mover la cámara de perspectiva
  • Libgdx SpriteBatch render a la textura
  • Programas funcionan bien con LibGDX -desktop pero no LibGDX - Android?
  • LibGDX - ¿Cómo Gdx.graphics.getWidth () devuelve el ancho de la superficie de visualización?
  • Cómo obtener la versión de la aplicación utilizando libgdx / robovm
  • Pausa / reanudar un juego Libgdx simple para Android
  • ¿ClickLIstener no está trabajando en el juego de LibGdx?
  • En libgdx, ¿cómo puedo obtener información del botón de retroceso?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.