【问题标题】:LIBGDX Camera doesn't moveLIBGDX 相机不动
【发布时间】:2015-08-14 13:17:33
【问题描述】:

我的游戏设置了这个屏幕,我看到了我创建的演员。

但是谁能告诉我为什么相机似乎没有移动?当我按下左键时,我希望演员向右移动。

Gdx.input.isKeyPressed(Input.Keys.LEFT) 确实解析为 true,并且确实调用了 translate 函数。

public class MainScreen implements Screen {

    private Stage mainStage;
    private Camera orthCamera;

    @Override
    public void show() {


        orthCamera = new OrthographicCamera();

        mainStage = new Stage(new ScreenViewport());
        mainStage.getViewport().setCamera(orthCamera);

        MyGameActorObject s = new MyGameActorObject();
        s.setPosition(100, 100);

        mainStage.addActor(s);
    }

    @Override
    public void render(float delta) {

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

        processKeyboardInput();

        mainStage.act(delta);
        mainStage.draw();
    }

    private void processKeyboardInput()
    {
        if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
            orthCamera.translate(-30, 0, 0);
            orthCamera.update();
        }
    }

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

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        mainStage.dispose();
    }
}

我正在努力实现能够使用键盘输入在 2d 游戏世界中平移。

这是自定义 Actor 对象的内容:

public class MyGameActorObject extends Actor
{
    @Override
    public void act(float delta) {
        super.act(delta);
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {

        super.draw(batch, parentAlpha);

        ShapeRenderer r = new ShapeRenderer();

        r.begin(ShapeRenderer.ShapeType.Filled);
        r.setColor(Color.RED);
        r.circle(this.getX() - 50.0f, this.getY() - 50.0f, 100.0f);
        r.end();

    }
}

【问题讨论】:

  • 按左键有什么反应吗?
  • isKeyPressed 在您期望的时候返回 true 吗?
  • 也许可以尝试使用 ScreenViewport (example) 内部创建的相机
  • 那段代码的结果相同。
  • 这与我的游戏对象有关吗?就像我使用 Image actor 时一样,它可以正常工作。

标签: android libgdx scene2d


【解决方案1】:

我相信我必须添加类似

的内容
r.setProjectionMatrix(batch.getProjectionMatrix());

在我的自定义演员对象中。所以我的对象上的绘制函数现在是。

    @Override
    public void draw(Batch batch, float parentAlpha) {

        super.draw(batch, parentAlpha);

        ShapeRenderer r = new ShapeRenderer();

        r.setProjectionMatrix(batch.getProjectionMatrix());
        r.begin(ShapeRenderer.ShapeType.Filled);
        r.setColor(Color.RED);
        r.circle(this.getX() - 50.0f, this.getY() - 50.0f, 100.0f);
        r.end();

    }

【讨论】:

    【解决方案2】:

    我认为你的问题是你没有设置InputProcessor

    Gdx.input.setInputProcessor(...) 是您正在寻找的方法。将其放入您的 show() 方法中并传递给它一个 InputProcessor 引用。 InputProcessor 是一个接口,它处理所有不同类型的基于单击的输入,并允许您确定其中发生的情况。比如:

    @Override
    public boolean keyDown(int keycode)
    {
        switch(keycode)
        {
            case Keys.D:
                screen.universe.entity_handler.player.moving_right = true;
                break;
            case Keys.A:
                screen.universe.entity_handler.player.moving_left = true;
                break;
            case Keys.SPACE:
                screen.universe.entity_handler.player.jumping = true;
                break;
            ...
       }
       ...
    }
    

    上面的代码是我正在制作的游戏的InputProcessor-implementing 类的一部分。当有问题的输入被按下时(在本例中为keyDown),游戏会查看您的输入按钮(keycode)并通过 switch 语句发送。

    请记住,您必须为要使用的所有输入事件返回 true。这就是此方法的 boolean 返回值。

    【讨论】:

    • isKeyPressed 事件确实会触发,据我所见,相机确实被翻译了。我没有使用事件监听器,而是检查状态。
    • 建议很可靠,但 OP 没有使用 InputProcessor API - 他们使用的是 isKeyPressed,它本身应该可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多