控制精灵旋转(它像疯了似的旋转)

时间:2015-03-14 06:09:45

标签: java android rotation libgdx

所以,我创建了一个纹理,然后是一个精灵。 在我的render()方法上,我检查用户输入。如果用户触摸/点击了,那么我希望我的精灵旋转90度ONCE。

现在轮换有效。但是,每次点击它会旋转多次!

如何每次触摸只旋转一次?我有一种感觉,我可能不得不使用增量时间,这是因为渲染方法被频繁调用,但我不知道如何解决它...谢谢!

public class MyGame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture img;
    Sprite sprite;

    @Override
    public void create () {
        batch = new SpriteBatch();
        img = new Texture("badlogic.jpg");
        sprite = new Sprite(img);
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        batch.begin();
        sprite.draw(batch);
        batch.end();

        if (Gdx.input.isTouched()) {
            rotateRight();
        }
    }

    private void rotateRight() {
        sprite.setRotation(sprite.getRotation() - 90);
    }
}

2 个答案:

答案 0 :(得分:1)

现在,您正在轮询render方法中的输入。轮询只是检查输入的状态(是否触摸)并且不关心是否发生任何实际的“事件”。

而不是这个,您需要通过事件处理来查找输入事件,因为这将使您能够访问被触摸或未触摸的屏幕的实际事件。你可以通过实现InputProcessor来实现这一点,它可以让你访问覆盖一堆触摸事件方法,这样你就可以只在触摸事件时执行你的旋转方法。

示例:

public void update() 
{
     Gdx.input.setInputProcessor(new InputProcessor() {
        @Override
        public boolean TouchDown(int x, int y, int pointer, int button) {
            if (button == Input.Buttons.LEFT) {
                rotateRight();
                return true;
            }
            return false
        }
    });
}

不要忘记从render方法中调用update()方法。为了便于阅读,我把它放在一个单独的函数中,而不是阻塞你的渲染代码。

您也可以让您的类实现InputProcessor并覆盖您的类中的方法,这样您就不必像上面那样内联它。

答案 1 :(得分:1)

if (Gdx.input.justTouched() && Gdx.input.isTouched()) {
    rotateRight();
}