【问题标题】:render method warping sound; updated too frequently?渲染方法扭曲声音;更新太频繁?
【发布时间】:2014-07-26 09:09:32
【问题描述】:

我正在使用 libGDX 和 scene2D 的各个方面。

我有一个主游戏类(下面的代码)。这个主要的游戏类实现了 Screen 并有一个舞台。 我还有两个扩展 Actor 的类(Dino 和 SpaceMonster)。

当 Dino 类中的 Rectangle 和 SpaceMonster 类中的 Rectangle 重叠时,我希望能够播放一次声音。

问题:无论我尝试将播放声音的代码部分放在哪里,它都会以非常接近的间隔多次播放声音。我很确定这是因为我一直在将代码(处理重叠和相应的声音)放入每秒更新多次的方法中。

问题:有人可以向我解释一下我可以将代码部分(处理重叠和相应的声音)放在哪里,它只会干净地播放一次吗?请注意,我已尝试将它放在 Dino 类和 SpaceMonster 类中(在不同的场合),但是当重叠发生时我听不到任何声音,或者我遇到与上面相同的问题(声音因为正在播放而扭曲每秒多次),具体取决于我将代码插入的方法。

此外,如果有人可以向我解释当我使用“实现屏幕”时我应该将游戏逻辑相关代码放在哪里(在一个不会不断更新的位置),那就太好了。我在理解更新时遇到了一些问题。

public class GameScreen implements Screen
{ 
    private Stage stage;
    private Dino dino;
    private SpaceMonster spaceMonster;
    private Sound spacebarSound;

    public GameScreen(final ScreenManager gam) 
    {        
        this.game = gam;

        stage = new Stage(new FitViewport(800, 480));
        Gdx.input.setInputProcessor(stage);

        dino = new Dino(); 
        spaceMonster = new SpaceMonster();

        stage.addActor(dino); 
        stage.addActor(spaceMonster);

        spacebarSound = Gdx.audio.newSound(Gdx.files.internal("data/spacebarSound.mp3"));
    }

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

    @Override
    public void render(float delta) 
    {
        Gdx.gl.glClearColor(0, 0, 0, 0);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();   

        for (Rectangle spacebarRectangle : spacebar.getSpacebarRectangles())    // section of code
            if (spacebarRectangle.overlaps(dino.getDinoRectangle()))
                spacebarSound.play();
    }

    @Override
    public void pause() 
    {
    }

    @Override
    public void resume() 
    {
    }

    @Override
    public void show() 
    {
    }

    @Override
    public void hide() 
    {
    }

    @Override
    public void dispose() 
    { 
    }
}

【问题讨论】:

    标签: java audio libgdx scene2d


    【解决方案1】:

    这些声音显然经常重复,因为你现在在渲染循环中所做的是:

    • 检查每个矩形
    • 如果矩形与恐龙重叠,播放声音

    请注意,您在渲染循环中所做的一切通常每秒发生大约 60 次!如果您考虑如果每 60 帧矩形与恐龙重叠,声音将启动多少次,这真的很常见。即使只有一个矩形重叠,它也会每秒发生 60 次。


    我的解决方案是,例如在你的恐龙类中创建一个布尔值,它定义恐龙是否与矩形重叠。当矩形与恐龙重叠时,不要直接播放声音,您可以这样做:

    dino.setOverlapping(false);
    for (Rectangle spacebarRectangle : spacebar.getSpacebarRectangles()) {   // section of code
            if (!dino.isOverlapping() && spacebarRectangle.overlaps(dino.getDinoRectangle())) {
                dino.setOverlapping(true);
                spacebarSound.play();
            }
    }
    

    所以你只需要检查恐龙是否重叠,如果他已经不重叠,你只会在布尔值从 false 切换到 true 时播放声音。

    编辑:经过多思考后,更好的解决方案是跳过布尔值并执行以下操作:

    for (Rectangle spacebarRectangle : spacebar.getSpacebarRectangles()) {   // section of code
            if (spacebarRectangle.overlaps(dino.getDinoRectangle())) {
                spacebarSound.play();
                break;
            }
    }
    

    【讨论】:

    • 非常感谢您的详细解释。不幸的是,编辑之后的第二段代码仍然产生了相同的结果(声音被播放了太多次。但从逻辑上讲,中断是有道理的,我认为它应该可以工作。我还没有实现第一个代码块,并且当我有时间的时候会试一试。不过我现在对渲染循环有了更多的了解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多