gpt4 book ai didi

java - libgdx 输入法未调用

转载 作者:行者123 更新时间:2023-12-02 12:46:03 24 4
gpt4 key购买 nike

我有一个屏幕类,它将输入处理器设置为舞台类Gdx.input.setInputProcessor(gameStage);,并且我的舞台类实现inputProcessor 公共(public)类 GameStage 扩展 Stage 实现 InputProcessor。我的舞台类中的输入方法没有被调用,我不明白为什么。我用这个方法测试了一下

@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;
}

编辑:同时删除 implements InputProcessor 阶段类已经实现了该类,因此您不必这样做。这可能是导致您的处理程序被忽略的原因。您将父类的输入处理器设置为主处理程序,但您覆盖了接口(interface)而不是父类的输入处理程序,因此它们不会被看到。

编辑2:尝试实现InputProcessor而不是扩展Stage。

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;
}
}

关于java - libgdx 输入法未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44776030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com