圆形碰撞libgdx上的简单圆

时间:2014-06-12 04:55:58

标签: java android c++ libgdx geometry

制作两个半径为8的圆圈(图像16x16) 和半径20之一(图像40x40) 我在重叠方法中调用圆圈,并且collsion刚刚关闭。它与一个圆圈碰撞,这个圆圈位于我的球形象的0点附近。子弹可以进入底部和右侧的球内。

    public class MyGame extends ApplicationAdapter {
SpriteBatch batch;
Texture ballImage, bulletImage;
OrthographicCamera cam;
Circle ball;
Array <Circle> bullets;
long lastShot;

@Override
public void create ()
{
    System.out.println("game created");
    ballImage = new Texture(Gdx.files.internal("ball.png"));
    bulletImage = new Texture(Gdx.files.internal("bullet.png"));

    cam = new OrthographicCamera();
    cam.setToOrtho(true,320,480);//true starts top right false starts top left

    batch = new SpriteBatch();  

    ball = new Circle();
    ball.radius=20;
    ball.x=320/2-ball.radius; // half screen size - half image
    ball.y=480/2-ball.radius;


    bullets = new Array<Circle>();
     spawnBullet();

/* 


    batch.draw(bulletImage,bullet.x,bullet.y);
    bullet.x++;
    bullet.y++; */

}

public void spawnBullet()
{
    Circle bullet = new Circle();
    bullet.radius=8;
    bullet.x=0;
    bullet.y=0;

    bullets.add(bullet);
    lastShot = TimeUtils.nanoTime();
}

@Override
public void render ()
{
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    cam.update();
    batch.setProjectionMatrix(cam.combined);
    batch.begin();
    batch.draw(ballImage,ball.x,ball.y);

    for(Circle bullet: bullets)
    {
        batch.draw(bulletImage, bullet.x, bullet.y);
    }

    batch.end();



    if(Gdx.input.isTouched())
    {           
        Vector3 pos = new Vector3();
        pos.set(Gdx.input.getX(), Gdx.input.getY(),0);
        cam.unproject(pos);

        ball.y = pos.y - ball.radius;   
        ball.x = pos.x - ball.radius ;
    }

    //if(TimeUtils.nanoTime()-lastShot >1000000000) one second
        //spawnBullet();

    Iterator<Circle> i = bullets.iterator();    
    while(i.hasNext())
    {
        Circle bullet = i.next();
        bullet.x++;
        bullet.y++;
        if(bullet.overlaps(ball))
        {
            System.out.println("overlap");
            i.remove();

            }

    }

}   
}

1 个答案:

答案 0 :(得分:4)

如果您的子弹和球是2个圆圈,就像您说的那样,您不需要重叠方法 很简单:如果两个圆的距离小于半径的总和,则会碰撞两个圆。

计算制作平方根所需的距离。这是一个非常昂贵的计算,所以最好使用平方距离和平方和半径:

float xD = ball.x - bullet.x;      // delta x
float yD = ball.y - bullet.y;      // delta y
float sqDist = xD * xD + yD * yD;  // square distance
boolean collision = sqDist <= (ball.radius+bullet.radius) * (ball.radius+bullet.radius);

多数民众赞成。

同样在你的cam.setToOrtho你写了一篇文章:

  

// true开始右上角false开始左上角

这是错误的,它是左上角或左下角。默认情况下它位于左下角,因为这是坐标系正常工作的方式。左上角是,因为显示器从左上角开始寻址像素=像素1。

编辑:这应该是问题:默认情况下,您提供batch.draw方法的坐标是Texture的左下角,如果您正在使用“ y =向下“ - 系统它应该是左上角(你必须尝试我不确定)。
相反,Circle的位置是其中心 要解决这个问题,你需要像这样调整位置(对于“y = Up” - 系统):

batch.draw(bulletImage, bullet.x - bullet.radius, bullet.y - bullet.radius);

有可能,同样的公式也适用于“y = Down”系统,但我不确定