Hola Gente.
En esta ocasiona veremos como detectar los choques entre elementos rectangulares y circulares.
Existe también los polígonos, pero por simplicidad veremos estos dos solamente.
Ustedes debes de elegir que tipo utilizar según sean tus necesidades, normalmente se utilizan mas las figuras rectangulares.
Para las detecciones rectangulares utilizaremos la clase "com.badlogic.gdx.math.Rectangle" y para las circulares utilizaremos la clase "com.badlogic.gdx.math.Circle".
Estrategia:
Crearemos 3 sprites del logo de LibGdx, con las dimensiones 128x128, estos estarán situados en la pantalla en forma de triangulo. Al sprite mas alto sera estático y tendrá asociado un rectángulo igual a sus dimensiones y asociado un circulo que tendrá mas o menos las dimensiones de la imagen circular del logo. Cuando me refiero al termino "asociado", quiero decir que el rectángulo o circulo se van a mover en las mismas posiciones del sprite. Con respecto a los otras sprites, uno sera asociado con un rectángulo y el otro a un circulo; con la finalidad que puedan chocar con el mas alto.
Otra estrategia sera colocar un tinte diferente para diferenciar cada sprite, también moveremos el sprite de la izquierda con las teclas ASWD y el de la derecha con las teclas cursoras.
Comencemos: Lo primero es crear nuestro proyecto:
Importamos nuestro proyecto en eclipse, como ya lo hemos hecho. Un dato importante es que no incluiremos el sub proyecto para android, puesto moveremos nuestros sprite con el teclado.
Clase Tuto3:
package sv.chuckles.tuto3;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.Circle;
import com.badlogic.gdx.math.Rectangle;
public class Tuto3 extends ApplicationAdapter {
SpriteBatch batch;
Sprite sprite1,sprite2,sprite3;
Rectangle rec1,rec2;
Circle cir1,cir3;
ShapeRenderer renderer = null;
@Override
public void create () {
batch = new SpriteBatch();
sprite1 = new Sprite(new Texture("badlogic.jpg"));
sprite2 = new Sprite(new Texture("badlogic.jpg"));
sprite3 = new Sprite(new Texture("badlogic.jpg"));
sprite1.setPosition(Gdx.graphics.getWidth()/2-sprite1.getWidth()/2, Gdx.graphics.getHeight()-sprite1.getHeight()-50);
rec1 = new Rectangle(sprite1.getX(), sprite1.getY(), sprite1.getWidth(), sprite1.getHeight());
cir1 = new Circle(sprite1.getX()+sprite1.getWidth()/2, sprite1.getY()+sprite1.getWidth()/2, 50f);
sprite2.setColor(Color.BLUE);
rec2 = new Rectangle(0, 0, sprite2.getWidth(), sprite2.getHeight());
sprite3.setPosition(Gdx.graphics.getWidth()-sprite3.getWidth(),0);
sprite3.setColor(Color.MAGENTA);
cir3 = new Circle(0, 0, 50f);
//Instancia para dibujar la figuras matematicas
//comentarias esta linea si no se quiere ver los rectangulos y circulos dibujados
renderer = new ShapeRenderer();
}
@Override
public void render () {
Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
detectarMovimiento(sprite2,false);
detectarMovimiento(sprite3,true);
detectarColisiones();
//pintado de las imagenes en la pantalla
batch.begin();
sprite1.draw(batch);
sprite2.draw(batch);
sprite3.draw(batch);
batch.end();
if(renderer != null){
renderer.begin(ShapeType.Line);
renderer.setColor(Color.GOLD);
renderer.rect(rec1.getX(), rec1.getY(), rec1.getWidth(), rec1.getHeight());
renderer.circle(cir1.x, cir1.y, cir1.radius);
renderer.setColor(Color.WHITE);
renderer.circle(cir3.x, cir3.y, cir3.radius);
renderer.rect(rec2.getX(), rec2.getY(), rec2.getWidth(), rec2.getHeight());
renderer.end();
}
}
private void detectarColisiones() {
//detectar si hay colision entre los rectangulos
if(rec1.overlaps(rec2)){
sprite2.setColor(Color.YELLOW);
}else{
sprite2.setColor(Color.BLUE);
}
if(cir1.overlaps(cir3)){
sprite3.setColor(Color.YELLOW);
}else{
sprite3.setColor(Color.MAGENTA);
}
}
private void detectarMovimiento(Sprite sprite,boolean isKeyCursorPress){
float x = sprite.getX();
float y = sprite.getY();
if(isKeyCursorPress){
if(Gdx.input.isKeyPressed(Keys.LEFT))
x -= 5;
else if(Gdx.input.isKeyPressed(Keys.RIGHT))
x += 5;
if(Gdx.input.isKeyPressed(Keys.UP))
y += 5;
else if(Gdx.input.isKeyPressed(Keys.DOWN))
y -= 5;
}else{
if(Gdx.input.isKeyPressed(Keys.A))
x -= 5;
else if(Gdx.input.isKeyPressed(Keys.D))
x += 5;
if(Gdx.input.isKeyPressed(Keys.W))
y += 5;
else if(Gdx.input.isKeyPressed(Keys.S))
y -= 5;
}
if(x < 0) x=0;
if(y < 0) y=0;
if(x>Gdx.graphics.getWidth()) x=Gdx.graphics.getWidth();
if(y>Gdx.graphics.getHeight()) y=Gdx.graphics.getHeight();
sprite.setPosition(x, y);
//tambien tenemos que mover el rectangulo o el circulo
if(isKeyCursorPress)//si es verdad, movemos el circulo
cir3.setPosition(x+sprite.getWidth()/2, y+sprite.getHeight()/2);
else
rec2.setPosition(x, y);
}
@Override
public void dispose() {
if(renderer != null)
renderer.dispose();
batch.dispose();
}
}
Explicacion:
Declaraciones de objetos: No hay nada del otro mundo. Solo existe este objeto "ShapeRenderer renderer" que es de suma importancia, ya que en el es posible dibujar gráficos primitivos como lineas, rectángulos, círculos, etc. Entonces para ¿qué nos servirá esto?, pues los objetos rectángulos y círculos son lógicos, no son representaciones gráficas y nos auxiliaremos de esta clase.
Método create:
El sprite1 era destinado al estático, que tendrá asociado el rectangular rec1 y el circulo cir1, aquí instanciamos el objeto rec1, que el constructor recibe de parámetros la posición del rectángulo y las dimensiones del ancho y alto, para nuestro caso tendríamos que poner los mismas coordenadas de sprite1: rec1 = new Rectangle(sprite1.getX(), sprite1.getY(), sprite1.getWidth(), sprite1.getHeight());
Para el caso del circulo: cir1 = new Circle(sprite1.getX()+sprite1.getWidth()/2, sprite1.getY()+sprite1.getWidth()/2, 50f); donde se coloca la posicion del centro y su radio.
Creo que aquí todo esta fácil de entender, a esta altura del partido ya debemos de estar muy familiarizados con el código.
Método render:
Aquí esta toda la lógica, encontraremos el método: "detectarMovimiento", el cual detecta que tecla fue tocada y mueva la imagen y su rectángulo o circulo asociado.
Donde nos centraremos es en el método "detectarColisiones", este metodo observamos como se pregunta que el rec1 esta sobre el rec2, si esto es cierto el tinte cambia del sprite2:
Tambien se pregunta que el cir1 esta sobre el cir2, si es cierto también cambia de tinte amarillo:
Podemos ver como funciona las colisiones, mas sencillo imposible xD
Si no quieren ver los rectángulos o círculos dibujado pues comentaríamos la linea 43
Este "ShapeRenderer" es nuestro DEBUG gráfico.
Para el siguiente tutorial, veremos como hacer animaciones
Un Saludos
Sigueme en Twiter: https://twitter.com/libgdxESA
Si te gusta mi trabajo y quisieras ver mas y mas rápido, puedes donar $1.00 vía donación paypal:




No hay comentarios.:
Publicar un comentario