I've created 2 buttons for movement in my game but when those button are being pressed, the character gets basically thrown away and by pressing only once the movement it's continuous and i don't understand with box2D what's the right way to handle the movement of the character

The code looks something like this:

public class PlayScreen implements Screen {

    private SuperShooter game;
    private OrthographicCamera gamecam; 
    private Viewport gamePort; 
    private Hud hud;
    private OrthographicCamera guicam;

    Rectangle wleftBounds;
    Rectangle wrightBounds;
    //Vector3 for keeping the coordinates
    Vector3 touchPoint;
    //Texture for touch buttons
    Texture leftRegion;
    Texture rightRegion;

    private TmxMapLoader mapLoader;
    private TiledMap map;
    private OrthogonalTiledMapRenderer renderer;

    //Box2D Variables
    private World world;
    private Box2DDebugRenderer b2dr;
    private John player;

    public PlayScreen(SuperShooter game){
        this.game = game;
        gamecam = new OrthographicCamera();
        gamePort = new StretchViewport(SuperShooter.V_WIDTH / SuperShooter.PPM, SuperShooter.V_HEIGHT / SuperShooter.PPM, gamecam);

        hud = new Hud(game.batch);
        mapLoader = new TmxMapLoader();
        map = mapLoader.load("Level1WithObjects2.tmx");
        renderer = new OrthogonalTiledMapRenderer(map, 1/SuperShooter.PPM);

        gamecam.position.set(gamePort.getWorldWidth()/2, gamePort.getWorldHeight()/2, 0);

        world = new World(new Vector2(0,-15), true);
        new B2WorldCreator(world, map);

        b2dr = new Box2DDebugRenderer();
        player = new John(world);

        guicam = new OrthographicCamera(480, 320);

        guicam.position.set(480/2F, 320/2F, 0);

        wleftBounds = new Rectangle(0,0,80,25);
        wrightBounds = new Rectangle(80, 0, 80,25);

        //creating the vector
        touchPoint = new Vector3();

        //Instantiating Textures
        leftRegion = new Texture(Gdx.files.internal("back.png"));
        rightRegion = new Texture(Gdx.files.internal("next (1).png"));

    public void show() {


    public void handleInput(float dt){


        for (int i=0; i<5; i++){
            if (Gdx.input.isTouched(i)) continue;
            guicam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
            if (wleftBounds.contains(touchPoint.x, touchPoint.y)){
                player.b2body.applyLinearImpulse(new Vector2(-0.02f, 0), player.b2body.getWorldCenter(),true);
            }else if (wrightBounds.contains(touchPoint.x, touchPoint.y)){
                player.b2body.applyLinearImpulse(new Vector2(0.02f, 0), player.b2body.getWorldCenter(),true);



    public void update(float dt){
        world.step(1/60f, 6, 2); 
        gamecam.position.x = player.b2body.getPosition().x; 

    public void render(float delta) {

        Gdx.gl.glClearColor(1, 1, 1, 1);
        //render our Box2dDebugLines
        b2dr.render(world, gamecam.combined);



        //draw touch buttons
        game.batch.draw(leftRegion, wleftBounds.x, wleftBounds.y, wleftBounds.width, wleftBounds.height);
        game.batch.draw(rightRegion, wrightBounds.x, wrightBounds.y, wrightBounds.width, wrightBounds.height);


    public void resize(int width, int height) {
        gamePort.update(width, height);

    public void pause() {


    public void resume() {


    public void hide() {


    public void dispose() {

So, the player moves with 0.2f and -0.2f and if i change it to 0.1f it won't move at all..and the movement feels like it's too fast, you touch it once and the character keeps moving :( are there any other ways to do this?or what's wrong with this code? should i change the way that the force it's applied to the character?


1 Answer 1


Firstly. I am not sure that you are asking about a platformer or a top down styled game. And for reducing speed overtime you should do it by multiplying the speed to a float <1 for example:

          Player.speed *= 0.75f;

Those value is common for physics place the code in update method or something that ran each frame. Btw sorry if it is not clear as i never worked with Box2d before.

And if those method wasnt working i suggest you make your own simple physics engine.

Another notes: some physics engine have a density field/variable on each object, maybe changing that would work.


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .