Search code examples
javaandroidlibgdx

Collision between Sprite and Shape Renderer Circles


Im working on a game where you have to avoid Asteroids with a Spaceship (Sprite). Unfortunatly my collision method does not work. I can run the Code on my phone but no "Collision" gets printed out. I think somehow i messed up some Coordinate but i cant find the mistake. Any ideas?

public class CollisionManager{

private List<Asteroid> asteroids = new ArrayList<Asteroid>();
private Spaceship s = new Spaceship();

public void checkCollisions(){
    for(int i = 0; i < asteroids.size(); i++)
    {
        if(asteroids.get(i).getBounds().contains(s.getBounds())   )                        
        {
        System.out.println("COLLISION");
        }
    } 
} 

}

Main Class:

    [...]
    @Override
    public void render() {

    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    if(ScreenManager.getCurrentScreen() != null){
        ScreenManager.getCurrentScreen().update();
        ScreenManager.getCurrentScreen().update(renderer);
        ScreenManager.getCurrentScreen().update(cam);
        ScreenManager.getCurrentScreen().checkCollisions();

    }

    if(ScreenManager.getCurrentScreen() != null){
        ScreenManager.getCurrentScreen().render(batch);
        ScreenManager.getCurrentScreen().render(renderer);
    }
}

Asteroid:

[...]

 public void update(float deltaT) {

    p.x += v.x * deltaT;
    p.y += v.y * deltaT;

} 
     public Circle getBounds()
{
    return new Circle(p.x, p.y, radius);
}

Spaceship:

[...]
public void update() {

    System.out.println("update");

        if (Gdx.input.isTouched()) {
        y =  (height - Gdx.input.getY()) /height *  MyGdxGame.HEIGHT;
        x =   Gdx.input.getX() / width * MyGdxGame.WIDTH; 
        sprite.setPosition(-sprite.getWidth() / 2 + x, sprite.getHeight()/2
         + y);


    }

public Circle getBounds()
 {
    return new Circle(sprite.getX(), sprite.getY(), sprite.getWidth());
}

Solution

  • You need to use overlap not contains .

    asteroids.get(i).getBounds().overlaps(s.getBounds())
    

    enter image description here

    this means contain. Its not collision check it checks whether or not circle in an other circle completely.


    enter image description here

    this is what you want.You can check collision with overlap method.