Java 未调用libgdx输入方法
我有一个screen类,它将输入处理器设置为stage类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) {
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()
trytouchDrawed()
instead。我已经删除了冗余的机具输入处理器和额外的spritebatch,并将文本移动到不同的方法,但它仍然不起作用
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
drawText=true;
return super.touchDown(screenX, screenY, pointer, button);
}