Java 未调用libgdx输入方法

Java 未调用libgdx输入方法,java,libgdx,Java,Libgdx,我有一个screen类,它将输入处理器设置为stage类Gdx.input.setInputProcessor(gameStage),我的后台类实现了inputProcessor公共类GameStage扩展后台实现了inputProcessor。我的stage类中的输入方法没有被调用,我不知道为什么。我用这种方法进行了测试 @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) {

我有一个screen类,它将输入处理器设置为stage类
Gdx.input.setInputProcessor(gameStage),我的后台类实现了
inputProcessor
公共类GameStage扩展后台实现了inputProcessor
。我的stage类中的输入方法没有被调用,我不知道为什么。我用这种方法进行了测试

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    batch.begin();
    font.draw(batch, "text", 200, 50);
    batch.end();
    return super.touchDown(screenX, screenY, pointer, button);
}
但是文本没有绘制,当我在act方法中使用
Gdx.input.isTouched()
尝试时,它确实起作用

谢谢

编辑:所有代码

public class GameScreen implements Screen {
        private Game game;
        private GameStage gameStage;
        private OrthographicCamera camera;
        private Viewport viewport;

        private Box2DDebugRenderer renderer;

        public GameScreen(Game game) {
            this.game = game;
            this.camera = new OrthographicCamera();
            this.viewport = new ScreenViewport(camera);
            this.gameStage = new GameStage(viewport);
            this.renderer = new Box2DDebugRenderer();
            Gdx.input.setInputProcessor(gameStage);
        }

        public OrthographicCamera getCamera() {
            return this.camera;
        }

        @Override
        public void show() {

        }

        @Override
        public void render(float delta) {
            Gdx.gl.glClearColor(247/255.0f, 247/255.0f, 247/255.0f, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

            gameStage.act();
            renderer.render(gameStage.getWorld(), camera.combined);
            gameStage.draw();
        }

        @Override
        public void resize(int width, int height) {

        }

        @Override
        public void pause() {

        }

        @Override
        public void resume() {

        }

        @Override
        public void hide() {

        }

        @Override
        public void dispose() {

        }
    }
舞台类:

public class GameStage extends Stage {
    private World world;
    private Player player;
    private BitmapFont font;

    private Box2DDebugRenderer renderer;

    public GameStage(Viewport viewport) {
        super(viewport);
        font = new BitmapFont();
        setUpWorld();
    }

    public void setUpWorld() {
        world = WorldUtils.createWorld();
        player = new Player(WorldUtils.createPlayer(world));
    }

    @Override
    public void draw() {
        super.draw();

        getBatch().begin();
        font.draw(getBatch(), "Position: X=" + player.getX() + " Y=" + player.getY(), 200, 50);
        getBatch().end();
    }

    @Override
    public void act(float delta) {
        super.act(delta);
        world.step(1 / 300f, 6, 2);
    }

    public World getWorld() {
        return this.world;
    }

    public Player getPlayer() {
        return this.player;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        player.move();
        super.touchDown(screenX, screenY, pointer, button);
        return true;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        return super.touchDragged(screenX, screenY, pointer);
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        return super.touchUp(screenX, screenY, pointer, button);
    }
}
球员级别:

public class Player extends Actor{
    private Body body;

    public Player(Body body) {
        this.body = body;
    }

    public void move() {
        body.applyForceToCenter(50000, 200, true);
    }
}

如果您想让阶段响应用户输入以及自己响应用户输入,则需要使用输入


不要在输入处理程序中绘制。只需存储坐标。它不起作用,因为你试图在游戏循环之外画画。还返回false而不是父方法,当您返回true时,输入处理器将调用所有其他匹配的输入处理程序。像这样的东西应该可以

boolean touched;
void draw(Batch batch)
    if(touched){
        batch.begin();
        font.draw(batch, "text", 200, 50);
        batch.end();
    }
}
@Override
public boolean touchDown(int screenX, int screenY, int      
pointer , int button) {
    super.touchDown(screenX, screenY, pointer, button);
    touched = true;
    return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int      
pointer , int button) {
    super.touchUp(screenX, screenY, pointer, button);
    touched = false;
    return false;
}
编辑:同时删除
实现InputProcessor
阶段类已经实现了该类,因此您不必这样做。这可能是导致处理程序被忽略的原因。您将父类的输入处理器设置为主处理程序,但您将重写接口的输入处理程序,而不是父类,因此不会看到它们

编辑2:尝试实现InputProcessor而不是扩展阶段

public class GameStage InputProcessor {
    private Stage stage;
    private InputMultiplexer input;
    private World world;
    private Player player;
    private BitmapFont font;

    private Box2DDebugRenderer renderer;

    public GameStage(Viewport viewport) {
        stage = new Stage(viewport);
        font = new BitmapFont();
        setUpWorld();
        input = new InputMultiplexer();
        input.addProcessor(this);
        input.addProcessor(stage);
    }

    public void setUpWorld() {
        world = WorldUtils.createWorld();
        player = new Player(WorldUtils.createPlayer(world));
        stage.addActor(player)
    }

    @Override
    public void draw() {
        stage.draw();

        getBatch().begin();
        font.draw(getBatch(), "Position: X=" + player.getX() + " Y=" + player.getY(), 200, 50);
        getBatch().end();
    }

    @Override
    public void act(float delta) {
        stage.act(delta);
        world.step(1 / 300f, 6, 2);
    }

    public World getWorld() {
        return this.world;
    }

    public Player getPlayer() {
        return this.player;
    }

    public InputAdapter getInput(){
        return this.input;
    }

    public Stage getStage(){
        return this stage;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        player.move();
        return true;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        return true;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        return true;
    }
}

希望你是这样做的:

public class GdxTest extends Game  {

    MyStage myStage;

    @Override
    public void create() {

        myStage =new MyStage();
        Gdx.input.setInputProcessor(myStage);
    }

    @Override
    public void render() {

        Gdx.gl.glClearColor(0,0,0,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        myStage.draw();
        myStage.act();
    }
}
MyStage
class

public class MyStage extends Stage {

    BitmapFont font;

    public MyStage(){
        font=new BitmapFont();
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {

        Gdx.app.log("MyStage","Inside touchDown method");
        drawText();

        return super.touchDown(screenX, screenY, pointer, button);
    }

    @Override
    public void act() {
        super.act();

        //if(Gdx.input.isTouched()) {
        //    drawText();
        //}
    }

    public void drawText(){
        getBatch().begin();
        font.draw(getBatch(), "text", 200, 50);
        getBatch().end();
    }
}
根据您的说法:当您从
触地(…)
方法调用
drawText()
时,文本不是绘图,但如果您从
act()
方法调用文本,则屏幕上会显示文本

文本不呈现的原因:

每当您触摸屏幕时,
drawText()
方法从
touchtdown(…)
方法调用,但下一次
render()
调用将清除该方法,所以您在屏幕上得到了提示,但另一方面,如果您从
act()
方法调用
drawText()
方法,则实际由
render()调用
ApplicationListener的方法
so在清除帧缓冲区并设置颜色缓冲区后绘制文本

解决方案:

您需要在每次渲染调用时调用
drawText()
,以便覆盖
MyStage
draw()
方法,并使用标志调用
drawText()

boolean drawText;

@Override
public void draw() {
    super.draw();

    if(drawText) {
       drawText();
    }
}
并更改
着陆(..)
方法中的标志值

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    drawText=true;

    return super.touchDown(screenX, screenY, pointer, button);
}

两项建议:

  • Stage
    类已经通过其适配器类实现了
    InputProcessor
    ,因此需要再次实现

  • Stage
    类拥有自己的私有批处理引用,因此无需创建自己的批处理引用,您可以使用
    getBatch()
    方法


  • Stage是一个InputProcessor,那么您所说的
    我的Stage类实现InputProcessor是什么意思?再加一些code@AbhishekAryan我添加了代码stage实际上是scene2d stage类吗?因为如果你使用舞台,为什么不使用演员呢?如果是@AbhishekAryan建议的情况,
    implements inputprocessor
    是冗余的不仅stage应该响应输入,而且stage类中的输入方法没有被调用。触摸处理在呈现之前完成,并且在同一线程上完成。所以从理论上讲,这应该是可行的。然而,这不是一个好的做法。同意,这不是问题。答案实际上是我答案中经过编辑的部分。如果
    implements InputProcessor
    被删除,它将起作用。文本闪烁的时间不会超过消失的时间,是吗?@GeoffTaylor没有,但正在调用该方法,我将文本的绘图移动到另一个方法,在调用触地时调用该方法,与第一个回答相同,尝试使用不同的处理程序,而不是
    touchDown()
    try
    touchDrawed()
    instead。我已经删除了冗余的机具输入处理器和额外的spritebatch,并将文本移动到不同的方法,但它仍然不起作用
    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        drawText=true;
    
        return super.touchDown(screenX, screenY, pointer, button);
    }