渲染方法翘曲声;经常更新?

时间:2014-07-26 09:09:33

标签: java audio libgdx scene2d

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

我有一个主要的游戏类(下面的代码)。这个主要的游戏类实现了Screen并且有一个阶段。 我还有另外两个类(Dino和SpaceMonster),它们扩展了Actor。

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

问题:无论我在哪里尝试放置播放声音的代码段,它都会以极其紧密的间隔播放多次声音。我很确定这是因为我一直把代码(处理重叠和相应的声音)放在每秒更新很多次的方法中。

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

此外,如果有人可以向我解释在我使用'实施屏幕时,我应该在哪里放置与游戏逻辑相关的代码(在一个不经常更新的位置),那就是&#39 ; d好。我在理解更新方面遇到了一些麻烦。

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() 
    { 
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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


我的解决方案是,例如在你的dino类中创建一个布尔值,它定义了dino是否与矩形重叠。当矩形与dino重叠时,你可以制作类似的东西,而不是直接播放声音:

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