Search code examples
libgdxbox2d

box2d dynamic body is not falling under gravity


I am trying to make a dynamic body which should move ahead a bit and then fall according to its gravity(as decided by the box2d engine). The problem is that right after moving upto a certain distance, instead of moving down, it is going up. This is the code i am using:

 public class AngryBirdsTrajectoryPrototype implements ApplicationListener
    {
        private SpriteBatch spriteBatch;
        private Texture backgroundTexture;
        private Sprite backgroundSprite;
        private static Sprite ball_in_hand;
        private Texture ball_in_hand_Texture;
        private static com.badlogic.gdx.physics.box2d.Body b2Body;
        private com.badlogic.gdx.physics.box2d.World box2Dworld;
        private boolean isBallShooted;

        @Override
        public void create() {
            spriteBatch = new SpriteBatch();

            Texture.setEnforcePotImages(false);

            backgroundTexture = new Texture(Gdx.files.internal("angrybirds/background.png"));
            backgroundTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

            backgroundSprite = new Sprite(backgroundTexture);
            backgroundSprite.setPosition(0, 0);

            ball_in_hand_Texture = new Texture(Gdx.files.internal("test/ball_in_hand.png"));
            ball_in_hand_Texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

            ball_in_hand = new Sprite(ball_in_hand_Texture);

            this.box2Dworld = new com.badlogic.gdx.physics.box2d.World(new Vector2(0.0F, 10.0F), true);
        }

        @Override
        public void render() {
            Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1f);
            Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

            if(!isBallShooted)
            {
                isBallShooted = true;
                shoot(this.box2Dworld, 27.0F, 0.F);
            }

            box2Dworld.step(1.0f/60.0f, 6, 2);

            spriteBatch.begin();
            backgroundSprite.draw(spriteBatch);

            Array<Body> bodies = new Array<Body>();

            box2Dworld.getBodies(bodies);

            for (Body body : bodies) 
            {
                ball_in_hand.setPosition(30.0F * body.getPosition().x, 30.0F * body.getPosition().y);

                Gdx.app.error("", "angleDegree= " + body.getAngle());
            }

            ball_in_hand.draw(spriteBatch);
            spriteBatch.end();
        }

        @Override
        public void dispose() {
            spriteBatch.dispose();
            backgroundTexture.dispose();
        }


        public static void shoot(com.badlogic.gdx.physics.box2d.World var1, float var2, float var3) 
        {
            BodyDef var4 = new BodyDef();
            var4.position.set(ball_in_hand.getX() / 30.0F, ball_in_hand.getY() / 30.0F);
            var4.type = BodyType.DynamicBody;
            var4.bullet = true;
            var4.angularDamping = 0.5F;
            b2Body = var1.createBody(var4);
            CircleShape var6 = new CircleShape();
            var6.setRadius(0.4F);
            FixtureDef var7 = new FixtureDef();
            var7.density = 0.8F;
            var7.shape = var6;
            var7.restitution = 0.7F;
            var7.friction = 1.0F;
            b2Body.createFixture(var7);
            float var9 = var2 * 9.0F;
            Vector2 var10 = new Vector2(var9 * (float)Math.cos((double)var3), var9 * (float)Math.sin((double)var3));
            b2Body.applyForce(var10, b2Body.getWorldCenter(), true);
        }
    }

This is the output i am getting.

enter image description here

This is the output i want to achieve:

enter image description here

I have tried all possible options but none of them is working. Please help me. Thanks in advance.


Solution

  • Try this:

    1. You should set your gravity to a negative number because of the Box2d coordinate system, like this:
    enter code here`this.world = new World(new Vector2(0, -9.8f), true);
    
    1. You should create a camera for your physics world and convert all your sizes to meters. For example, you can set 100 pixels = 1 meter in the box2d world, so you will need to set your camera's width and height in meters, too. Here is a full working example.

    You can also get delta like this: Gdx.graphics.getDeltaTime()

    Please let me know if it helped.