2016-08-19 3 views
0

Ich arbeite an einem Spiel, wo Sie Asteroiden mit einem Raumschiff (Sprite) vermeiden müssen. Leider funktioniert meine Kollisions-Methode nicht. Ich kann den Code auf meinem Telefon laufen lassen, aber es wird kein "Kollision" ausgedruckt. Ich denke, irgendwie habe ich eine Koordinate vermasselt, aber ich kann den Fehler nicht finden. Irgendwelche Ideen?Kollision zwischen Sprite und Shape Renderer Circles

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"); 
     } 
    } 
} 

}

Hauptklasse:

[...] 
    @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()); 
} 
+0

Ich empfehle Ihnen, einen Debugger zu verwenden, um die Werte der Variablen anzuzeigen, die an der Kollisionsberechnung beteiligt sind. Alternativ können Sie die Protokollierungsfunktionen von LibGDX verwenden, um diese Werte auszugeben und sie mit logcat anzuzeigen. –

+0

Das ist wirklich hässlicher Einzug, ich muss zugeben. –

Antwort

0

Sie müssen die Überlappung nicht verwenden.

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

enter image description here

dies bedeutet, enthalten. Es prüft nicht, ob in einem anderen Kreis ein Kreis vorhanden ist oder nicht.


enter image description here

das ist, was Sie want.You Kollision mit Überlappungsverfahren überprüfen können.

0

Vielleicht ist das keine gute Lösung, aber Sie können die Geometriebibliothek verwenden, um den Schnittpunkt zwischen Objekten zu testen.