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

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

}

}

}
}

0

Решение

Если ваша пуля и мяч — 2 круга, как вы и сказали, вам не нужен метод перекрытия.
Это просто: сталкиваются 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 Вы написали комментарий:

// истина начинается сверху справа ложь начинается сверху слева

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

РЕДАКТИРОВАТЬ: это должно быть проблемой: координаты, которые вы даете batch.draw Метод левый нижний угол Texture по умолчанию, если вы используете систему «y = Down», это должен быть верхний левый угол (вы должны попробовать, я не уверен).
CircleВместо этого позиция s является ее центром.
Чтобы решить проблему, вам нужно отрегулировать положение следующим образом (для системы «y = Up»):

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

Возможно, эта же формула работает и для системы «y = Down», но я не уверен

4

Другие решения


По вопросам рекламы [email protected]