2016-08-19 72 views
0

我正在一個遊戲中,你必須避免與Spaceship(雪碧)小行星。不幸的是我的碰撞方法不起作用。我可以在手機上運行代碼,但不會打印出「碰撞」。我想我搞砸了一些座標,但我找不到這個錯誤。有任何想法嗎?Sprite和形狀渲染器圈之間的碰撞

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

}

主類:

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

小行星:

[...] 

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

飛船:

[...] 
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

我建議你使用調試器來查看碰撞計算中涉及的變量的值。或者,您可以使用LibGDX的日誌記錄工具輸出這些值並使用logcat查看它們。 –

+0

這是非常醜陋的縮進,我必須承認。 –

回答

0

您需要使用重疊不包含。

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

enter image description here

這意味着包含。它沒有碰撞檢查,它檢查是否完全在另一個圓圈中循環。


enter image description here

這就是你want.You可以檢查與重疊法衝突。

0

也許不是很好的解決方案,但您可以使用幾何庫來測試對象之間的交集。