Простой круг на круге Столкновение libgdx

0

сделал два круга один из радиуса 8 (изображение 16x16) и один из радиуса 20 (изображение 40x40), я вызываю круг по методу перекрытия, и совпадение просто выключено. Он сталкивается с кругом, который находится вокруг 0,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();

            }

    }

}   
}
Теги:
libgdx
circle

1 ответ

4
Лучший ответ

Если ваша пуля и мяч - 2 круга, как вы сказали, вам не нужен метод перекрытия.
Это просто: 2 круга сталкиваются, если их расстояние меньше, чем сумма их радиусов.

Чтобы вычислить расстояние, необходимо сделать squareroot. Это довольно дорогостоящий расчет, поэтому было бы лучше использовать квадрат расстояния и квадрат суммы радиусов:

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 start top right false начинается сверху слева

Это неправильно, это верхний левый или нижний левый. По умолчанию это нижний левый угол, потому что это то, как система координат работает нормально. Верхний левый - потому, что монитор обращается к пикселам, начиная с верхнего левого угла = пиксель 1.

EDIT: это должна быть проблема: координаты, которые вы даете методу batch.draw - это левый нижний угол Texture по умолчанию, если вы используете "y = Down" -System, это должен быть верхний левый угол (вы должен попробовать, я не уверен).
Вместо этого положение Circle является его центром.
Чтобы решить проблему, вам нужно отрегулировать положение, подобное этому (для "y = Вверх" -System):

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

Возможно, что эта же формула работает и для "y = Down" -System, но я не уверен

  • 0
    он все еще делает то же самое, функция перекрытия в порядке. работал так же, как ваш. я думаю, что просто верю, что центр моего шара находится в верхнем левом углу (0,0) изображения шара, а не в центре.
  • 0
    положение Texture - это левый нижний угол по умолчанию. Если вы измените систему координат, это должен быть верхний левый угол. Я не уверен, что то же самое относится к классу Circle .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню