Quantcast
Channel: Question and Answer » libgdx
Viewing all articles
Browse latest Browse all 434

Event handling for Pressing only 4 keys on desktop

$
0
0

I want to poll only 4 keys i.e. Keys.LEFT, Keys.RIGHT, Keys.Up and Keys.Down in libGDX strictly.
That means, I want to call render method, only when above 4 keys are pressed.

I followed below link and implemented InputProcessor (see code below), extending InputAdapter for keyDown only.

https://github.com/libgdx/libgdx/wiki/Event-handling

Gdx.input.setInputProcessor(new InputAdapter () {
            @Override
               public boolean keyDown (int keycode) {
                if(keycode==Keys.LEFT)
                {
                    System.out.println("left");
                    }
                if(keycode==Keys.RIGHT)
                {
                    System.out.println("right");
                }
                if(keycode==Keys.DOWN)
                {
                    System.out.println("DOWN");
                }
                if(keycode==Keys.UP)
                {
                    System.out.println("UP");
                }
                return true;
               }    
        });

But i am not getting the result as expected.

After running application on desktop, whenever I move mouse pointer over game screen or pressing other keys , its FPS is changing . That means render method is being called. Why?

Here is my full code for testing. See the output at bottom.

package com.GDXTests.game;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.FPSLogger;

public class FPSTest extends ApplicationAdapter {
    private Texture tex;
    private SpriteBatch batch;
    private OrthographicCamera camera;
    public FPSLogger fpslog;

    @Override
    public void create ()
    {
    // Loading Texture
         tex=new Texture(Gdx.files.external("desktop/bit0.jpg"));
         camera = new OrthographicCamera();
         camera.setToOrtho(false, 256, 256);
         batch = new SpriteBatch();
          //initializing logger
         fpslog=new FPSLogger();
          //disabling the continuous rendering
         Gdx.graphics.setContinuousRendering(false);
         Gdx.graphics.requestRendering();
    }
    @Override
    public void render () {

        //logging fps
        fpslog.log();
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
         // tell the camera to update its matrices.
          camera.update();
          // tell the SpriteBatch to render in the
          // coordinate system specified by the camera.
          batch.setProjectionMatrix(camera.combined);

        batch.begin();
        batch.draw(tex,2,3);
        batch.end();

        Gdx.input.setInputProcessor(new InputAdapter () {
            @Override
               public boolean keyDown (int keycode) {
                if(keycode==Keys.LEFT)
                {
                    System.out.println("left");
                }
                if(keycode==Keys.RIGHT)
                {
                    System.out.println("right");
                }
                if(keycode==Keys.DOWN)
                {
                    System.out.println("DOWN");
                }
                if(keycode==Keys.UP)
                {
                    System.out.println("UP");
                }
                return true;
               }        
        });
    }
     @Override
       public void dispose() {
          // dispose of all the native resources
         tex.dispose();   
         batch.dispose();
       }
       @Override
       public void resize(int width, int height) {
       }
       @Override
       public void pause() {
       }
       @Override
       public void resume() {
       }
}

Here is the output of logger:

right
FPSLogger: fps: 2
left
UP
FPSLogger: fps: 5
DOWN
left
FPSLogger: fps: 3
right
UP
DOWN
FPSLogger: fps: 6       // move mouse pointer over screen, not pressing any keys
FPSLogger: fps: 2       // move mouse pointer over screen, not pressing any keys
FPSLogger: fps: 61      // move mouse pointer over screen, not pressing any keys
FPSLogger: fps: 24      // move mouse pointer over screen, not pressing any keys
FPSLogger: fps: 52      // move mouse pointer over screen, not pressing any keys
FPSLogger: fps: 14      // move mouse pointer over screen, not pressing any keys
FPSLogger: fps: 21      // move mouse pointer over screen, not pressing any keys
UP
FPSLogger: fps: 15
DOWN
FPSLogger: fps: 2
left
right
FPSLogger: fps: 4
right
FPSLogger: fps: 3
right
FPSLogger: fps: 3

I want something like this

right
FPSLogger: fps: 1
left
FPSLogger: fps: 1
DOWN
FPSLogger: fps: 1
UP
FPSLogger: fps: 1

Thanks in Advance!


Viewing all articles
Browse latest Browse all 434

Trending Articles