简体   繁体   English

Sprite和Shape Renderer圆之间的碰撞

[英]Collision between Sprite and Shape Renderer Circles

Im working on a game where you have to avoid Asteroids with a Spaceship (Sprite). 我在一个游戏中工作,必须避免使用带有飞船的小行星(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());
}

也许不是一个好的解决方案,但是您可以使用几何库来测试对象之间的交集。

You need to use overlap not contains . 您需要使用不包含的重叠。

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

在此处输入图片说明

this means contain. 这意味着包含。 Its not collision check it checks whether or not circle in an other circle completely. 它不进行碰撞检查,它检查是否完全在另一个圆圈中圈出。


在此处输入图片说明

this is what you want.You can check collision with overlap method. 这就是您想要的。您可以使用重叠方法检查碰撞。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM