0

私の世界はworld = new World(new Vector2(0, 0), true);//重力がなく、画面の左右上下に壁があるため、要素がディスプレイから飛び散ることはありません。

レンダー クラスに次のコードがあります。

Gdx.gl.glClearColor(0, 0, 0.2f, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
Box2DDebugRenderer debugRenderer = new Box2DDebugRenderer();
batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.draw(texture, 0, 0);
for (Element element : elements) {
element.body.setUserData(element);
element.rect.x = element.body.getPosition().x-16;//16 = half the width of element
element.rect.y = element.body.getPosition().y-16; 
if (element.goodOrEvil == 0) {
        batch.draw(happyImage, element.rect.x, element.rect.y);
} else if (element.goodOrEvil == 1) {
    batch.draw(sadImage, element.rect.x, element.rect.y);
}
} //i draw the elements that i have to fix the bodies to
batch.end();
debugRenderer.render(world, camera.combined);
Iterator<Element> iter = elements.iterator();
//next i set the accelerometer to move the elements, so that i could control them, i need to move all the elements in the same direction, in the same time
while (iter.hasNext()) {
Element element = iter.next();
element.body.setLinearVelocity(Gdx.input.getAccelerometerY() * 50, -Gdx.input.getAccelerometerX() * 50);
}
if (TimeUtils.nanoTime() - lastDropTime > 1000000000)
    spawnElement(); // this creates a new element
world.step(1 / 45f, 6, 2);

ここに私の spawnElement() クラスがあります:

private void spawnElement() {
    Rectangle elementRect = new Rectangle();
    elementRect.x = MathUtils.random(0, 800 - 32);
    elementRect.y = 400;
    elementRect.width = 32;
    elementRect.height = 32;
    Element element = new Element(elementRect, (int) elementRect.x % 2);
    elements.add(element);
    // First we create a body definition
    BodyDef bodyDef = new BodyDef();
    // We set our body to dynamic, for something like ground which doesnt
    // move we would set it to StaticBody
    bodyDef.type = BodyType.DynamicBody;
    // Set our body's starting position in the world
    bodyDef.position.set(elementRect.x, elementRect.y);

    // Create our body in the world using our body definition
    body = world.createBody(bodyDef);

    // Create a circle shape and set its radius to 6
    CircleShape circle = new CircleShape();
    circle.setRadius(6f);

    // Create a fixture definition to apply our shape to
    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = circle;
    fixtureDef.density = 0.5f;
    fixtureDef.friction = 0.4f;
    fixtureDef.restitution = 0.6f; // Make it bounce a little bit

    // Create our fixture and attach it to the body
    Fixture fixture = body.createFixture(fixtureDef);
    element.body = body;

    lastDropTime = TimeUtils.nanoTime();
}

ここで、重力を存在するように設定world = new World(new Vector2(-2, -20), true);し、この行をコメントアウトするとelement.body.setLinearVelocity(Gdx.input.getAccelerometerY() * 50, -Gdx.input.getAccelerometerX() * 50);、物理はうまく機能しますが、オブジェクトを制御できません。コードをそのままにしておくと(重力がなく、その線が入っている)、オブジェクトを制御できますが、要素が壁にぶつかり、別の要素が来ると、それらは重なり合い、その後分割し始めます。私はそれらが互いに衝突し、接近したままである必要がありますが、まったく重ならないようにします。これをどのように作成できるかについてのアイデアはありますか?

4

1 に答える 1

0

使用する代わりに、element.body.setLinearVelocity(Gdx.input.getAccelerometerY() * 50, -Gdx.input.getAccelerometerX() * 50); これを使用しました:

Vector2 gravity = new Vector2(Gdx.input.getAccelerometerY() * 50, -Gdx.input.getAccelerometerX() * 50);
world.setGravity(gravity);

そして、静的な重力を設定したときと同じように応答しますが、加速度計の値を使用して、レンダリングごとに重力を変更します

于 2013-03-28T09:40:58.870 に答える