我是libgdx的新手,我想知道你是否应该使用render()方法来获取用户输入,或者是否应该使用InputProcessor。
答案 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 driven或continuous?
例如,如果你想在按下某个键时在屏幕上移动一个精灵,那么这是一个连续的动作:
@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
标志,那么您也可以使用内置输入轮询。