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

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -