java - objetos - pronombres de objeto directo e indirecto
La mejor forma de detectar el objeto tocado(en movimiento) desde la colección en libgdx (2)
public static boolean pointInRectangle (Rectangle r, float x, float y) {
return r.x <= x && r.x + r.width >= x && r.y <= y && r.y + r.height >= y;
}
En su actualización-
if(pointInRectangle(flyRectangle, Gdx.input.getX(), Gdx.input.getY())){
// Do whatever you want to do with the rectangle. maybe register them for effect
}
También puedes mirar en la clase Intersector .
Ahora para la colisión, si tu juego es rápido, con muchos enemigos moviéndose con los que el jugador puede colisionar, tarde o temprano usarás una biblioteca de tipo box2d porque si la velocidad de movimiento es alta, es posible que no obtengas ninguna devolución de colisión . Las cosas pueden pasar el uno al otro. Puedes intentar predecir la colisión antes de que ocurra usando la velocidad y deltaTime, pero aún no será suficiente y terminarás reinventando la rueda.
Mario''s SuperJumper es una gran demo para iniciar libGDX. Intentalo.
EDITAR:
Tener un miembro de instancia-
Vector3 touchPoint;
En crear-
touchPoint = new Vector3();
En actualización-
camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
if (Gdx.input.justTouched()) {
if (pointInRectangle(rectangle, touchPoint.x, touchPoint.y)) {
}
}
Por favor, tome nota del sistema de coordenadas en libGDX. Para probar, crea un rectángulo en la pantalla. Al hacer clic, imprima / depure las coordenadas tanto del rectángulo como del punto táctil.
Este es mi primer intento en el desarrollo de juegos. Empecé experimentando libgdx y entendiendo los diferentes aspectos de la programación de juegos. Miré los proyectos de muestra, puedo entender la arquitectura general del juego libgdx. Pero para comprender los principios básicos de la dinámica del juego, comencé a jugar con cosas de bajo nivel, como dibujar formas simples, cómo moverlas, cómo manejar una colisión así.
Así que planeé escribir un juego androide simple y muerto (ni siquiera es un juego). Esta es la idea
1. Create random shapes and make it fly (move)
2. When user touches the shape, it ll explode or hide or play simple animation
3. Has to show Hit & Miss count
Inicialmente pensé en probar el concepto de escenario y actor libgdx, pero descarté hacerlo sin la escena API. Y comencé esto para experimentar con diferentes aspectos del juego básico y comprender mejor los conceptos detrás de libgdx. Así que hice esta aplicación simple, soy capaz de hacer que los objetos caigan al azar.
public class A1GameScreen implements Screen {
OrthographicCamera camera;
ShapeRenderer debugRenderer = new ShapeRenderer();
Array<Rectangle> boxes;
long lastFlew;
int fliesCaught;
A1GameScreen(){
camera = new OrthographicCamera();
camera.setToOrtho(false, 800, 480);
boxes=new Array<Rectangle>();
throwboxes();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0.2f, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
debugRenderer.setProjectionMatrix(camera.combined);
debugRenderer.begin(ShapeType.Line);
for (Rectangle fly : boxes) {
debugRenderer.rect(fly.x, fly.y, fly.width, fly.height);
}
debugRenderer.end();
//Handle the user input
if (Gdx.input.isTouched()){
hit(Gdx.input.getX(),Gdx.input.getY());
}
if (TimeUtils.nanoTime() - lastFlew > 1000000000)
throwboxes();
Iterator<Rectangle> iter = boxes.iterator();
while (iter.hasNext()) {
Rectangle fly = iter.next();
fly.x -= 2;
if (fly.x + 32 < 0)
iter.remove();
}
}
//Method to create flies at random interval
private void throwBoxes(){
Rectangle fly = new Rectangle();
fly.y = MathUtils.random(0, 480 - 32);
fly.x = 800;
fly.width = 32;
fly.height = 32;
boxes.add(fly);
lastFlew = TimeUtils.nanoTime();
}
private boolean hit (float x, float y) {
boolean found=false;
for (Rectangle fly : boxes) {
found = fly.contains(x,y);
if (found){
found = true;
fly.width=100;
break;
}
}
return found;
}
}
Pero no pude encontrar el objeto tocado de los objetos que caen. Esto es lo que estoy haciendo para averiguar si la caja está en rango tocado
- Pasa por todos los cuadros del conjunto
- Compruebe si las coordenadas táctiles se encuentran dentro de las coordenadas de la caja
- Pasé las coordenadas táctiles para
contains
método delRectangle
(recuadro) para descubrir que
algo como esto
for (Rectangle fly : boxes) {
found = fly.contains(x,y);
if (found){
found = true;
fly.width=100;
break;
}
}
Pero no está funcionando. Creo que calculé el problema. Sus
- La caja se mueve 2px en el eje x cada cuadro, para crear un efecto de vuelo
- Pero supongo que algunos marcos han pasado desde el evento táctil. Es por eso que no estoy obteniendo el resultado esperado
Mis preguntas son
- ¿Cómo resolver este problema?
- ¿Cuál es la mejor forma de detectar una colisión en libgdx?
Actualizar
Veo mucha falta de coincidencia entre las coordenadas táctiles y las coordenadas de caja. Ninguna de las cajas en el rango táctil. Como es eso posible. Debajo del rastro de la muestra
Touch coords: x-651.0 y-362.0
Fly coords: x-384.0 y-277.0
Fly coords: x-504.0 y-34.0
Fly coords: x-624.0 y-103.0
Fly coords: x-744.0 y-238.0
Touch coords: x-441.0 y-193.0
Fly coords: x-52.0 y-34.0
Fly coords: x-172.0 y-103.0
Fly coords: x-292.0 y-238.0
Fly coords: x-414.0 y-261.0
Fly coords: x-534.0 y-109.0
Fly coords: x-656.0 y-283.0
Fly coords: x-776.0 y-323.0
Touch coords: x-568.0 y-162.0
Fly coords: x-42.0 y-267.0
Fly coords: x-162.0 y-166.0
Fly coords: x-282.0 y-266.0
Fly coords: x-404.0 y-52.0
Fly coords: x-526.0 y-296.0
Fly coords: x-646.0 y-64.0
Fly coords: x-766.0 y-16.0
He resuelto el problema haciendo un rectángulo invisible que seguirá la ubicación del tap e hice una instrucción if que verifica la superposición del rectángulo invisible y comprobando si solo se tocó la pantalla.
Aquí está el código:
if(Gdx.input.isTouched()) {
Vector3 pointerPos = new Vector3();
pointerPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
cam.unproject(pointerPos);
touchPos.x = pointerPos.x /*+ 64 / 2*/;
touchPos.y = pointerPos.y /*+ 64 / 2*/;
}
Iterator<Rectangle> iter = raindrops.iterator();
while(iter.hasNext()) {
Rectangle raindrop = iter.next();
raindrop.y -= 300 * Gdx.graphics.getDeltaTime();
if(raindrop.y + 64 < 0) {
iter.remove();
}
if(raindrop.overlaps(touchPos) && Gdx.input.justTouched()) {
iter.remove();
dropSound.play();
}
todo este código está en el método de renderizado.
PD: cambia las gotas de lluvia por los objetos voladores que quieras