Java LibGDX cannot move with physics bodies and gravity enabled -
i use i'm stuck on this. i'm trying make block in simple game ground , block fall onto , possibly bounce little able move box left or right fall off of first block. can me please?
for interested in answer poprosturonin , dermetfan's youtube videos able results looking for, can try below code in project , change sprite textures.
private box2ddebugrenderer debugrenderer; private orthographiccamera camera; private float spritespeed = 500000; private world world; private sprite playersprite; private sprite groundsprite; private body playerbody; private body groundbody; private vector2 movement = new vector2(); private array<body> tmpbodies = new array<body>(); public teststate(gamestatemanager gsm) { super(gsm); gdx.input.setinputprocessor(this); batch = new spritebatch(); debugrenderer = new box2ddebugrenderer(); camera = new orthographiccamera(); // sprites playersprite = new sprite(new texture("badlogic.jpg")); groundsprite = new sprite(new texture("ground-tiles-01.gif")); // world world = new world(new vector2(0, -9.8f), true); // player sprite // body definition bodydef bodydef = new bodydef(); bodydef.type = bodytype.dynamicbody; bodydef.position.set(0, 200); //1m polygonshape shape = new polygonshape(); shape.setasbox(10, 10); // fixture definition fixturedef fixturedef = new fixturedef(); fixturedef.shape = shape; fixturedef.density = 2.5f; //2.5kg fixturedef.friction = 0; //0-1 fixturedef.restitution = .75f; //0-1 playerbody = world.createbody(bodydef); playerbody.createfixture(fixturedef); playerbody.setuserdata(playersprite); playersprite.setsize(20, 20); playersprite.setorigin(playersprite.getwidth() / 2, playersprite.getheight() / 2); shape.dispose(); // ground sprite // body definition bodydef groundbodydef = new bodydef(); groundbodydef.type = bodytype.staticbody; groundbodydef.position.set(0, 0); //1m polygonshape groundshape = new polygonshape(); groundshape.setasbox(groundsprite.getheight() / 2, groundsprite.getwidth() / 2); // fixture definition fixturedef groundfixturedef = new fixturedef(); groundfixturedef.shape = groundshape; groundfixturedef.density = 100; //2.5kg groundfixturedef.friction = .25f; //0-1 groundfixturedef.restitution = 0; //0-1 groundbody = world.createbody(groundbodydef); groundbody.createfixture(groundfixturedef); groundbody.setuserdata(groundsprite); groundsprite.setsize(groundsprite.getheight(), groundsprite.getwidth()); groundsprite.setorigin(groundsprite.getwidth() / 2, groundsprite.getheight() / 2); groundshape.dispose(); } @override public void update(float delta) { camera.viewportwidth = gdx.graphics.getwidth(); camera.viewportheight = gdx.graphics.getheight(); } @override public void render() { gdx.gl.glclearcolor(50 / 255f, 213 / 255f, 237 / 255f, 1); gdx.gl.glclear(gl20.gl_color_buffer_bit); debugrenderer.render(world, camera.combined); batch.setprojectionmatrix(camera.combined); world.step(gdx.graphics.getdeltatime(), 6, 2); playerbody.applyforcetocenter(movement, true); batch.begin(); world.getbodies(tmpbodies); (body body : tmpbodies){ if (body.getuserdata() != null && body.getuserdata() instanceof sprite) { sprite sprite = (sprite) body.getuserdata(); sprite.setposition(body.getposition().x - sprite.getwidth() / 2, body.getposition().y - sprite.getheight() / 2); sprite.setrotation(body.getangle() * mathutils.radianstodegrees); sprite.draw(batch); } } batch.end(); camera.position.set(playerbody.getposition().x, playerbody.getposition().y, 0); camera.update(); } @override public void dispose() { world.dispose(); playersprite.gettexture().dispose(); groundsprite.gettexture().dispose(); } @override public boolean keydown(int keycode) { switch (keycode) { case keys.dpad_left: movement.x = -spritespeed; break; case keys.dpad_right: movement.x = spritespeed; break; case keys.dpad_up: movement.y = spritespeed; break; case keys.dpad_down: movement.y = -spritespeed; } return true; } @override public boolean keyup(int keycode) { switch (keycode) { case keys.dpad_left: case keys.dpad_right: movement.x = 0; break; case keys.dpad_up: case keys.dpad_down: movement.y = 0; } return true; }
you code valid, problem numbers.
mass of body big, 20480kg. gravity inverted because ask it:
world = new world(new vector2(0, -1000f), true);
-1000, under 0 inverted , big number (1000 on "planet" , 9.8 on earth) cause object less controllable.
changes values:
float spritespeed = 60000; ... world = new world(new vector2(0, 9.8f), true); ... fixturedef.density = 1; fixturedef2.density = 1;
you notice body controllable (it can fly). play these numbers , learn basic physics rules have idea doing.
the sprite , body position synced, not aligned properly. use code make first step make aligned texture body.
sprite.setcenter(body.getposition().x, body.getposition().y); groundsprite.setcenter(ground.getposition().x, ground.getposition().y);
but rotation
groundsprite.setorigincenter(); sprite.setorigincenter(); groundsprite.setrotation(ground.getangle() * mathutils.raddeg); sprite.setrotation(body.getangle() * mathutils.raddeg);
this simple object single texture , can align @ center, objects become more complicated code need changed.
Comments
Post a Comment