gpt4 book ai didi

java - 渲染方法扭曲声音;更新太频繁了?

转载 作者:行者123 更新时间:2023-12-03 02:09:58 27 4
gpt4 key购买 nike

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

我有一个主要的Game类(下面的代码)。该主要游戏类实现Screen并具有一个舞台。
我还有另外两个类(Dino和SpaceMonster),它们扩展了Actor。

我希望能够在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()
{
}
}

最佳答案

声音显然如此频繁地重复,因为此刻您在renderloop中正在做的是:

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

  • 请注意,您在renderloop中所做的一切通常每秒发生约60次!如果您考虑每60帧矩形与dino重叠会发出多少声声音,那通常就是这样。即使只有一个矩形重叠,也可能每秒发生60次。

    我的解决方案是,例如在dino类中创建一个 bool(boolean) 值,该值定义dino是否与矩形重叠。您可以制作类似以下内容的方法,而不是在矩形与恐龙重叠时直接播放声音:
    dino.setOverlapping(false);
    for (Rectangle spacebarRectangle : spacebar.getSpacebarRectangles()) { // section of code
    if (!dino.isOverlapping() && spacebarRectangle.overlaps(dino.getDinoRectangle())) {
    dino.setOverlapping(true);
    spacebarSound.play();
    }
    }

    因此,您只需要检查恐龙是否重叠即可(如果恐龙没有重叠),并且仅在 bool(boolean) 值从false切换为true时才播放声音。

    编辑:经过更多思考之后,一个更好的解决方案是跳过 bool(boolean) 值,然后执行以下操作:
    for (Rectangle spacebarRectangle : spacebar.getSpacebarRectangles()) {   // section of code
    if (spacebarRectangle.overlaps(dino.getDinoRectangle())) {
    spacebarSound.play();
    break;
    }
    }

    关于java - 渲染方法扭曲声音;更新太频繁了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24969395/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com