Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扭曲声音的渲染方法;更新太频繁?_Java_Audio_Libgdx_Scene2d - Fatal编程技术网

Java 扭曲声音的渲染方法;更新太频繁?

Java 扭曲声音的渲染方法;更新太频繁?,java,audio,libgdx,scene2d,Java,Audio,Libgdx,Scene2d,我正在使用libGDX和scene2D的各个方面 我有一个主要的游戏类代码如下。这个主要的游戏类实现了Screen并有一个stage。 我还有另外两个类Dino和SpaceMonster,它们扩展了Actor 我希望能够在恐龙类中的矩形和SpaceMonster类中的矩形之间存在重叠时播放一次声音 问题:无论我试着将代码中播放声音的部分放在哪里,它都会以近乎疯狂的间隔多次播放声音。我很确定这是因为我一直在将处理重叠和相应声音的代码放在每秒更新多次的方法中 问:有人能给我解释一下,我能把处理重叠部

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

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

我希望能够在恐龙类中的矩形和SpaceMonster类中的矩形之间存在重叠时播放一次声音

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

问:有人能给我解释一下,我能把处理重叠部分和相应声音的代码放在什么地方,它只会清晰地播放一次?请注意,我曾尝试在不同的场合将其放入恐龙类和太空怪兽类,但我要么在重叠发生时听不到任何声音,要么遇到与上面相同的问题,声音扭曲,因为它每秒播放多次,这取决于我将代码插入的方法

此外,如果有人能向我解释一下,通常我应该把游戏逻辑相关的代码放在一个位置,当我使用“implements Screen”时,这个位置不会经常更新,那就太好了。我在理解更新方面有点困难

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

这些声音显然经常重复,因为您目前在renderloop中所做的是:

检查每个矩形 如果矩形与恐龙重叠,播放声音 请注意,在renderloop中执行的所有操作通常每秒发生60次!如果你想一想,如果每60帧的矩形与恐龙重叠,声音会启动多少次,就会经常出现这种情况。即使只有一个矩形重叠,每秒也会发生60次

我的解决方案是,例如在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();
        }
}
所以你只需要检查恐龙是否重叠,如果他已经重叠了,你只需要在布尔值从假变为真时播放一个声音

编辑:再多想一想,更好的解决方案是跳过布尔运算,只需执行以下操作:

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

非常感谢您的详细解释。不幸的是,编辑后的第二段代码仍然产生相同的结果——声音被播放了太多次。从逻辑上讲,这一突破是有意义的,我认为它应该起作用。我还没有实现第一个代码块,等我有时间的时候会尝试一下。不过,我现在对渲染循环有了更多的了解。