java - 控制 Sprite 旋转(它疯狂地旋转)

标签 java android rotation libgdx

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

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

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

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

最佳答案

现在您正在 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
        }
    });
}

不要忘记从渲染方法中调用 update() 方法。我将它放在一个单独的函数中只是为了提高可读性而不是阻塞您的渲染代码。

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

关于java - 控制 Sprite 旋转(它疯狂地旋转),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29046024/

相关文章:

java - 来自代码本身的 Android TTS - 而非用户输入

java - IntelliJ 线程调试

android - 如何将自定义 DLS 或 SoundFonts 加载到 Android MIDI

android - 第一次从 PC 导出应用 --> Android

assembly - mips汇编代码,使用移位函数的逻辑运算

ios - 使 UIImageView 及其 UIImage 按比例缩放而无需额外填充

java - 如何在文件中保存更改后自动重启 Dropwizard 应用程序

java - JPA/Hibernate 从两个不同列的两个实体中进行选择

android - 写入 VpnService 输出流没有响应

ios - 如何在 Swift 中强制设备旋转?