我正在使用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()
{
}
}
答案 0 :(得分:0)
声音显然经常重复,因为你现在在你的渲染循环中所做的是:
请注意,您在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;
}
}