检测render()中的用户输入或使用libgdx中的InputProcessor

时间:2016-09-05 21:32:31

标签: libgdx

我是libgdx的新手,我想知道你是否应该使用render()方法来获取用户输入,或者是否应该使用InputProcessor。

2 个答案:

答案 0 :(得分:0)

您应该使用 InputProcessor 进行用户输入。

如果你想匿名写,那么在show方法中你应该写: -

 Gdx.input.setInputProcessor(new InputProcessor() {

        @Override
        public boolean touchUp(int arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean touchDragged(int arg0, int arg1, int arg2) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean touchDown(int arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean scrolled(int arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean mouseMoved(int arg0, int arg1) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean keyUp(int arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean keyTyped(char arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean keyDown(int arg0) {
            // TODO Auto-generated method stub
            return false;
        }
    });

或者您可以在setInputProcessor中实现输入处理器和注册实例。  例如: -

     public class InputTest implements InputProcessor {

@Override
public boolean keyDown(int arg0) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean keyTyped(char arg0) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean keyUp(int arg0) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean mouseMoved(int arg0, int arg1) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean scrolled(int arg0) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean touchDown(int arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean touchDragged(int arg0, int arg1, int arg2) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean touchUp(int arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub
    return false;
}

}

在你的屏幕课的show方法中你应该写: -

public void show() {

    Gdx.input.setInputProcessor(new InputTest());
}

在我的建议中,如果您不使用舞台,这两个是获取用户输入的最佳方式。 希望这对你有用。

答案 1 :(得分:0)

这取决于用例。为什么需要它,是否需要完成event drivencontinuous

例如,如果你想在按下某个键时在屏幕上移动一个精灵,那么这是一个连续的动作:

@Override public void render() {
    if (Gdx.input.isKeyPressed(Input.Keys.SPACE))
        sprite.translateX(speed * Gdx.graphics.getDeltaTime());
    ...
}

但是,如果您想要在用户按某个键时更改颜色,那么这是一个事件:

@Override public void create() {
    Gdx.input.setInputProcessor(new InputAdapter() {
        @Override public boolean keyUp (int keycode) {
            if (keycode == Input.Keys.SPACE)
                sprite.setColor(Color.RED);
        }
    });
    ...
}

请注意,轮询是一种基于事件构建的便捷方法,您自己很容易。像这样:

private boolean moving;
@Override public void create() {
    Gdx.input.setInputProcessor(new InputAdapter() {
        @Override public boolean keyDown (int keycode) {
            if (keycode == Input.Keys.SPACE)
                moving = true;
        }
        @Override public boolean keyUp (int keycode) {
            if (keycode == Input.Keys.SPACE)
                moving = false;
        }
    });
    ...
}

@Override public void render() {
    if (moving)
        sprite.translateX(speed * Gdx.graphics.getDeltaTime());
    ...
}

这通常允许您编写更干净和用例特定的代码,如下所示:

private float speed;
@Override public void create() {
    Gdx.input.setInputProcessor(new InputAdapter() {
        @Override public boolean keyDown (int keycode) {
            switch (keycode) {
                case Input.Keys.LEFT: speed -= 10f; break;
                case Input.Keys.RIGHT: speed += 10f; break;
            }
        }
        @Override public boolean keyUp (int keycode) {
            switch (keycode) {
                case Input.Keys.LEFT: speed += 10f; break;
                case Input.Keys.RIGHT: speed -= 10f; break;
            }
        }
    });
    ...
}

@Override public void render() {
    sprite.translateX(speed * Gdx.graphics.getDeltaTime());
    ...
}

考虑到这一点,在许多情况下,使用事件驱动的输入处理会更好。但是,如果您发现自己使用了大量boolean标志,那么您也可以使用内置输入轮询。